במדריך הזה נסביר איך לאחסן ב-Secret Manager את הנתונים הרגישים שמשמשים את אשכולות Google Kubernetes Engine (GKE). במאמר הזה מוסבר איך לגשת לנתונים מה-Pods בצורה מאובטחת יותר באמצעות איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE וספריות הלקוחGoogle Cloud .
אחסון הנתונים הרגישים מחוץ לאחסון של האשכול מפחית את הסיכון לגישה לא מורשית לנתונים במקרה של מתקפה. שימוש באיחוד שירותי אימות הזהות של עומסי עבודה ב-GKE כדי לגשת לנתונים מאפשר לכם להימנע מהסיכונים שקשורים לניהול מפתחות של חשבונות שירות לטווח ארוך, ולשלוט בגישה לסודות באמצעות ניהול זהויות והרשאות גישה (IAM) במקום באמצעות כללי בקרת גישה שמבוססת על תפקידים (RBAC) באשכול. אתם יכולים להשתמש בכל ספק חיצוני של מאגר סודות, כמו Secret Manager או HashiCorp Vault.
הדף הזה מיועד למומחי אבטחה שרוצים להעביר מידע אישי רגיש מאחסון בתוך האשכול. כדי לקבל מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם ב Google Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשים ב-GKE ומשימות.
במדריך הזה משתמשים באשכול GKE Autopilot. כדי לבצע את השלבים באמצעות GKE Standard, צריך להפעיל ידנית את איחוד הזהויות של עומסי עבודה ל-GKE.
אתם יכולים להשתמש ב-איחוד זהויות של עומסי עבודה ל-GKE כדי לגשת לכל Google Cloud API מעומסי עבודה של GKE בלי להשתמש בשיטות פחות מאובטחות כמו קובצי מפתחות סטטיים של חשבונות שירות. במדריך הזה נעשה שימוש ב-Secret Manager כדוגמה, אבל אפשר להשתמש באותם שלבים כדי לגשת לממשקי API אחרים. Google Cloudמידע נוסף זמין במאמר איחוד זהויות של עומסי עבודה ל-GKE.
מטרות
- יוצרים סוד ב- Google Cloud Secret Manager.
- יוצרים אשכול GKE Autopilot, מרחבי שמות של Kubernetes וחשבונות שירות של Kubernetes.
- יוצרים מדיניות הרשאות ב-IAM כדי להעניק גישה לחשבונות השירות של Kubernetes בסוד.
- משתמשים באפליקציות לבדיקה כדי לאמת את הגישה לחשבון השירות.
- מריצים אפליקציה לדוגמה שגשת לסוד באמצעות Secret Manager API.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Kubernetes Engine ו-Secret Manager:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
secretmanager.googleapis.com -
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API של Kubernetes Engine ו-Secret Manager:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
secretmanager.googleapis.com -
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/secretmanager.admin, roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה,myemail@example.com. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
-
הכנת הסביבה
משכפלים את מאגר GitHub שמכיל את קובצי הדוגמה של המדריך הזה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd ~/kubernetes-engine-samples/security/wi-secrets
יצירת סוד ב-Secret Manager
בדוגמה הבאה מוצגים הנתונים שבהם תשתמשו כדי ליצור סוד:
יוצרים סוד כדי לאחסן את הנתונים לדוגמה:
gcloud secrets create bq-readonly-key \ --data-file=manifests/bq-readonly-key \ --ttl=3600sהפקודה הזו מבצעת את הפעולות הבאות:
- יוצרת סוד חדש ב-Secret Manager עם מפתח לדוגמה באזור
us-central1Google Cloud . - הגדרת תפוגה של הסוד שעה אחרי שמריצים את הפקודה.
- יוצרת סוד חדש ב-Secret Manager עם מפתח לדוגמה באזור
יצירת האשכול ומשאבי Kubernetes
יוצרים אשכול GKE, מרחבי שמות של Kubernetes וחשבונות שירות של Kubernetes. יוצרים שני מרחבי שמות, אחד עם הרשאת קריאה בלבד ואחד עם הרשאת קריאה וכתיבה לסוד. בנוסף, אתם יוצרים חשבון שירות של Kubernetes בכל מרחב שמות לשימוש עם איחוד זהויות של עומסי עבודה ל-GKE.
יוצרים אשכול GKE Autopilot:
gcloud container clusters create-auto secret-cluster \ --location=us-central1יכול להיות שיחלפו כחמש דקות עד שהאשכול ייפרס. במצב Autopilot, איחוד זהויות של עומסי עבודה ל-GKE תמיד מופעל. אם רוצים להשתמש באשכול GKE Standard, צריך להפעיל ידנית את איחוד הזהויות של עומסי עבודה ל-GKE לפני שממשיכים.
יוצרים מרחב שמות
readonly-nsומרחב שמותadmin-ns:kubectl create namespace readonly-ns kubectl create namespace admin-nsיוצרים חשבון שירות של
readonly-saKubernetes וחשבון שירות שלadmin-saKubernetes:kubectl create serviceaccount readonly-sa --namespace=readonly-ns kubectl create serviceaccount admin-sa --namespace=admin-ns
יצירת כללי מדיניות הרשאה ב-IAM
מעניקים לחשבון השירות
readonly-saהרשאת קריאה בלבד לסוד:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/readonly-ns/sa/readonly-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=Noneמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_NUMBER: מספר הפרויקט Google Cloud. -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
-
נותנים לחשבון השירות
admin-saהרשאת קריאה וכתיבה לסוד:gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretAccessor' \ --condition=None gcloud secrets add-iam-policy-binding bq-readonly-key \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/admin-ns/sa/admin-sa \ --role='roles/secretmanager.secretVersionAdder' \ --condition=None
אימות גישה סודית
פורסים Pods לבדיקה בכל מרחב שמות כדי לאמת את הגישה לקריאה בלבד ואת הגישה לקריאה וכתיבה.
בודקים את מניפסט ה-Pod לקריאה בלבד:
ה-Pod הזה משתמש בחשבון השירות
readonly-saבמרחב השמותreadonly-ns.בודקים את מניפסט ה-Pod לקריאה וכתיבה:
ה-Pod הזה משתמש בחשבון השירות
admin-saבמרחב השמותadmin-ns.פורסים את ה-Pods של הבדיקה:
kubectl apply -f manifests/admin-pod.yaml kubectl apply -f manifests/readonly-pod.yamlיכול להיות שיעברו כמה דקות עד שהפודים יתחילו לפעול. כדי לעקוב אחרי ההתקדמות, מריצים את הפקודה הבאה:
watch kubectl get pods -n readonly-nsכשהסטטוס של ה-Pod משתנה ל-
RUNNING, לוחצים עלCtrl+Cכדי לחזור לשורת הפקודה.
בדיקת גישה לקריאה בלבד
פותחים מעטפת ב-
readonly-testPod:kubectl exec -it readonly-test --namespace=readonly-ns -- /bin/bashנסו לקרוא את הסוד:
gcloud secrets versions access 1 --secret=bq-readonly-keyהפלט הוא
key=my-api-key.מנסים לכתוב נתונים חדשים לסוד:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-הפלט אמור להיראות כך:
ERROR: (gcloud.secrets.versions.add) PERMISSION_DENIED: Permission 'secretmanager.versions.add' denied for resource 'projects/PROJECT_ID/secrets/bq-readonly-key' (or it may not exist).ה-Pod שמשתמש בחשבון השירות לקריאה בלבד יכול רק לקרוא את הסוד, ולא יכול לכתוב נתונים חדשים.
יציאה מהתרמיל:
exit
בדיקת גישת קריאה וכתיבה
פותחים מעטפת ב-
admin-testPod:kubectl exec -it admin-test --namespace=admin-ns -- /bin/bashנסו לקרוא את הסוד:
gcloud secrets versions access 1 --secret=bq-readonly-keyהפלט הוא
key=my-api-key.מנסים לכתוב נתונים חדשים לסוד:
printf "my-second-api-key" | gcloud secrets versions add bq-readonly-key --data-file=-הפלט אמור להיראות כך:
Created version [2] of the secret [bq-readonly-key].קוראים את הגרסה החדשה של הסוד:
gcloud secrets versions access 2 --secret=bq-readonly-keyהפלט הוא
my-second-api-key.יציאה מהתרמיל:
exit
לקבוצות ה-Pod יש רק את רמת הגישה שהענקתם לחשבון השירות של Kubernetes שמשמש במניפסט של ה-Pod. כל קבוצות ה-Pod שמשתמשות בחשבון Kubernetes במרחב השמות admin-ns יכולות לכתוב גרסאות חדשות של הסוד, אבל כל קבוצות ה-Pod במרחב השמות readonly-ns שמשתמשות בחשבון השירות של Kubernetes readonly-sa יכולות רק לקרוא את הסוד.admin-sa
גישה לסודות מהקוד
בקטע הזה תבצעו את הפעולות הבאות:
פריסת אפליקציה לדוגמה שקוראת את הסוד שלכם ב-Secret Manager באמצעות ספריות לקוח.
בודקים שהאפליקציה יכולה לגשת לסוד.
כדאי לגשת לסודות של Secret Manager מקוד האפליקציה שלכם באמצעות Secret Manager API, כשזה אפשרי.
בודקים את קוד המקור של האפליקציה לדוגמה:
האפליקציה הזו קוראת ל-Secret Manager API כדי לנסות לקרוא את הסוד.
בודקים את קובץ המניפסט של ה-Pod של האפליקציה לדוגמה:
קובץ המניפסט הזה:
- יוצר Pod במרחב השמות
readonly-nsשמשתמש בחשבון השירותreadonly-sa. - שליפת אפליקציה לדוגמה ממאגר תמונות של Google. האפליקציה הזו קוראת ל-Secret Manager API באמצעותGoogle Cloud ספריות הלקוח. אפשר לראות את קוד האפליקציה
ב-
/main.goבמאגר. - מגדיר משתני סביבה לשימוש באפליקציה לדוגמה.
- יוצר Pod במרחב השמות
מחליפים את משתני הסביבה באפליקציה לדוגמה:
sed -i "s/YOUR_PROJECT_ID/PROJECT_ID/g" "manifests/secret-app.yaml"מפעילים את האפליקציה לדוגמה:
kubectl apply -f manifests/secret-app.yamlיכול להיות שיעברו כמה דקות עד שה-Pod יתחיל לפעול. אם ל-Pod נדרש צומת חדש באשכול, יכול להיות שתבחינו באירועים מסוג
CrashLoopBackOffבזמן ש-GKE מקצה את הצומת. הקריסות מפסיקות כשהצומת מוקצה בהצלחה.מאמתים את הגישה הסודית:
kubectl logs readonly-secret-test -n readonly-nsהפלט הוא
my-second-api-key. אם הפלט ריק, יכול להיות שה-Pod עדיין לא פועל. מחכים כמה דקות ומנסים שוב.
גישות חלופיות
אם אתם צריכים להוסיף את הנתונים הרגישים שלכם ל-Pods, אתם יכולים להשתמש בתוסף Secret Manager ל-GKE. התוסף הזה פורס ומנהל את ספק Google Cloud Secret Manager עבור מנהל ההתקן של Kubernetes Secret Store CSI באשכולות GKE. הוראות מפורטות במאמר שימוש בתוסף Secret Manager עם GKE.
יש סיכונים בשימוש בסודות כנפחים מוצמדים:
- כרכים שמוצמדים חשופים להתקפות של מעבר בין ספריות.
- יכול להיות שמשתני הסביבה ייפגעו בגלל הגדרות שגויות, למשל פתיחת נקודת קצה לניפוי באגים.
מומלץ לגשת לסודות באופן פרוגרמטי דרך Secret Manager API, בכל מקום שבו הדבר אפשרי. הוראות מופיעות באפליקציית הדוגמה במדריך הזה או במאמר ספריות הלקוח של Secret Manager.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת משאבים בודדים
מחיקת האשכול:
gcloud container clusters delete secret-cluster \ --location=us-central1אופציונלי: מוחקים את הסוד ב-Secret Manager:
gcloud secrets delete bq-readonly-keyאם לא תבצעו את השלב הזה, הסוד יפוג אוטומטית כי הגדרתם את הדגל
--ttlבמהלך היצירה.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
המאמרים הבאים
- איך מאמתים בממשקי API מעומסי עבודה ב-GKE Google Cloud
- איך מצפינים סודות בשכבת האפליקציה
- מידע נוסף על איחוד זהויות של עומסי עבודה ל-GKE
- איך מתקינים את kubectl ומגדירים גישה לאשכול
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.