במאמר הזה נסביר איך להצפין נתונים שמאוחסנים במישור הבקרה של Google Kubernetes Engine (GKE) באמצעות מפתחות שמנוהלים ב-Cloud Key Management Service (Cloud KMS). כדאי שתכירו כבר מושגים כמו etcd, ארכיטקטורת אשכול GKE ו-Cloud KMS.
בדף הזה מתואר חלק אחד מתוך קבוצה של תכונות אופציונליות של מישור הבקרה ב-GKE, שמאפשרות לבצע משימות כמו אימות של מצב האבטחה של מישור הבקרה או הגדרת הצפנה וחתימה על אישורים במישור הבקרה באמצעות מפתחות שאתם מנהלים. פרטים נוספים זמינים במאמר מידע על הרשאות במישור הבקרה של GKE.
כברירת מחדל, Cloud de Confiance מחיל אמצעי אבטחה שונים על מישור הבקרה המנוהל. בדף הזה מתוארות יכולות אופציונליות שמאפשרות לכם לקבל יותר שקיפות או שליטה במישור הבקרה של GKE.
מידע על דיסק האתחול של מישור הבקרה והצפנת etcd
כברירת מחדל, ב-GKE מוצפן דיסק האתחול של צומת מישור הבקרה, הדיסק שמאחסן נתונים ב-etcd והגיבוי התפעולי הפנימי של etcd באמצעות מפתחות הצפנה שמנוהלים על ידי GKE. Cloud de Confiance by S3NS Cloud de Confianceפרטים על הצפנת ברירת המחדל הזו זמינים במאמר ברירת המחדל של הצפנה במנוחה. אתם יכולים גם להשתמש במפתחות הצפנה משלכם שאתם מנהלים באמצעות Cloud KMS כדי להצפין את המשאבים האלה. מידע נוסף זמין במאמר דיסק האתחול של מישור הבקרה והצפנת etcd.
אתם יוצרים מפתחות ב-Cloud KMS ש-GKE משתמש בהם כדי להצפין את משאבי מישור הבקרה. כשיוצרים את המשאבים האלה, כדאי להביא בחשבון את הנקודות הבאות:
- אפשר להשתמש באוסף מפתחות אחד לכל המפתחות באשכול, בלי קשר למטרה של כל מפתח. אם יש לכם אוסף מפתחות קיים שבו השתמשתם למטרה אחרת, כמו הגדרת רשויות אישורים משלכם, אתם יכולים להשתמש באוסף המפתחות הזה במדריך הזה.
- כדאי ליצור את המפתחות באותו Cloud de Confiance המיקום שבו נמצא האשכול כדי לשפר את זמן האחזור.
- ברוב תרחישי השימוש, אפשר להשתמש ברמת ההגנה של מפתח Cloud KMS מסוג תוכנה. אפשר גם להשתמש במפתחות חומרה עם Cloud HSM.
- חובה לציין את הדגל
--purposeעם הערךencryptionכי המפתחות האלה משמשים להצפנה סימטרית. - אסור לשנות את משך ברירת המחדל של השמדת המפתח.
שימוש בתכונות אחרות של שליטה במישור הבקרה של GKE
השליטה במישור הבקרה של GKE מספקת את התכונות הבאות שקשורות למפתחות בניהול עצמי, שצריך להפעיל אותן בו-זמנית כשיוצרים אשכול:
- הצפנה של רכיבי מישור הבקרה (המסמך הזה)
- הפעלת רשויות אישורים (CA) ומפתחות משלכם
אפשר להפעיל את התכונות האלה רק כשיוצרים אשכול GKE חדש. אי אפשר לעדכן קלאסטרים קיימים כדי להשתמש בתכונות האלה. כדי להשתמש בשתי התכונות באותו אשכול, צריך לבצע את כל ההליכים להגדרת המפתח וה-CA שמפורטים בשני המדריכים, ואז להריץ את הפקודה ליצירת האשכול שמפעילה את שני סוגי התכונות, כמו שמתואר בקטע יצירת אשכול.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שבפרויקט המפתח יש אוסף מפתחות של Cloud KMS עבור האשכול. אפשר להשתמש בכל אוסף מפתחות קיים במיקום של האשכול. כדי ליצור אוסף מפתחות חדש, אפשר לעיין במאמר בנושא יצירה של אוסף מפתחות.
מפעילים את Cloud Key Management Service API.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של שימוש בשירות' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים
זיהוי פרויקטים
מומלץ להשתמש ב Cloud de Confiance פרויקטים נפרדים באופן הבא:
- פרויקט מפתח: מכיל את כל המפתחות.
- פרויקט האשכול: מכיל את אשכולות GKE.
אפשר להשתמש באותו פרויקט גם למפתחות וגם לאשכולות GKE, אבל מומלץ להשתמש בפרויקטים נפרדים כדי שהצוותים שמנהלים את המפתחות והפעולות הקריפטוגרפיות יהיו נפרדים מהצוותים שמנהלים את האשכולות.
תפקידים והרשאות נדרשים
כדי לקבל את ההרשאות שדרושות להרצת מפתחות הצפנה משלכם, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
-
יצירת מפתחות Cloud KMS:
Cloud KMS Admin (
roles/cloudkms.admin) בפרויקט המפתחות -
יצירת אשכולות GKE:
אדמין אשכול Kubernetes Engine (
roles/container.clusterAdmin) בפרויקט האשכול
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
דרישות
הדרישות להצפנת דיסקים במישור הבקרה באמצעות מפתחות משלכם הן:
- האשכול צריך להריץ את גרסה 1.31.1-gke.1846000 של GKE או גרסה מאוחרת יותר.
צריך ליצור את האשכול באחד מהאזורים הבאים:
asia-east1asia-northeast1asia-southeast1europe-west1europe-west4us-central1us-central2us-east1us-east4us-east5us-south1us-west1us-west3us-west4
מגבלות
- אפשר להגדיר מפתחות הצפנה של דיסק האתחול ושל etcd רק במהלך יצירת האשכול.
באשכולות אזוריים במצב רגיל ובאשכולות במצב Autopilot, האזור שבו יוצרים את האשכול צריך לכלול קיבולת למצב סודי עבור Hyperdisk Balanced לפחות בשלושה אזורים באותו אזור.
באשכולות במצב Standard לפי אזור, צריך לוודא שיש קיבולת Hyperdisk Balanced באזור של האשכול. לקבלת עזרה בנושא קיבולת, אפשר לפנות ל-Cloud Customer Care.
GKE תומך רק במפתחות מ-Cloud KMS. אי אפשר להשתמש בספק KMS אחר של Kubernetes או בספק הצפנה אחר.
אין תמיכה במפתחות של Cloud External Key Manager (Cloud EKM).
אין לכם גישה לגיבויים התפעוליים הפנימיים של etcd, והם מיועדים רק לשחזור אחרי אסון. Cloud de Confiance
אין תמיכה במחזיקי מפתחות בכמה אזורים. חובה להשתמש במחזיק מפתחות אזורי.
יצירת מפתחות
בקטע הזה, יוצרים מפתח הצפנה לדיסקים של אתחול ולדיסקים של etcd ברמת הבקרה, ומפתח הצפנה נפרד לגיבוי התפעולי הפנימי של etcd. Cloud de Confianceאפשר להשתמש בטבעת מפתחות אחת כדי להחזיק את כל המפתחות האלה וכל מפתח אחר עבור האשכול.
יוצרים את מפתח ההצפנה לדיסקים של אתחול מישור הבקרה ולדיסקים של etcd:
gcloud kms keys create KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --purpose="encryption" \ --protection-level=PROTECTION_LEVEL \ --project=KEY_PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
KCP_DISK_KEY_NAME: השם של מפתח ההצפנה של דיסקי האתחול של מישור הבקרה ודיסקי ה-etcd. -
KEYRING_NAME: השם של אוסף המפתחות שיכיל את מפתחות ההצפנה של האשכול. -
LOCATION: Cloud de Confiance המיקום של אוסף המפתחות. המיקום הזה צריך להיות זהה למיקום של האשכול. כדי לראות רשימה של אזורים, מסננים לפי 'אזור' בטבלת המיקומים של Cloud KMS. -
PROTECTION_LEVEL: רמת ההגנה של המפתח, כמוsoftwareאוhsm. -
KEY_PROJECT_ID: מזהה הפרויקט של פרויקט המפתח.
-
יוצרים את מפתח ההצפנה של הגיבוי הפנימי של etcd:
gcloud kms keys create ETCD_BACKUP_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --purpose="encryption" \ --protection-level=PROTECTION_LEVEL \ --project=KEY_PROJECT_IDמחליפים את
ETCD_BACKUP_KEY_NAMEבשם של מפתח ההצפנה הפנימי של הגיבוי של etcd.
איך נותנים תפקידים ב-IAM לסוכן השירות של GKE
בקטע הזה, מקצים תפקידי IAM למפתחות שיצרתם לסוכן השירות של GKE בפרויקט של האשכול. סוכן השירות של GKE צריך את התפקידים האלה כדי להשתמש במפתחות האלה להצפנת משאבי מישור הבקרה המתאימים.
מאתרים את מספר הפרויקט של האשכול:
gcloud projects describe CLUSTER_PROJECT_ID \ --format='value(projectNumber)'מחליפים את
CLUSTER_PROJECT_IDבמזהה הפרויקט של אשכול GKE.הפלט אמור להיראות כך:
1234567890נותנים לסוכן השירות של GKE בפרויקט של האשכול את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter (
roles/cloudkms.cryptoKeyEncrypterDecrypter) במפתח ההצפנה של דיסקים של אתחול ושל etcd:gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \ --project=KEY_PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
KCP_DISK_KEY_NAME: השם של מפתח ההצפנה של הדיסק. -
LOCATION: Cloud de Confiance המיקום של המפתח. -
KEYRING_NAME: השם של אוסף המפתחות שמכיל את מפתח ההצפנה. -
CLUSTER_PROJECT_NUMBER: מספר הפרויקט המספרי של פרויקט האשכול, שמצאתם בשלב הקודם. -
KEY_PROJECT_ID: מזהה הפרויקט של פרויקט המפתח.
-
נותנים לסוכן השירות של GKE בפרויקט האשכול את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter Via Delegation (
roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) במפתח ההצפנה של דיסקים של אתחול ודיסקים של etcd:gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \ --project=KEY_PROJECT_IDכדי לבצע רוטציה של מפתחות, צריך להעניק לסוכן השירות של GKE בפרויקט של האשכול את התפקיד משתמש במפתח Cloud KMS במפתחות ההצפנה של דיסקים של אתחול ושל etcd:
gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \ --role=roles/container.cloudKmsKeyUser \ --project=KEY_PROJECT_IDצריך להעניק לסוכן השירות של GKE בפרויקט של האשכול את התפקיד Cloud KMS CryptoKey Encrypter (
roles/cloudkms.cryptoKeyEncrypter) במפתח ההצפנה של הגיבוי הפנימי של etcd:gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypter \ --project=KEY_PROJECT_IDמחליפים את
ETCD_BACKUP_KEY_NAMEבשם של מפתח ההצפנה של הגיבוי התפעולי של etcd.הענקת הרשאה לתפקיד
roles/cloudkms.cryptoKeyEncrypterמונעת מ-GKE לבצע שחזורים של מסדי נתונים בשמכם, ומאריכה באופן משמעותי את משך הזמן לשחזור הפונקציונליות כשמתרחשת בעיה במסד הנתונים. כדי לאפשר ל-GKE לבצע שחזורים בשבילכם, צריך להקצות את התפקידroles/cloudkms.cryptoKeyEncrypterDecrypter.
שימוש במפתחות הצפנה באשכול
בקטע הזה מוסבר איך לזהות את הנתיבים למפתחות ההצפנה.
מזהים את הנתיב למפתח הצפנת הדיסק:
gcloud kms keys describe KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --format="value(name)"מחליפים את מה שכתוב בשדות הבאים:
-
KCP_DISK_KEY_NAME: השם של מפתח ההצפנה לדיסקים של אתחול מישור הבקרה ולדיסקים של etcd. -
KEYRING_NAME: השם של אוסף המפתחות שמכיל את המפתח. -
LOCATION: Cloud de Confiance המיקום של המפתח. -
KEY_PROJECT_ID: מזהה הפרויקט של פרויקט המפתח.
הפלט אמור להיראות כך:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key-
מזהים את הנתיב למפתח ההצפנה של הגיבוי הפנימי של etcd:
gcloud kms keys describe ETCD_BACKUP_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --format="value(name)"מחליפים את
ETCD_BACKUP_KEY_NAMEבשם של מפתח ההצפנה של הגיבוי התפעולי של etcd.הפלט אמור להיראות כך:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
יצירת אשכול
בקטע הזה יוצרים אשכול עם אפשרויות שונות שמוגדרות בהתאם לתכונות של הרשאות הגישה למישור הבקרה של GKE שרוצים להגדיר. אפשר להגדיר את התכונות האלה באוסף רק במהלך יצירת האוסף. הפקודות הבאות יוצרות אשכולות במצב רגיל. כדי ליצור במקום זאת אשכולות במצב אוטומטי, משתמשים באותם דגלים עם הפקודה gcloud container clusters create-auto.
כדי ליצור אשכול שמגדיר הצפנת דיסק ומריץ רשויות אישורים משלכם ומפתחות חתימה של חשבונות שירות, צריך לבצע את הפעולות הבאות:
- מבצעים את כל השלבים להגדרת מפתחות ורשויות אישורים במאמר הפעלת רשויות אישורים ומפתחות משלכם.
- כדי למצוא את הנתיבים לכל אחד מהמפתחות של חשבונות השירות ולרשויות האישורים, פועלים לפי ההוראות במאמר הגדרת רשויות אישורים ומפתחות באשכול חדש.
יצירת אשכול:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \ --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \ --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \ --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \ --cluster-ca=PATH_TO_CLUSTER_CA \ --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \ --etcd-api-ca=PATH_TO_ETCD_API_CA \ --aggregation-ca=PATH_TO_AGGREGATION_CAמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
LOCATION: המיקום של האשכול החדש. -
CLUSTER_PROJECT_ID: מזהה הפרויקט של פרויקט האשכול. -
PATH_TO_DISK_KEY: הנתיב למפתח ההצפנה של הדיסק מהשלבים הקודמים במסמך הזה. -
PATH_TO_ETCD_BACKUP_KEY: הנתיב למפתח ההצפנה של הגיבוי הפנימי של etcd מהשלבים הקודמים במסמך הזה. -
PATH_TO_SIGNING_KEY_VERSION: הנתיב לגרסה של מפתח החתימה של Kubernetes ServiceAccount ב-Cloud KMS. -
PATH_TO_VERIFICATION_KEY_VERSION: הנתיב לגרסת מפתח האימות של Kubernetes ServiceAccount ב-Cloud KMS. -
PATH_TO_CLUSTER_CA: הנתיב למאגר של רשות האישורים (CA) של האשכול. -
PATH_TO_ETCD_PEER_CA: הנתיב למאגר של רשות האישורים (CA) של עמיתים ב-etcd. -
PATH_TO_ETCD_API_CA: הנתיב למאגר של רשות אישורים (CA) של etcd API. -
PATH_TO_AGGREGATION_CA: הנתיב למאגר של רשות האישורים המצטברת.
-
כדי ליצור אשכול שבו מוגדרת רק הצפנת דיסק באמצעות המפתחות שיצרתם במדריך הזה, מריצים את הפקודה הבאה:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \ --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEYמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
LOCATION: המיקום של האשכול החדש. -
CLUSTER_PROJECT_ID: מזהה הפרויקט של פרויקט האשכול. -
PATH_TO_DISK_KEY: הנתיב למפתח ההצפנה של הדיסק מהשלבים הקודמים. -
PATH_TO_ETCD_BACKUP_KEY: הנתיב למפתח ההצפנה הפנימי של הגיבוי של etcd מהשלבים הקודמים.
-
אפשר גם לציין את כל הדגלים האלה כשיוצרים אשכול חדש במצב Standard.
אימות הסטטוס של מפתח ההצפנה
בקטע הזה מוסבר איך לוודא את מפתח ההצפנה שבו נעשה שימוש במהלך יצירת האשכול. אפשר לבצע את האימות הזה באמצעות Cloud Logging או באמצעות Google Cloud CLI.
שימוש ב-Logging לאימות מפתחות
כדי לאמת את המפתחות באמצעות Logging, מבצעים את הפעולות הבאות:
נכנסים לדף Logs Explorer במסוף Cloud de Confiance :
כדי לקבל את יומן יצירת האשכול, מציינים את השאילתה הבאה:
resource.type="gke_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="CLUSTER_LOCATION" protoPayload.serviceName="container.googleapis.com" protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster" protoPayload.request.cluster.userManagedKeysConfig:*לוחצים על Run query.
בפלט, בודקים שפרמטרי יצירת האשכול כוללים נתיב מפתח שתואם למפתח שהגדרתם ב-Cloud KMS, כמו בדוגמה הבאה:
# lines omitted for clarity
userManagedKeysConfig: {
controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}
שימוש ב-CLI של gcloud לאימות מפתחות
כדי להשתמש ב-CLI של gcloud כדי לאמת את מפתח ההצפנה:
כדי לקבל את מפתח ההצפנה של הדיסק, מריצים את הפקודה הבאה:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"כדי לקבל את מפתח ההצפנה של הגיבוי הפנימי של etcd, מריצים את הפקודה הבאה:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
רוטציה של מפתחות הצפנה של דיסקים ב-etcd ובמישור הבקרה
תוקף מפתחות ההצפנה שאתם יוצרים לא פג. כדי לשפר את רמת האבטחה, מומלץ להחליף את המפתחות האלה באופן קבוע ולהצפין מחדש את המשאבים באמצעות גרסאות חדשות של המפתחות. מידע נוסף מופיע במאמר בנושא רוטציה של מפתחות הצפנה של etcd ושל דיסק האתחול של מישור הבקרה.
המאמרים הבאים
- מידע נוסף על מה שאפשר לראות במישור הבקרה
- הפעלת רשויות אישורים ומפתחות משלכם ב-GKE
- אימות התקינות של המכונה הווירטואלית של מישור הבקרה