במאמר הזה מוסבר איך להפעיל את התכונה Agent Sandbox באשכול Google Kubernetes Engine (GKE). בנוסף, מוסבר איך ליצור סביבת ארגז חול באשכול כדי להריץ בבטחה קוד לא מהימן.
סקירה כללית על האופן שבו התכונה Agent Sandbox מבודדת קוד לא מהימן שנוצר על ידי AI זמינה במאמר מידע על Agent Sandbox ב-GKE.
עלויות
Agent Sandbox מוצע ללא תשלום ב-GKE. התמחור של GKE חל על המשאבים שאתם יוצרים.
כדי למנוע חיובים מיותרים, חשוב להשבית את GKE או למחוק את הפרויקט אחרי שתסיימו למלא את המסמך הזה.
לפני שמתחילים
-
בדף לבחירת הפרויקט במסוף Cloud de Confiance , בוחרים פרויקט ב- Cloud de Confiance או יוצרים אותו.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
מפעילים את ממשקי ה-API של Artifact Registry ו-Google Kubernetes Engine.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים-
במסוף Cloud de Confiance , מפעילים את Cloud Shell.
- מוודאים שהאשכול פועל ב-GKE בגרסה 1.35.2-gke.1269000 ואילך.
הגדרת משתני סביבה
כדי לפשט את הפקודות שמריצים במסמך הזה, אפשר להגדיר משתני סביבה ב-Cloud Shell. ב-Cloud Shell, מריצים את הפקודות הבאות כדי להגדיר את משתני הסביבה השימושיים הבאים:
export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export LOCATION="us-central1"
export CLUSTER_VERSION="1.35.2-gke.1269000"
export NODE_POOL_NAME="agent-sandbox-pool"
export MACHINE_TYPE="e2-standard-2"
הסבר על משתני הסביבה האלה:
-
PROJECT_ID: המזהה של הפרויקט הנוכחי ב- Cloud de Confiance by S3NS . הגדרת המשתנה הזה עוזרת לוודא שכל המשאבים, כמו אשכול GKE, נוצרים בפרויקט הנכון. -
CLUSTER_NAME: השם של אשכול GKE, לדוגמהagent-sandbox-cluster. -
LOCATION: האזור שבו נוצר אשכול GKE. Cloud de Confiance by S3NS אם יוצרים אשכול במצב Autopilot, צריך להגדיר את האזור (לדוגמה,us-central1). אם יוצרים אשכול רגיל, צריך להגדיר את האזור (לדוגמה,us-central1-a). -
CLUSTER_VERSION: הגרסה של GKE שבה יפעל האשכול. כדי להשתמש בתכונה Agent Sandbox צריך גרסה 1.35.2-gke.1269000 ואילך. -
NODE_POOL_NAME: השם של מאגר הצמתים שיריץ עומסי עבודה בסביבת ארגז חול. לדוגמה,agent-sandbox-pool. המשתנה הזה נדרש רק אם יוצרים אשכול GKE Standard. -
MACHINE_TYPE: סוג המכונה של הצמתים במאגר הצמתים, לדוגמהe2-standard-2. פרטים על סדרות שונות של מכונות ואפשרויות שונות זמינים במאמר השוואה בין משפחות של מכונות ומשאבים. המשתנה הזה נדרש רק אם יוצרים אשכול GKE Standard.
הפעלת ארגז חול של סוכן
אפשר להפעיל את התכונה Agent Sandbox כשיוצרים אשכול חדש או כשמעדכנים אשכול קיים.
הפעלת ארגז חול של סוכנים כשיוצרים אשכול GKE חדש
מומלץ להשתמש באשכול Autopilot כדי ליהנות מחוויית Kubernetes מנוהלת באופן מלא. כדי לבחור את מצב הפעולה של GKE שהכי מתאים לעומסי העבודה שלכם, אפשר לעיין במאמר בחירת מצב פעולה של GKE.
טייס אוטומטי
כדי ליצור אשכול GKE Autopilot חדש עם Agent Sandbox מופעל, צריך לכלול את הדגל --enable-agent-sandbox:
gcloud beta container clusters create-auto ${CLUSTER_NAME} \
--location=${LOCATION} \
--cluster-version=${CLUSTER_VERSION} \
--enable-agent-sandbox
באשכול Autopilot, מוודאים שמשתנה הסביבה LOCATION מוגדר לאזור (לדוגמה, us-central1).
רגילה
כדי ליצור אשכול GKE Standard חדש עם Agent Sandbox מופעל, צריך ליצור את האשכול, להוסיף מאגר צמתים עם gVisor מופעל, ואז להפעיל את התכונה Agent Sandbox. כדי לחסוך בעלויות, מומלץ ליצור אשכול אזורי עם צומת יחיד לכל מאגר:
יוצרים את האשכול:
gcloud beta container clusters create ${CLUSTER_NAME} \ --location=${LOCATION} \ --num-nodes=1 \ --cluster-version=${CLUSTER_VERSION}במקרה של אשכול Standard, מוודאים שמשתנה הסביבה
LOCATIONמוגדר לאזור (לדוגמה,us-central1-a).יוצרים מאגר צמתים נפרד עם gVisor מופעל:
gcloud container node-pools create ${NODE_POOL_NAME} \ --cluster=${CLUSTER_NAME} \ --machine-type=${MACHINE_TYPE} \ --location=${LOCATION} \ --num-nodes=1 \ --image-type=cos_containerd \ --sandbox=type=gvisorהאזור
LOCATIONצריך להיות זהה לאזור שבו השתמשתם כשיצרתם את האשכול.מעדכנים את האשכול כדי להפעיל את התכונה Agent Sandbox:
gcloud beta container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-agent-sandbox
הפעלת Agent Sandbox כשמעדכנים אשכול GKE קיים
כדי להפעיל את Agent Sandbox באשכול קיים, האשכול צריך לפעול בגרסה 1.35.2-gke.1269000 ואילך.
מוודאים שמשתנה הסביבה LOCATION מוגדר לאזור או לאזור הזמין שבו נמצא האשכול הקיים.
אם אתם משתמשים באשכול GKE Standard, Agent Sandbox מסתמך על gVisor. אם באשכול Standard שלכם אין מאגר צמתים עם gVisor, אתם צריכים ליצור כזה קודם:
gcloud container node-pools create ${NODE_POOL_NAME} \ --cluster=${CLUSTER_NAME} \ --machine-type=${MACHINE_TYPE} \ --location=${LOCATION} \ --image-type=cos_containerd \ --sandbox=type=gvisorמעדכנים את האשכול כדי להפעיל את התכונה Agent Sandbox:
gcloud beta container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-agent-sandbox
אימות ההגדרה
כדי לבדוק אם התכונה Agent Sandbox מופעלת, בודקים את תיאור האשכול.
gcloud beta container clusters describe ${CLUSTER_NAME} \
--location=${LOCATION} \
--format="value(addonsConfig.agentSandboxConfig.enabled)"
אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).
אם התכונה מופעלת בהצלחה, הפקודה מחזירה True.
דרישות לפריסת ארגז חול של סוכנים
כדי לפרוס עומס עבודה, כמו Sandbox או SandboxTemplate, בהצלחה, מניפסט ה-YAML צריך לכלול הגדרות אבטחה והגדרות תצורה ספציפיות.
ב-GKE, המערכת אוכפת את הדרישות האלה באמצעות מדיניות אימות כניסה (VAP). אם לא עומדים בדרישות האלה, בקרת הכניסה דוחה את הפריסה.
הגדרה נדרשת
קובץ המניפסט של הפריסה צריך לכלול את ההגדרות הבאות:
-
runtimeClassName: gvisor: מוודא שה-Pod יפעל בארגז חול של gVisor. -
automountServiceAccountToken: false: מונע מה-Pod לטעון באופן אוטומטי את אסימון חשבון השירות שמוגדר כברירת מחדל. -
securityContext.runAsNonRoot: true: מוודא שהקונטיינר לא יפעל כמשתמש root. -
securityContext.capabilities.drop: ["ALL"]: מסיר את כל היכולות של Linux מהקונטיינר. -
resources.limits: צריך לציין מגבלות על המעבד (CPU) ועל הזיכרון כדי למנוע תרחישים פוטנציאליים של התקפת מניעת שירות (DoS). nodeSelector: חובה להגדיר טירגוט ל-sandbox.gke.io/runtime: gvisor.-
tolerations: צריך לכלול toleration ל-taintsandbox.gke.io/runtime=gvisor:NoSchedule.
הגדרה אסורה
קובץ המניפסט של הפריסה לא יכול לכלול את הרכיבים הבאים:
-
hostNetwork: true,hostPID: trueאוhostIPC: true. privileged: trueבהקשרים של אבטחת קונטיינרים.HostPathכרכים.- נוספו יכולות (
capabilities.add). - ההגדרות של
hostPort. - sysctl בהתאמה אישית.
- הנפחים הצפויים של אסימונים או אישורים של חשבונות שירות.
פריסת סביבת ארגז חול
מומלץ לפרוס סביבת ארגז חול על ידי הגדרת SandboxTemplate ולהשאיר מופעים מחוממים מראש מוכנים באמצעות SandboxWarmPool. לאחר מכן תוכלו לבקש מכונה ממאגר הצמתים החמים הזה באמצעות SandboxClaim. אפשר גם ליצור ארגז חול ישירות, אבל בגישה הזו אין תמיכה במאגרי משאבים חמים.
SandboxTemplate, SandboxWarmPool, SandboxClaim ו-Sandbox הם משאבים מותאמים אישית של Kubernetes.
מומלץ: יצירת SandboxTemplate ו-SandboxWarmPool
ה-SandboxTemplate משמש כתוכנית פעולה לשימוש חוזר. ה-SandboxWarmPool עוזר לוודא שמספר מסוים של תרמילים (Pods) מחוממים מראש תמיד פועלים ומוכנים לשימוש. השימוש במשאב המותאם אישית הזה מצמצם את זמן האחזור של ההפעלה.
כדי לפרוס סביבת ארגז חול על ידי יצירת SandboxTemplate ו-SandboxWarmPool, מבצעים את השלבים הבאים:
ב-Cloud Shell, יוצרים קובץ בשם
sandbox-template.yamlעם התוכן הבא:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxTemplate metadata: name: python-runtime-template namespace: default spec: podTemplate: metadata: labels: sandbox-type: python-runtime spec: runtimeClassName: gvisor # Required automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required nodeSelector: sandbox.gke.io/runtime: gvisor # Required tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: runtime image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 resources: requests: cpu: "250m" memory: "512Mi" limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required restartPolicy: OnFailureהחלת המניפסט
SandboxTemplate:kubectl apply -f sandbox-template.yamlיוצרים קובץ בשם
sandbox-warmpool.yamlעם התוכן הבא:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxWarmPool metadata: name: python-runtime-warmpool namespace: default labels: app: python-runtime-warmpool spec: replicas: 2 sandboxTemplateRef: # This must match the name of the SandboxTemplate. name: python-runtime-templateהחלת המניפסט
SandboxWarmPool:kubectl apply -f sandbox-warmpool.yaml
יצירת SandboxClaim
ה-SandboxClaim מבקש ארגז חול מהתבנית. מכיוון שיצרתם מאגר חם, ארגז החול שנוצר מאמץ Pod פעיל מהמאגר במקום להפעיל Pod חדש.
כדי לבקש ארגז חול מהתבנית על ידי יצירת SandboxClaim, צריך לבצע את השלבים הבאים:
יוצרים קובץ בשם
sandbox-claim.yamlעם התוכן הבא:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxClaim metadata: name: sandbox-claim namespace: default spec: sandboxTemplateRef: # This must match the name of the SandboxTemplate. name: python-runtime-templateהחלת המניפסט
SandboxClaim:kubectl apply -f sandbox-claim.yamlמוודאים שארגז החול, התביעה ומאגר הכתובות המוכנות מוכנים:
kubectl get sandboxwarmpool,sandboxclaim,sandbox,pod
חלופה: יצירת ארגז חול ישירות
אם אתם לא צריכים את זמני ההפעלה המהירים שמאפשרים מאגרי משאבים חמים, אתם יכולים לפרוס ארגז חול ישירות בלי להשתמש בתבניות.
כדי לפרוס סביבה מבודדת על ידי יצירת ארגז חול ישירות, מבצעים את השלבים הבאים:
יוצרים קובץ בשם
sandbox.yamlעם התוכן הבא:apiVersion: agents.x-k8s.io/v1alpha1 kind: Sandbox metadata: name: sandbox-example-2 spec: replicas: 1 podTemplate: metadata: labels: sandbox: sandbox-example spec: runtimeClassName: gvisor restartPolicy: Always automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required runAsUser: 1000 # Required if image defaults to root (e.g. busybox) nodeSelector: sandbox.gke.io/runtime: gvisor tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: my-container image: busybox command: ["/bin/sh", "-c"] args: ["sleep 3600000; echo 'Container finished successfully'; exit 0"] securityContext: capabilities: drop: ["ALL"] # Required allowPrivilegeEscalation: false resources: limits: cpu: "100m" memory: "128Mi" # Requiredהחלת המניפסט
Sandbox:kubectl apply -f sandbox.yamlמוודאים שארגז החול פועל:
kubectl get sandbox
השבתת ארגז החול של הסוכן
כדי להשבית את התכונה Agent Sandbox, משתמשים בפקודה gcloud beta container clusters update עם הדגל --no-enable-agent-sandbox.
gcloud beta container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--no-enable-agent-sandbox
אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).
לפנות משאבים
כדי להימנע מחיובים בחשבון Cloud de Confiance by S3NS , צריך למחוק את אשכול GKE שיצרתם.
gcloud container clusters delete $CLUSTER_NAME \
--location=${LOCATION} \
--quiet
אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).
המאמרים הבאים
- איך שומרים ומשחזרים סביבות ארגז חול של סוכנים באמצעות תמונות מצב של Pod
- מידע על הטכנולוגיה הבסיסית שמשמשת את Agent Sandbox
- מידע נוסף על אבטחה ב-GKE
- אפשר לעיין בפרויקט הקוד הפתוח Agent Sandbox ב-GitHub.
- איך משתמשים ב-Kata Containers עם Agent Sandbox Kata Containers הוא לא מוצר של Cloud de Confiance . אם תתקינו את התוכנה הזו ותשתמשו בה, תהיו אחראים לניהול ולפתרון בעיות. התמיכה של Google והסכמי רמת השירות שלה לא חלים על Kata Containers.