שימוש במפתחות הצפנה בניהול הלקוח (CMEK)

בדף הזה נסביר איך להשתמש במפתחות הצפנה בניהול הלקוח (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.

לפני שמתחילים

  1. כדי לבצע את התרגילים בנושא הזה, אתם צריכים שני Google Cloud פרויקטים:

    • פרויקט המפתח: כאן יוצרים מפתח הצפנה.

    • פרויקט אשכול: כאן יוצרים אשכול שמאפשר CMEK.

  2. בפרויקט המפתח, מוודאים שהפעלתם את Cloud KMS API.

    הפעלת Cloud KMS API

  3. בפרויקט המפתחות, המשתמש שיוצר את מחזיק המפתחות ואת המפתח צריך את הרשאות ה-IAM הבאות:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    ההרשאות האלה מוענקות לroles/cloudkms.admin תפקיד המוגדר מראש לניהול זהויות והרשאות גישה. מידע נוסף על הענקת הרשאות לניהול מפתחות זמין במסמכי התיעוד של Cloud KMS.

  4. בפרויקט האשכול, מוודאים שהפעלתם את Cloud KMS API.

    הפעלת Cloud KMS API

  5. מוודאים שהתקנתם את ה-CLI של gcloud.

  6. עדכון 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: מזהה הפרויקט של המפתח.

המסוף

  1. נכנסים לדף Key management במסוף Google Cloud .

    מעבר אל 'ניהול מפתחות'

  2. לוחצים על השם של אוסף המפתחות שמכיל את המפתח.

  3. לוחצים על השם של המפתח שרוצים לשנות.

  4. לוחצים על הכרטיסייה Permissions.

  5. לוחצים על Grant access. החלונית Grant access to key תיפתח.

  6. בשדה New principals, מזינים את השם של סוכן השירות של Compute Engine:

    service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
    

    מחליפים את PROJECT_NUMBER במספר הפרויקט של האשכול.

  7. בתפריט Select a role, בוחרים באפשרות Cloud KMS CryptoKey Encrypter/Decrypter.

  8. לוחצים על 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, מבצעים את השלבים הבאים:

  1. נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .

    מעבר אל יצירת אשכול Kubernetes

  2. מגדירים את האשכול לפי הצורך.
  3. בחלונית הניווט, בקטע Node Pools (מאגרי צמתים), לוחצים על Nodes (צמתים).
  4. ברשימה הנפתחת Boot disk type בוחרים באפשרות Standard persistent disk או באפשרות SSD Persistent Disk.
  5. מסמנים את תיבת הסימון Enable customer-managed encryption for Boot Disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם קודם.
  6. לוחצים על יצירה.

יצירת אשכול Autopilot

כדי ליצור אשכול Autopilot שדיסק האתחול שלו מוצפן באמצעות מפתח CMEK, מבצעים את השלבים הבאים:

  1. נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .

    כניסה לדף Create an Autopilot cluster

  2. מגדירים את האשכול לפי הצורך.
  3. מרחיבים את הקטע אפשרויות מתקדמות ומאתרים את האפשרויות אבטחה.
  4. מסמנים את תיבת הסימון Enable customer-managed encryption for Boot Disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם קודם.
  5. לוחצים על יצירה.

יצירת מאגר צמתים חדש עם דיסקים להפעלה של צמתים שמוגנים באמצעות 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 שיצרתם בשלב הקודם.

המסוף

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    מעבר אל Google Kubernetes Engine

  2. ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.

  3. לוחצים על הוספת מאגר צמתים.

  4. בחלונית הניווט, לוחצים על צמתים.

  5. בקטע Machine Configuration מוודאים שBoot disk type מוגדר לערך דיסק מתמיד סטנדרטי או דיסק מתמיד שמבוסס על SSD.

  6. מסמנים את התיבה Enable customer-managed encryption for boot disk ובוחרים את מפתח ההצפנה של Cloud KMS שיצרתם.

  7. לוחצים על יצירה.

שימוש במכונות Filestore או בדיסקים קשיחים מוגנים באמצעות CMEK

במידע הבא מוסבר איך להצפין מופעים חדשים של Filestore או דיסקים קשיחים. אפשר להפעיל CMEK באשכול חדש או קיים, באמצעות מפתח חדש או קיים של Cloud KMS.

צריך לבצע את ההוראות האלה פעם אחת לכל אשכול GKE:

יצירת StorageClass עם הפניה למפתח Cloud KMS

  1. מעתיקים את התוכן שלמטה לקובץ 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 כברירת מחדל.

  2. פורסים את StorageClass באשכול GKE באמצעות kubectl:

    kubectl apply -f cmek-sc.yaml
    
  3. מוודאים ש-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:                none
    

    Persistent 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 החדשים.

  1. מעתיקים את התוכן הבא לקובץ חדש בשם pvc.yaml ומוודאים שהערך של storageClassName תואם לשם של אובייקט StorageClass:

    מכונות Filestore

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-cmek
      resources:
        requests:
          storage: 1Ti
    

    Persistent Disks

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. מחילים את PersistentVolumeClaim (PVC) באשכול GKE:

    kubectl apply -f pvc.yaml
    
  3. אם בשדה 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
    
  4. מחילים את ה-Pod באשכול GKE:

    kubectl apply -f pod.yaml
    
  5. מקבלים את הסטטוס של 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
    

    Persistent 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 ומשתמשים במפתח הצפנה מפרויקט, מתיקייה או מארגון מורשים.

המאמרים הבאים