במדריך הזה נסביר איך לאחסן ב-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, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים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, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים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-saב-Kubernetes וחשבון שירות שלadmin-saב-Kubernetes: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יכול להיות שיעברו כמה דקות עד שה-Pods יתחילו לפעול. כדי לעקוב אחרי ההתקדמות, מריצים את הפקודה הבאה:
watch kubectl get pods -n readonly-nsכשהסטטוס של ה-Pod משתנה ל-
RUNNING, לוחצים עלCtrl+Cכדי לחזור לשורת הפקודה.
בדיקת הרשאת קריאה בלבד
פותחים מעטפת ב-Pod של
readonly-test: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
בדיקת גישת קריאה וכתיבה
פותחים מעטפת ב-Pod של
admin-test: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 שמשתמשות בadmin-saחשבון Kubernetes במרחב השמות admin-ns יכולות לכתוב גרסאות חדשות של הסוד, אבל כל קבוצות ה-Pod במרחב השמות readonly-ns שמשתמשות בreadonly-saחשבון השירות של Kubernetes יכולות רק לקרוא את הסוד.
גישה לסודות מהקוד
בקטע הזה מבצעים את הפעולות הבאות:
פריסת אפליקציה לדוגמה שקוראת את הסוד שלכם ב-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 עדיין לא פועל. מחכים כמה דקות ומנסים שוב.
גישות חלופיות
אם אתם צריכים לטעון את המידע האישי הרגיש לפודים, השתמשו בתוסף 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 Google Cloud מתוך עומסי עבודה ב-GKE
- איך מצפינים סודות בשכבת האפליקציה
- מידע נוסף על איחוד זהויות של עומסי עבודה ל-GKE
- איך מתקינים את kubectl ומגדירים גישה לאשכול
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.