בדף הזה מוסבר איך להשבית את יציאת ה-kubelet הלא מאובטחת לקריאה בלבד באשכולות Google Kubernetes Engine (GKE), כדי להקטין את הסיכון לגישה לא מורשית ל-kubelet, ואיך להעביר אפליקציות ליציאה מאובטחת יותר.
באשכולות Kubernetes, כולל GKE, התהליך kubelet שפועל בצמתים משרת API לקריאה בלבד באמצעות היציאה הלא מאובטחת 10255.
Kubernetes לא מבצע בדיקות אימות או הרשאה ביציאה הזו. ה-kubelet משרת את אותן נקודות קצה ביציאה 10250 המאומתת והמאובטחת יותר.
משביתים את היציאה לקריאה בלבד של kubelet ומעבירים את כל עומסי העבודה שמשתמשים ביציאה 10255 ליציאה המאובטחת יותר 10250.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם אשכול קיים במצב Autopilot או במצב Standard. כדי ליצור אשכול חדש, אפשר לעיין במאמר בנושא יצירת אשכול Autopilot.
דרישות
- אפשר להשבית את יציאת הקריאה בלבד הלא מאובטחת של kubelet רק ב-GKE מגרסה 1.26.4-gke.500 ואילך.
בדיקה של שימוש ביציאות לא מאובטחות והעברת אפליקציות
לפני שמשביתים את היציאה הלא מאובטחת לקריאה בלבד, צריך להעביר את כל האפליקציות הפועלות שמשתמשות ביציאה הזו ליציאה המאובטחת יותר לקריאה בלבד. עומסי עבודה שאולי צריך להעביר כוללים צינורות של מדדים מותאמים אישית ועומסי עבודה שיש להם גישה לנקודות קצה של kubelet.
- עבור עומסי עבודה שזקוקים לגישה למידע שמוצג על ידי kubelet API בצומת, כמו מדדים, משתמשים ביציאה
10250. - בעומסי עבודה שמקבלים מידע על Kubernetes באמצעות ה-API של kubelet בצומת, כמו הצגת רשימה של Pods בצומת, צריך להשתמש ב-API של Kubernetes.
בודקים אם אפליקציות משתמשות ביציאה לקריאה בלבד של 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
בדיקת סטטוס היציאה באשכולות Standard
סטטוס היציאה זמין בשדה 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 לקריאה בלבד עדיין מופעלת. כדי להשבית את היציאה, מריצים את הפקודה בקטע השבתת היציאה הלא מאובטחת לקריאה בלבד באשכולות Standard קיימים.
בדיקת סטטוס היציאה במאגרי צמתים רגילים
מריצים את הפקודה הבאה:
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
מניעת שימוש ביציאות לא מאובטחות באמצעות מדיניות הארגון
אתם יכולים להשתמש בשירות מדיניות הארגון כדי לאכוף את ההשבתה של יציאת 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 באמצעות מדיניות ארגון מותאמת אישית.