בדף הזה נסביר איך להשתמש במפתחות הצפנה בניהול הלקוח (CMEK) ב-Google Kubernetes Engine (GKE). אם אתם צריכים לשלוט בניהול המפתחות, אתם יכולים להשתמש ב-Cloud Key Management Service וב-CMEK כדי להגן על דיסקים קשיחים מצורפים ועל דיסקים בהתאמה אישית לאתחול באשכול GKE.
סקירה כללית
כברירת מחדל, Google Cloud GKE מצפין את התוכן של הלקוחות במצב מנוחה, GKE מנהל את ההצפנה בשבילכם בלי שתצטרכו לבצע פעולה כלשהי.
אם אתם רוצים לשלוט ברוטציית מפתחות ההצפנה ולנהל אותה בעצמכם, אתם יכולים להשתמש ב-CMEK. המפתחות האלה מצפינים את המפתחות להצפנת נתונים שמצפינים את הנתונים שלכם. מידע נוסף זמין במאמר בנושא ניהול מפתחות.
אפשר גם להצפין סודות באשכול באמצעות מפתחות שאתם מנהלים. פרטים נוספים זמינים במאמר בנושא הצפנת סודות בשכבת האפליקציה.
ב-GKE, CMEK יכול להגן על נתונים בשני סוגים של דיסקים לאחסון: דיסקים לאתחול צמתים ודיסקים מצורפים.
- דיסקי אתחול של צמתים
- דיסקי אתחול של צמתים הם חלק ממאגרי הצמתים של האשכול. אפשר ליצור דיסק הפעלה של צומת מוצפן באמצעות CMEK כשיוצרים אשכולות ומאגרי צמתים.
- דיסקים מצורפים
- דיסקים מצורפים הם נפחי אחסון מתמיד שמשמשים את קבוצות ה-Pod לאחסון עמיד. דיסקים לאחסון מתמיד (persistent disks) מוצפנים באמצעות CMEK ומצורפים ל-GKE כPersistentVolume עם הקצאת משאבים דינמית.
מידע נוסף על דיסקים לאחסון זמין במאמר אפשרויות אחסון. אי אפשר להגן על דיסקים של מישור הבקרה, שמשמשים למישורי בקרה של GKE, באמצעות CMEK.
לפני שמתחילים
כדי לבצע את התרגילים בנושא הזה, אתם צריכים שני Google Cloud פרויקטים:
פרויקט המפתח: כאן יוצרים מפתח הצפנה.
פרויקט אשכול: כאן יוצרים אשכול שמאפשר CMEK.
בפרויקט המפתח, מוודאים שהפעלתם את Cloud KMS API.
בפרויקט המפתחות, המשתמש שיוצר את מחזיק המפתחות ואת המפתח צריך את הרשאות ה-IAM הבאות:
cloudkms.keyRings.getIamPolicycloudkms.keyRings.setIamPolicy
ההרשאות האלה מוענקות ל
roles/cloudkms.adminתפקיד המוגדר מראש לניהול זהויות והרשאות גישה. מידע נוסף על הענקת הרשאות לניהול מפתחות זמין במסמכי Cloud KMS.בפרויקט האשכול, מוודאים שהפעלתם את Cloud KMS API.
מוודאים שהתקנתם את ה-CLI של gcloud.
עדכון
gcloudלגרסה האחרונה:gcloud components update
יצירת מפתח Cloud KMS
כדי להגן על דיסק האתחול של הצומת או על דיסק שמצורף אליו באמצעות CMEK, צריך מחזיק מפתחות ומפתח של Cloud KMS.
אוסף המפתחות והמפתח צריכים לעמוד בדרישות הבאות:
המפתח צריך להשתמש בהצפנה סימטרית.
צריך להעניק לחשבון השירות של GKE הרשאות לשימוש במפתח.
אוסף המפתחות צריך להיות באותו מיקום שבו נמצא אשכול GKE:
קלאסטר אזורי צריך להשתמש במחזיק מפתחות ממיקום של קבוצת על. לדוגמה, קלאסטר באזור
us-central1-aיכול להשתמש רק במפתח באזורus-central1.אשכול אזורי צריך להשתמש במחזיק מפתחות מאותו מיקום. לדוגמה, קלאסטר באזור
asia-northeast1צריך להיות מוגן באמצעות מחזיק מפתחות מהאזורasia-northeast1.אי אפשר להשתמש באזור
globalשל Cloud KMS עם GKE.
הוראות ליצירת אוסף מפתחות ומפתח זמינות במאמר יצירת מפתחות סימטריים.
מתן הרשאה לשימוש במפתח
צריך להקצות את תפקיד ה-IAM Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) במפתח Cloud KMS לסוכן השירות של Compute Engine בפרויקט של האשכול. הענקת התפקיד הזה מאפשרת ל-GKE Persistent Disks לגשת למפתח ההצפנה שלכם ולהשתמש בו.
כדי להעניק את התפקיד roles/cloudkms.cryptoKeyEncrypterDecrypter לסוכן השירות של Compute Engine, בוחרים באחת מהאפשרויות הבאות:
gcloud
מריצים את הפקודה הבאה:
gcloud kms keys add-iam-policy-binding KEY_NAME \
--location LOCATION \
--keyring RING_NAME \
--member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KEY_PROJECT_ID
מחליפים את מה שכתוב בשדות הבאים:
-
KEY_NAME: שם המפתח. -
LOCATION: האזור שבו יצרתם את אוסף המפתחות. -
RING_NAME: השם של אוסף המפתחות. -
PROJECT_NUMBER: מספר הפרויקט של האשכול. -
KEY_PROJECT_ID: מזהה הפרויקט של המפתח.
המסוף
- נכנסים לדף Key management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות שמכיל את המפתח.
לוחצים על השם של המפתח שרוצים לשנות.
לוחצים על הכרטיסייה Permissions.
לוחצים על Grant access. החלונית Grant access to key תיפתח.
בשדה New principals, מזינים את השם של סוכן השירות של Compute Engine:
service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.comמחליפים את
PROJECT_NUMBERבמספר הפרויקט של האשכול.בתפריט Select a role, בוחרים באפשרות Cloud KMS CryptoKey Encrypter/Decrypter.
לוחצים על Save.
שימוש בדיסקים לאתחול של צמתים שמוגנים באמצעות CMEK
בקטע הזה יוצרים מאגר צמתים או אשכול חדש עם דיסק אתחול שמוגן באמצעות CMEK.
אי אפשר להפעיל הצפנה בניהול הלקוח בדיסקים של אתחול הצמתים באשכול קיים, כי אי אפשר לשנות את סוג דיסק האתחול של אשכול קיים או של מאגר צמתים קיים. עם זאת, אפשר ליצור מאגר צמתים חדש לאשכול עם הצפנה בניהול הלקוח, ולמחוק את מאגר הצמתים הקודם.
בנוסף, אי אפשר להשבית הצפנה בניהול הלקוח עבור דיסקים של אתחול צמתים באשכול קיים או במאגר צמתים קיים. עם זאת, אפשר ליצור מאגר צמתים חדש לאשכול עם השבתה של הצפנה בניהול הלקוח, ולמחוק את מאגר הצמתים הקודם.
יצירת אשכול עם דיסק אתחול של צומת שמוגן באמצעות CMEK
אפשר ליצור אשכול עם דיסק אתחול של צומת שמוגן באמצעות CMEK באמצעות ה-CLI של gcloud או המסוף Google Cloud .
במקרים של אשכולות רגילים, אפשר להצפין באמצעות מפתח CMEK רק standard persistent disk (pd-standard)
או SSD persistent disk (pd-ssd).
gcloud
כדי ליצור אשכול שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, מציינים ערך לפרמטר --boot-disk-kms-key בפקודה ליצירת האשכול.
יצירת אשכול Standard
כדי ליצור אשכול רגיל שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, משתמשים בפקודה הבאה:
gcloud container clusters create CLUSTER_NAME \
--cluster-version=latest \
--location CONTROL_PLANE_LOCATION \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID \
--disk-type DISK_TYPE
יצירת אשכול Autopilot
כדי ליצור אשכול Autopilot שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, משתמשים בפקודה הבאה:
gcloud container clusters create-auto CLUSTER_NAME \
--cluster-version=latest \
--location CONTROL_PLANE_LOCATION \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים של Standard ו-Autopilot, או תחום לאשכולות אזוריים של Standard. -
KEY_PROJECT_ID: מזהה הפרויקט של המפתח. -
LOCATION: המיקום של אוסף המפתחות. -
RING_NAME: השם של אוסף המפתחות. -
KEY_NAME: שם המפתח. -
CLUSTER_PROJECT_IDהוא מזהה הפרויקט של האשכול. DISK_TYPE:pd-standard(ברירת מחדל) אוpd-ssd.
המסוף
יצירת אשכול Standard
כדי ליצור אשכול רגיל שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, מבצעים את השלבים הבאים:
- נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
- מגדירים את האשכול לפי הצורך.
- בחלונית הניווט, בקטע Node Pools (מאגרי צמתים), לוחצים על Nodes (צמתים).
- ברשימה הנפתחת Boot disk type בוחרים באפשרות Standard persistent disk או באפשרות SSD Persistent Disk.
- מסמנים את תיבת הסימון Enable customer-managed encryption for Boot Disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם קודם.
- לוחצים על יצירה.
יצירת אשכול Autopilot
כדי ליצור אשכול Autopilot שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, מבצעים את השלבים הבאים:
- נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .
- מגדירים את האשכול לפי הצורך.
- מרחיבים את הקטע אפשרויות מתקדמות ומאתרים את האפשרויות אבטחה.
- מסמנים את תיבת הסימון Enable customer-managed encryption for Boot Disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם קודם.
- לוחצים על יצירה.
יצירת מאגר צמתים חדש עם דיסקים להפעלה של צמתים שמוגנים באמצעות CMEK
כדי ליצור מאגר צמתים חדש עם הפעלת CMEK באשכול רגיל קיים, אפשר להשתמש ב-CLI של gcloud או במסוף Google Cloud .
gcloud
כדי ליצור מאגר צמתים עם הצפנה בניהול הלקוח לדיסקים של אתחול הצמתים, צריך לציין ערך לפרמטר --boot-disk-kms-key בפקודת היצירה.
gcloud container node-pools create NODE_POOL_NAME \
--location CONTROL_PLANE_LOCATION \
--disk-type DISK_TYPE \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID \
--cluster CLUSTER_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
NODE_POOL_NAME: השם שבחרתם למאגר הצמתים. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים. DISK_TYPE:pd-standard(ברירת מחדל) אוpd-ssd.-
KEY_PROJECT_ID:מזהה הפרויקט של המפתח. -
LOCATION: המיקום של אוסף המפתחות. -
RING_NAME: השם של אוסף המפתחות. -
KEY_NAME: שם המפתח. -
CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול. -
CLUSTER_NAME: השם של אשכול Standard שיצרתם בשלב הקודם.
המסוף
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.
לוחצים על הכרטיסייה Nodes.
לוחצים על יצירת מאגר צמתים בניהול המשתמש.
בחלונית הניווט, לוחצים על צמתים.
בקטע Machine Configuration מוודאים שBoot disk type מוגדר ל-Standard persistent disk או ל-SSD persistent disk.
מסמנים את התיבה Enable customer-managed encryption for boot disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם.
לוחצים על יצירה.
שימוש במכונות Filestore או בדיסקים קבועים שמוגנים באמצעות CMEK
במידע הבא מוסבר איך להצפין מופעים חדשים של Filestore או דיסקים קשיחים. אפשר להפעיל CMEK באשכול חדש או קיים, באמצעות מפתח חדש או קיים של Cloud KMS.
צריך לבצע את ההוראות האלה פעם אחת לכל אשכול GKE:
- אם אין לכם אשכול GKE זמין, צריך ליצור אחד.
- פורסים את Filestore CSI Driver או את Compute Engine Persistent Disk CSI Driver באשכול.
- אם אין לכם אוסף מפתחות וגרסת מפתח של Cloud KMS, צריך ליצור אותם.
- מתן הרשאות גישה למפתח לחשבון השירות של Filestore.
- יוצרים StorageClass שמאפשר להצפין אוטומטית דיסקים שהוקצו על ידי Kubernetes באמצעות מפתח Cloud KMS הזה. פרטים נוספים מופיעים בקטע הבא.
יצירת StorageClass עם הפניה למפתח Cloud KMS
מעתיקים את התוכן שלמטה לקובץ YAML בשם
cmek-sc.yaml. ההגדרה הזו מאפשרת הקצאה דינמית של נפחים מוצפנים.מכונות Filestore
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-filestore-cmek provisioner: filestore.csi.storage.gke.io allowVolumeExpansion: true parameters: tier: enterprise instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME- השדה
instance-encryption-kms-keyצריך להיות מזהה המשאב שמוגדר במלואו של המפתח שישמש להצפנת מופעי Filestore חדשים. - הערכים ב-
instance-encryption-kms-keyהם תלויי-רישיות (לדוגמה:keyRingsו-cryptoKeys). הקצאת נפח אחסון חדש עם ערכים שגויים תוביל לשגיאהinvalidResourceUsage. - אי אפשר להוסיף את הפרמטר
instance-encryption-kms-keyלאובייקטStorageClassקיים. עם זאת, אפשר למחוק את אובייקטStorageClassוליצור אותו מחדש עם אותו שם, אבל עם קבוצה שונה של פרמטרים.
דיסקים לאחסון מתמיד
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-gce-pd-cmek provisioner: pd.csi.storage.gke.io volumeBindingMode: "WaitForFirstConsumer" allowVolumeExpansion: true parameters: type: pd-standard disk-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME- השדה
disk-encryption-kms-keyצריך להיות מזהה המשאב שמוגדר במלואו של המפתח שישמש להצפנת דיסקים חדשים. - הערכים ב-
disk-encryption-kms-keyהם תלויי-רישיות (לדוגמה:keyRingsו-cryptoKeys). הקצאת נפח אחסון חדש עם ערכים שגויים תוביל לשגיאהinvalidResourceUsage. - אי אפשר להוסיף את הפרמטר
disk-encryption-kms-keyלאובייקטStorageClassקיים. עם זאת, אפשר למחוק את אובייקטStorageClassוליצור אותו מחדש עם אותו שם, אבל עם קבוצה שונה של פרמטרים. מוודאים שמנהל ההקצאות (provisioner) של הכיתה הקיימת הואpd.csi.storage.gke.io.
אפשר להגדיר את StorageClass כברירת מחדל.
- השדה
פורסים את
StorageClassבאשכול GKE באמצעותkubectl:kubectl apply -f cmek-sc.yamlמוודאים ש-
StorageClassהשתמש במנהל התקן (driver) של CSI של Filestore או של דיסק לאחסון מתמיד ב-Compute Engine, וכולל את מזהה המפתח:מכונות Filestore
kubectl describe storageclass csi-filestore-cmekבפלט של הפקודה, מוודאים את הפרטים הבאים:
- ה-provisioner מוגדר כ-filestore.csi.storage.gke.io.
- המזהה של המפתח מופיע אחרי instance-encryption-kms-key.
Name: csi-filestore-cmek IsDefaultClass: No Annotations: None Provisioner: filestore.csi.storage.gke.io Parameters: instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard AllowVolumeExpansion: true MountOptions: none ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: noneדיסקים לאחסון מתמיד
kubectl describe storageclass csi-gce-pd-cmekבפלט של הפקודה, מוודאים את הפרטים הבאים:
- הכלי להקצאת הרשאות מוגדר כ-
pd.csi.storage.gke.io. - המזהה של המפתח מופיע אחרי
disk-encryption-kms-key.
Name: csi-gce-pd-cmek IsDefaultClass: No Annotations: None Provisioner: pd.csi.storage.gke.io Parameters: disk-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard AllowVolumeExpansion: unset MountOptions: none ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: none
יצירה של נפח אחסון מוצפן ב-GKE
בקטע הזה, אתם מקצים באופן דינמי נפחי אחסון מוצפנים של Kubernetes באמצעות StorageClass ומפתח Cloud KMS החדש.
מעתיקים את התוכן הבא לקובץ חדש בשם
pvc.yamlומוודאים שהערך שלstorageClassNameתואם לשם של אובייקטStorageClass:מכונות Filestore
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany storageClassName: csi-filestore-cmek resources: requests: storage: 1Tiדיסקים לאחסון מתמיד
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteOnce storageClassName: csi-gce-pd-cmek resources: requests: storage: 6Giמחילים את
PersistentVolumeClaim(PVC) באשכול GKE:kubectl apply -f pvc.yamlאם בשדה
volumeBindingModeשלStorageClassמוגדר הערךWaitForFirstConsumer, צריך ליצור Pod כדי להשתמש ב-PVC לפני שאפשר לאמת אותו. מעתיקים את התוכן הבא לקובץ חדש בשםpod.yaml, ומוודאים שהערך שלclaimNameתואם לשם של אובייקטPersistentVolumeClaim:apiVersion: v1 kind: Pod metadata: name: web-server spec: containers: - name: web-server image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc readOnly: falseמחילים את ה-Pod באשכול GKE:
kubectl apply -f pod.yamlמקבלים את הסטטוס של
PersistentVolumeClaimבאשכול ומוודאים ש-PVC נוצר ומקושר ל-PersistentVolumeשהוקצה לאחרונה.מכונות Filestore
kubectl get pvcהפלט אמור להיראות כך:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 1Ti RWO csi-filestore-cmek 9sדיסקים לאחסון מתמיד
kubectl get pvcהפלט אמור להיראות כך:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 6Gi RWO csi-gce-pd-cmek 9s
עכשיו אפשר להשתמש ב-Persistent Disk שמוגן באמצעות CMEK עם אשכול GKE.
הסרת ההגנה באמצעות CMEK
כשמצפינים דיסק מתמשך באמצעות מפתח Cloud KMS, ההצפנה היא קבועה. אי אפשר להסיר את מפתח ההצפנה מהדיסק הספציפי הזה, גם אם מוחקים או משביתים את מפתח Cloud KMS. הדרך היחידה לשנות את מפתח ההצפנה או להסיר את ההגנה של CMEK מדיסק אחסון מתמיד היא ליצור דיסק אחסון מתמיד חדש על סמך snapshot של הדיסק הקיים. מידע נוסף זמין במאמר הסרת מפתח ההצפנה של Cloud KMS מדיסק מתמשך.
אי אפשר להסיר הצפנה באמצעות CMEK ממופעי Filestore.
GKE ומדיניות הארגון לגבי CMEK
GKE תומך במדיניות הארגון ל-CMEK (בגרסת Preview), שיכולה לדרוש הגנה באמצעות CMEK ולהגביל את מפתחות Cloud KMS שבהם אפשר להשתמש להגנה באמצעות CMEK.
אם container.googleapis.com מופיע ברשימת השירותים של כלל המדיניות Deny, GKE מסרב ליצור את המשאבים הבאים אם לא מפעילים הגנה באמצעות CMEK:constraints/gcp.restrictNonCmekServices
- אשכולות חדשים ומאגרי צמתים
- מכונות חדשות של Filestore ודיסקים של אחסון מתמיד (persistent disks)
כשהאילוץ constraints/gcp.restrictNonCmekCryptoKeyProjects מוגדר במדיניות הארגון, GKE יוצר רק משאבים שמוגנים באמצעות CMEK ומשתמשים במפתח הצפנה מפרויקט, מתיקייה או מארגון מותרים.