בדף הזה מוסבר איך להשבית את יציאת ה-kubelet הלא מאובטחת לקריאה בלבד באשכולות Google Kubernetes Engine (GKE), כדי להקטין את הסיכון לגישה לא מורשית ל-kubelet, ואיך להעביר אפליקציות ליציאה מאובטחת יותר.
באשכולות Kubernetes, כולל GKE, התהליך kubelet שפועל בצמתים משרת API לקריאה בלבד באמצעות היציאה הלא מאובטחת 10255.
Kubernetes לא מבצעת בדיקות אימות או הרשאה ביציאה הזו. ה-kubelet משרת את אותן נקודות קצה ביציאה 10250 המאובטחת יותר והמאומתת.
משביתים את היציאה לקריאה בלבד של kubelet ומעבירים את כל עומסי העבודה שמשתמשים ביציאה 10255 לשימוש ביציאה המאובטחת יותר 10250.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם אשכול קיים במצב Autopilot או במצב Standard. כדי ליצור אשכול חדש, אפשר לעיין במאמר בנושא יצירת אשכול Autopilot.
דרישות
- אפשר להשבית את יציאת ה-kubelet הלא מאובטחת לקריאה בלבד רק ב-GKE בגרסה 1.26.4-gke.500 ואילך.
בדיקה של שימוש ביציאות לא מאובטחות והעברת אפליקציות
לפני שמשביתים את היציאה הלא מאובטחת לקריאה בלבד, צריך להעביר את כל האפליקציות הפועלות שמשתמשות ביציאה הזו ליציאה המאובטחת יותר לקריאה בלבד. עומסי עבודה שאולי צריך להעביר כוללים צינורות של מדדים מותאמים אישית ועומסי עבודה שיש להם גישה לנקודות קצה של kubelet.
- עבור עומסי עבודה שזקוקים לגישה למידע שמוצג על ידי kubelet API בצומת, כמו מדדים, צריך להשתמש ביציאה
10250. - עבור עומסי עבודה שמקבלים מידע על Kubernetes באמצעות kubelet API בצומת, כמו הצגת רשימה של Pod בצומת, צריך להשתמש ב-Kubernetes API במקום זאת.
בודקים אם אפליקציות משתמשות ביציאה לא מאובטחת לקריאה בלבד של kubelet
בקטע הזה מוסבר איך לבדוק אם נעשה שימוש לא מאובטח ביציאות באשכול.
בדיקת השימוש ביציאות במצב Autopilot
כדי לבדוק את השימוש ביציאות באשכול Autopilot, צריך לוודא שיש לכם לפחות עומס עבודה אחד שאינו DaemonSet שפועל באשכול. אם מבצעים את השלבים הבאים באשכול Autopilot ריק, יכול להיות שהתוצאות לא יהיו תקפות.
שומרים את קובץ המניפסט הבא בשם
read-only-port-metrics.yaml:# Create a namespace for the DaemonSet that checks for port usage. apiVersion: v1 kind: Namespace metadata: name: node-metrics-printer-namespace --- # Grant access to read node metrics in the cluster. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-metrics-printer-role rules: - apiGroups: - "" resources: - nodes/metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-metrics-printer-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: node-metrics-printer-role # Bind the ClusterRole to the ServiceAccount that the DaemonSet will use. subjects: - kind: ServiceAccount name: node-metrics-printer-sa namespace: node-metrics-printer-namespace --- # Create a ServiceAccount for the DaemonSet. apiVersion: v1 kind: ServiceAccount metadata: name: node-metrics-printer-sa namespace: node-metrics-printer-namespace --- apiVersion: apps/v1 kind: DaemonSet metadata: name: node-metrics-printer namespace: node-metrics-printer-namespace spec: selector: matchLabels: app: node-metrics-printer template: metadata: labels: app: node-metrics-printer spec: # Assign the ServiceAccount to the DaemonSet. serviceAccountName: node-metrics-printer-sa containers: - name: metrics-printer image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest command: ["sh", "-c"] # Call the /metrics endpoint using the insecure kubelet read-only # port. args: - 'while true; do curl -s --cacert "${CA_CERT}" -H "Authorization: Bearer $(cat ${TOKEN_FILE})" "https://${NODE_ADDRESS}:10250/metrics"|grep kubelet_http_requests_total; sleep 20; done' env: # Provide credentials and the IP address for the command. - name: CA_CERT value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - name: TOKEN_FILE value: /var/run/secrets/kubernetes.io/serviceaccount/token - name: NODE_ADDRESS valueFrom: fieldRef: fieldPath: status.hostIPקובץ המניפסט הזה:
- יוצר מרחב שמות ומגדיר תפקידים ב-RBAC כדי לאפשר קריאת מדדים של צמתים.
- פורס DaemonSet שבודק את מדדי ה-kubelet של יציאת קריאה בלבד לא מאובטחת.
פורסים את המניפסט:
kubectl create -f read-only-port-metrics.yamlבודקים את היומנים של DaemonSet:
kubectl logs --namespace=node-metrics-printer-namespace \ --all-containers --prefix \ --selector=app=node-metrics-printerאם הפלט כולל תוצאות שמכילות את המחרוזת
server_type=readonly, סימן שאפליקציה משתמשת ביציאה לא מאובטחת לקריאה בלבד.
בדיקת השימוש ביציאות במצב רגיל
מריצים את הפקודה הבאה לפחות בצומת אחד בכל מאגר צמתים באשכול:
kubectl get --raw /api/v1/nodes/NODE_NAME/proxy/metrics | grep http_requests_total | grep readonly
מחליפים את NODE_NAME בשם הצומת.
אם הפלט מכיל רשומות עם המחרוזת server_type="readonly", יכולים להתרחש התרחישים הבאים:
- עומסי העבודה בצומת משתמשים ביציאה לקריאה בלבד של kubelet, שהיא לא מאובטחת.
- אחרי השבתת היציאה הלא מאובטחת, הפקודה עדיין מחזירה את המחרוזת
server_type="readonly". הסיבה לכך היא שהמדדkubelet_http_requests_totalמייצג את המספר המצטבר של בקשות HTTP שהתקבלו על ידי שרת kubelet מאז ההפעלה האחרונה שלו מחדש. המספר הזה לא מאופס כשמשביתים את היציאה הלא מאובטחת. המספר הזה מתאפס אחרי ש-GKE מפעיל מחדש את שרת kubelet, למשל במהלך שדרוג של צומת. מידע נוסף זמין במאמר Kubernetes Metrics Reference.
אם הפלט ריק, אף עומס עבודה בצומת הזה לא משתמש ביציאה לא מאובטחת לקריאה בלבד.
זיהוי עומסי העבודה שמשתמשים ביציאה לקריאה בלבד של kubelet שהיא לא מאובטחת
כדי לזהות את עומסי העבודה שמשתמשים ביציאה לא מאובטחת, בודקים את קובצי ההגדרות של עומס העבודה, כמו ConfigMaps ו-Pods.
מריצים את הפקודות הבאות:
kubectl get pods --all-namespaces -o yaml | grep 10255
kubectl get configmaps --all-namespaces -o yaml | grep 10255
אם הפלט של הפקודה לא ריק, משתמשים בסקריפט הבא כדי לזהות את השמות של ה-ConfigMaps או ה-Pods שמשתמשים ביציאה לא מאובטחת:
# This function checks if a Kubernetes resource is using the insecure port 10255.
#
# Arguments:
# $1 - Resource type (e.g., pod, configmap, )
# $2 - Resource name
# $3 - Namespace
#
# Output:
# Prints a message indicating whether the resource is using the insecure port.
isUsingInsecurePort() {
resource_type=$1
resource_name=$2
namespace=$3
config=$(kubectl get $resource_type $resource_name -n $namespace -o yaml)
# Check if kubectl output is empty
if [[ -z "$config" ]]; then
echo "No configuration file detected for $resource_type: $resource_name (Namespace: $namespace)"
return
fi
if echo "$config" | grep -q "10255"; then
echo "Warning: The configuration file ($resource_type: $namespace/$resource_name) is using insecure port 10255. It is recommended to migrate to port 10250 for enhanced security."
else
echo "Info: The configuration file ($resource_type: $namespace/$resource_name) is not using insecure port 10255."
fi
}
# Get the list of ConfigMaps with their namespaces
configmaps=$(kubectl get configmaps -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | tail -n +2 | awk '{print $1"/"$2}')
# Iterate over each ConfigMap
for configmap in $configmaps; do
namespace=$(echo $configmap | cut -d/ -f1)
configmap_name=$(echo $configmap | cut -d/ -f2)
isUsingInsecurePort "configmap" "$configmap_name" "$namespace"
done
# Get the list of Pods with their namespaces
pods=$(kubectl get pods -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | tail -n +2 | awk '{print $1"/"$2}')
# Iterate over each Pod
for pod in $pods; do
namespace=$(echo $pod | cut -d/ -f1)
pod_name=$(echo $pod | cut -d/ -f2)
isUsingInsecurePort "pod" "$pod_name" "$namespace"
done
אחרי שמזהים את עומסי העבודה הרלוונטיים, מעבירים אותם לשימוש ביציאה המאובטחת 10250. כדי לעשות זאת, צריך לבצע את השלבים שמפורטים בקטע הבא.
העברה מיציאה לא מאובטחת לקריאה בלבד של kubelet
בדרך כלל, העברת אפליקציה ליציאה מאובטחת כוללת את השלבים הבאים:
צריך לעדכן כתובות URL או נקודות קצה שמפנות ליציאה לא מאובטחת לקריאה בלבד, כך שיפנו ליציאה מאובטחת לקריאה בלבד. לדוגמה, שינוי של
http://203.0.113.104:10255ל-http://203.0.113.104:10250.מגדירים את אישור רשות האישורים (CA) של לקוח ה-HTTP לאישור ה-CA של האשכול. כדי למצוא את האישור הזה, מריצים את הפקודה הבאה:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(masterAuth.clusterCaCertificate)"מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
LOCATION: המיקום של האשכול.
-
כדי לגשת למשאבים ספציפיים ביציאה המאומתת 10250, צריך להקצות לנושא תפקידים מתאימים ב-RBAC. פרטים נוספים זמינים במאמר בנושא הרשאה של kubelet במסמכי התיעוד של Kubernetes.
אם עומס העבודה משתמש בנקודת הקצה /pods ביציאה לקריאה בלבד של kubelet לא מאובטח, צריך להעניק את הרשאת RBAC nodes/proxy כדי לגשת לנקודת הקצה ביציאה המאובטחת של kubelet. nodes/proxy היא הרשאה חזקה שאי אפשר להעניק באשכולות GKE Autopilot, ולא מומלץ להעניק באשכולות GKE Standard. במקום זאת, אפשר להשתמש ב-Kubernetes API עם fieldSelector לשם הצומת.
אם אתם משתמשים באפליקציות של צד שלישי שמסתמכות על יציאת kubelet לקריאה בלבד ולא מאובטחת, צריך לבדוק עם ספק האפליקציה איך להעביר אותה ליציאה מאובטחת 10250.
דוגמה להעברה
נניח שיש לכם Pod ששולח שאילתות למדדים מהיציאה לקריאה בלבד של kubelet, שהיא לא מאובטחת.
apiVersion: v1
kind: Pod
metadata:
name: kubelet-readonly-example
spec:
restartPolicy: Never
containers:
- name: kubelet-readonly-example
image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest
command:
- curl
- http://${NODE_ADDRESS}:10255/metrics
env:
- name: NODE_ADDRESS
valueFrom:
fieldRef:
fieldPath: status.hostIP
האפליקציה הזו מבצעת את הפעולות הבאות:
- משתמש ב-
defaultServiceAccount במרחב השמותdefault - מריצה את הפקודה
curlמול נקודת הקצה/metricsבצומת.
כדי לעדכן את ה-Pod הזה לשימוש ביציאה המאובטחת 10250, פועלים לפי השלבים הבאים:
יוצרים ClusterRole עם גישה לקבלת מדדי צמתים:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: curl-authenticated-role rules: # Grant access to read node metrics in the cluster. - apiGroups: - "" resources: - nodes/metrics verbs: - getמקשרים את ClusterRole לזהות של האפליקציה:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: curl-authenticated-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: curl-authenticated-role # Bind the ClusterRole to the default ServiceAccount in the default # namespace. subjects: - kind: ServiceAccount name: default namespace: defaultמעדכנים את הפקודה
curlכדי להשתמש בנקודת הקצה של היציאה המאובטחת עם כותרות ההרשאה המתאימות:apiVersion: v1 kind: Pod metadata: name: kubelet-authenticated-example spec: restartPolicy: Never containers: - name: kubelet-readonly-example image: us-docker.pkg.dev/cloud-builders/ga/v1/curl:latest env: - name: NODE_ADDRESS valueFrom: fieldRef: fieldPath: status.hostIP # Update the command to send a request with the ServiceAccount # credentials in the header. command: - sh - -c - 'curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://${NODE_ADDRESS}:10250/metrics'
שינוי כללי חומת האש ב-VPC
אם מעדכנים עומסי עבודה לשימוש ביציאה 10250, צריך ליצור כללי חומת אש כדי שה-Pods באשכול יוכלו להגיע ליציאה בטווח כתובות ה-IP של הצומת. כללי חומת האש צריכים לבצע את הפעולות הבאות:
- אפשר תנועה נכנסת ליציאת TCP
10250בטווח כתובות ה-IP של הצומת מטווח כתובות ה-IP של הפוד הפנימי - חסימת תנועה נכנסת ליציאת TCP
10250בטווח כתובות ה-IP של הצומת מהאינטרנט הציבורי.
אתם יכולים להשתמש בכללי ברירת המחדל של חומת האש ב-GKE הבאים כתבנית לפרמטרים שצריך לציין בכללים החדשים:
gke-[cluster-name]-[cluster-hash]-inkubeletgke-[cluster-name]-[cluster-hash]-exkubelet
השבתה של יציאת קריאה בלבד לא מאובטחת באשכולות של Autopilot
אפשר להשבית את היציאה הלא מאובטחת לקריאה בלבד של kubelet באשכולות חדשים וקיימים של Autopilot.
כדי להשבית את יציאת ה-kubelet הלא מאובטחת לקריאה בלבד באשכול Autopilot, משתמשים בדגל --no-autoprovisioning-enable-insecure-kubelet-readonly-port, כמו בפקודה הבאה. כל הצמתים החדשים והקיימים באשכול מפסיקים להשתמש ביציאה.
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--no-autoprovisioning-enable-insecure-kubelet-readonly-port
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול הקיים. -
LOCATION: המיקום של האשכול הקיים.
אפשר גם להשתמש בדגל --no-autoprovisioning-enable-insecure-kubelet-readonly-port כשיוצרים אשכול חדש באמצעות הפקודה gcloud container clusters create-auto.
השבתה של יציאה לא מאובטחת לקריאה בלבד באשכולות רגילים
אפשר להשבית את יציאת ה-kubelet לקריאה בלבד שאינה מאובטחת עבור כל האשכולות הרגילים או עבור מאגרי צמתים ספציפיים. מומלץ להשבית את היציאה לכל האשכול.
אם אתם משתמשים בהקצאת משאבים אוטומטית של צמתים, מאגרי צמתים שהוקצו אוטומטית מקבלים בירושה את הגדרת היציאה שציינתם ברמת האשכול. אפשר גם לציין הגדרה שונה למאגרי צמתים שהוקצו אוטומטית, אבל מומלץ להשבית את היציאה בכל הצמתים באשכול.
אפשר גם להשתמש בקובץ תצורה של מערכת הצמתים כדי להשבית באופן הצהרתי את יציאת ה-kubelet לקריאה בלבד שאינה מאובטחת. אם משתמשים בקובץ הזה, אי אפשר להשתמש בפקודות שבקטעים הבאים כדי לשלוט בהגדרת ה-kubelet.
השבתה של יציאת קריאה בלבד לא מאובטחת באשכולות קיימים מסוג Standard
כדי להשבית את יציאת ה-kubelet הלא מאובטחת לקריאה בלבד באשכול קיים במסלול הרגיל, משתמשים בדגל --no-enable-insecure-kubelet-readonly-port כמו בפקודה הבאה. מאגרי צמתים חדשים לא ישתמשו ביציאה לא מאובטחת.
GKE לא מעדכן באופן אוטומטי מאגרי צמתים קיימים.
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--no-enable-insecure-kubelet-readonly-port
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של אשכול Standard קיים. -
LOCATION: המיקום של אשכול Standard קיים.
אפשר גם להשתמש בדגל --no-autoprovisioning-enable-insecure-kubelet-readonly-port כשיוצרים אשכול חדש באמצעות הפקודה gcloud container clusters create.
השבתת יציאת קריאה בלבד לא מאובטחת במאגרי צמתים רגילים
מומלץ להגדיר את יציאת הקריאה בלבד ברמת האשכול בכל המקרים. אם השבתתם את היציאה לקריאה בלבד באשכול קיים שכבר היו בו מאגרי צמתים פעילים, אתם צריכים להשתמש בפקודה הבאה כדי להשבית את היציאה במאגרי הצמתים האלה.
gcloud container node-pools update NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--no-enable-insecure-kubelet-readonly-port
מחליפים את מה שכתוב בשדות הבאים:
-
NODE_POOL_NAME: השם של מאגר הצמתים. -
CLUSTER_NAME: שם האשכול. -
LOCATION: המיקום של האשכול.
אימות שהיציאה מושבתת
כדי לוודא שהיציאה לקריאה בלבד של kubelet לא מאובטחת מושבתת, מתארים את משאב GKE.
בדיקת סטטוס היציאה באשכולות של Autopilot
מריצים את הפקודה הבאה:
gcloud container clusters describe CLUSTER_NAME \
--location=LOCATION \
--flatten=nodePoolAutoConfig \
--format="value(nodeKubeletConfig)"
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של אשכול Autopilot. -
LOCATION: המיקום של אשכול Autopilot.
אם היציאה מושבתת, הפלט הוא:
insecureKubeletReadonlyPortEnabled: false
בדיקת סטטוס הניוד באשכולות רגילים
סטטוס היציאה זמין בשדה nodePoolDefaults.nodeConfigDefaults.nodeKubeletConfig כשמתארים את האשכול באמצעות GKE API.
בקטגוריית Standard clusters, יופיע גם השדה nodeConfig שבו מוגדר ערך לסטטוס של יציאת kubelet לקריאה בלבד. השדה nodeConfig הוצא משימוש והוא רלוונטי רק למאגר הצמתים שמוגדר כברירת מחדל ש-GKE יוצר כשיוצרים אשכול חדש במצב Standard. הסטטוס של היציאה בשדה nodeConfig שהוצא משימוש לא חל על מאגרי צמתים אחרים באשכול.
מריצים את הפקודה הבאה:
gcloud container clusters describe CLUSTER_NAME \
--location=LOCATION \
--flatten=nodePoolDefaults.nodeConfigDefaults \
--format="value(nodeKubeletConfig)"
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של אשכול Standard. -
LOCATION: המיקום של אשכול Standard.
אם היציאה מושבתת, הפלט הוא:
insecureKubeletReadonlyPortEnabled: false
אם הפלט של הפקודה הזו ריק, יכול להיות שהיציאה הלא מאובטחת kubelet לקריאה בלבד עדיין מופעלת. כדי להשבית את היציאה, מריצים את הפקודה שבקטע השבתת יציאת קריאה בלבד לא מאובטחת באשכולות רגילים קיימים.
בדיקת סטטוס היציאה במאגרי צמתים רגילים
מריצים את הפקודה הבאה:
gcloud container node-pools describe NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--flatten=config \
--format="value(kubeletConfig)"
מחליפים את מה שכתוב בשדות הבאים:
-
NODE_POOL_NAME: השם של מאגר הצמתים. -
CLUSTER_NAME: שם האשכול. -
LOCATION: המיקום של האשכול.
אם היציאה מושבתת, הפלט הוא:
insecureKubeletReadonlyPortEnabled: false
מניעת שימוש ביציאות לא מאובטחות באמצעות מדיניות הארגון
אתם יכולים להשתמש בשירות Organization Policy כדי לאכוף את ההשבתה של יציאת kubelet לקריאה בלבד ולא מאובטחת באשכולות בארגון, בתיקייה או בפרויקט. כדי לאכוף את הדרישה הזו, יוצרים אילוץ בהתאמה אישית, ואז מפנים לאילוץ הזה במדיניות הארגון. כדי לדחות פעולות של יצירה או עדכון כשמופעל יציאה לקריאה בלבד לא מאובטחת kubelet, אפשר להיעזר בדוגמאות הבאות:
ההגבלה המותאמת אישית הבאה דוחה פעולות של יצירה או עדכון של אשכול אם מופעל יציאת הקריאה בלבד הלא מאובטחת
kubelet:name: organizations/ORGANIZATION_ID/customConstraints/custom.disableClusterInsecureKubeletReadOnlyPort resourceTypes: - container.googleapis.com/Cluster methodTypes: - CREATE - UPDATE condition: "resource.NodeKubeletConfig.insecureKubeletReadonlyPortEnabled == true || resource.AutoprovisioningNodePoolDefaults.insecureKubeletReadonlyPortEnabled == true || resource.NodePoolAutoConfig.NodeKubeletConfig.insecureKubeletReadonlyPortEnabled == true" actionType: DENY displayName: Disable insecure kubelet read-only port description: All new and existing clusters must disable the insecure kubelet read-only port.מחליפים את
ORGANIZATION_IDבמזהה הארגון.האילוץ המותאם אישית הבא דוחה פעולות של יצירה או עדכון של מאגר צמתים אם מופעל יציאת הקריאה בלבד הלא מאובטחת
kubelet:name: organizations/ORGANIZATION_ID/customConstraints/custom.disableNodePoolInsecureKubeletReadOnlyPort resourceTypes: - container.googleapis.com/NodePool methodTypes: - CREATE - UPDATE condition: "resource.NodeConfig.NodeKubeletConfig.insecureKubeletReadonlyPortEnabled == true" actionType: DENY displayName: Disable insecure kubelet read-only port description: All new and existing node pools must disable the insecure kubelet read-only port.מחליפים את
ORGANIZATION_IDבמזהה הארגון.
מידע נוסף על יצירת אילוץ בהתאמה אישית ועל אכיפת האילוץ במדיניות הארגון זמין במאמר הגבלת פעולות במשאבי GKE באמצעות מדיניות ארגון בהתאמה אישית.