בדף הזה נסביר איך להשתמש במפתחות הצפנה בניהול הלקוח (CMEK) ב-Google Kubernetes Engine (GKE). אם אתם צריכים לשלוט בניהול המפתחות, אתם יכולים להשתמש ב-Cloud Key Management Service וב-CMEK כדי להגן על דיסקים קשיחים מצורפים ועל דיסקים בהתאמה אישית לאתחול באשכול GKE.
סקירה כללית
כברירת מחדל, Google Cloud GKE מצפין את התוכן של הלקוחות במצב מנוחה, GKE מנהל את ההצפנה בשבילכם בלי שתצטרכו לבצע פעולה כלשהי.
אם אתם רוצים לשלוט ברוטציית מפתחות ולנהל אותה בעצמכם, אתם יכולים להשתמש ב-CMEK. המפתחות האלה מצפינים את המפתחות להצפנת נתונים שמצפינים את הנתונים שלכם. מידע נוסף זמין במאמר בנושא ניהול מפתחות.
אפשר גם להצפין סודות באשכול באמצעות מפתחות שאתם מנהלים. פרטים נוספים זמינים במאמר בנושא הצפנת סודות בשכבת האפליקציה.
ב-GKE, CMEK יכול להגן על נתונים בשני סוגים של דיסקים לאחסון: דיסקים לאתחול צמתים ודיסקים מצורפים.
- דיסקי אתחול של צמתים
- דיסקים לאתחול צמתים הם חלק ממאגרי הצמתים של האשכול. אפשר ליצור דיסק אתחול של צומת מוצפן באמצעות CMEK כשיוצרים אשכולות ומאגרי צמתים.
- דיסקים מצורפים
- דיסקים מצורפים הם PersistentVolumes שמשמשים את ה-Pods לאחסון עמיד. דיסקים לאחסון מתמיד (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 .
במקרים של אשכולות Standard, אפשר להצפין באמצעות מפתח CMEK רק דיסק מתמיד סטנדרטי (pd-standard)
או דיסק מתמיד שמבוסס על SSD (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 .
ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.
לוחצים על add_box הוספת מאגר צמתים.
בחלונית הניווט, לוחצים על צמתים.
בקטע Machine Configuration מוודאים שBoot disk type מוגדר לערך דיסק מתמיד סטנדרטי או דיסק מתמיד שמבוסס על SSD.
מסמנים את התיבה 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וליצור אותו מחדש עם אותו שם, אבל עם קבוצה שונה של פרמטרים.
Persistent Disks
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וליצור אותו מחדש עם אותו שם, אבל עם קבוצה שונה של פרמטרים. מוודאים שמנהל ההקצאות של הכיתה הקיימת הואpd.csi.storage.gke.io.
אפשר להגדיר את StorageClass כברירת מחדל.
- השדה
פורסים את
StorageClassבאשכול GKE באמצעותkubectl:kubectl apply -f cmek-sc.yamlמוודאים ש-
StorageClassהשתמש במנהל התקן של 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: nonePersistent Disks
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: 1TiPersistent Disks
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 9sPersistent Disks
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
כשמצפינים Persistent Disk באמצעות מפתח Cloud KMS, ההצפנה היא קבועה. אי אפשר להסיר את מפתח ההצפנה מהדיסק הספציפי הזה, גם אם מוחקים או משביתים את מפתח Cloud KMS. הדרך היחידה לשנות את מפתח ההצפנה או להסיר את ההגנה של CMEK מדיסק אחסון מתמיד היא ליצור דיסק אחסון מתמיד חדש על סמך קובץ snapshot של הדיסק הקיים. מידע נוסף זמין במאמר הסרת מפתח ההצפנה של Cloud KMS מ-Persistent Disk.
אי אפשר להסיר הצפנה באמצעות CMEK ממופעי Filestore.
GKE ומדיניות הארגון ל-CMEK
GKE תומך במדיניות הארגון ל-CMEK (בגרסת Preview), שיכולה לדרוש הגנה באמצעות CMEK ולהגביל את מפתחות Cloud KMS שבהם אפשר להשתמש להגנה באמצעות CMEK.
אם container.googleapis.com מופיע ברשימת השירותים של המדיניות Deny של האילוץ constraints/gcp.restrictNonCmekServices, GKE לא ייצור את המשאבים הבאים אם לא תפעילו הגנה באמצעות CMEK:
- אשכולות חדשים ומאגרי צמתים
- מופעי Filestore חדשים ודיסקים של אחסון מתמיד (persistent disks)
כשהאילוץ constraints/gcp.restrictNonCmekCryptoKeyProjects מוגדר במדיניות הארגון, GKE יוצר רק משאבים שמוגנים באמצעות CMEK ומשתמשים במפתח הצפנה מפרויקט, מתיקייה או מארגון מורשים.
המאמרים הבאים
- כדאי לקרוא את השאלות הנפוצות על Cloud Key Management Service.
- מידע על הגנה על משאבים באמצעות מפתחות של Cloud KMS