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

בדף הזה נסביר איך להשתמש במפתחות הצפנה בניהול הלקוח (CMEK) ב-Google Kubernetes Engine ‏ (GKE). אם אתם צריכים לנהל את המפתחות, אתם יכולים להשתמש ב-Cloud Key Management Service וב-CMEK כדי להגן על Persistent Disks מצורפים ועל דיסקי אתחול מותאמים אישית באשכול GKE.

סקירה כללית

כברירת מחדל, Google Cloud מצפינה את תוכן הלקוחות במנוחה, ו-GKE מנהלת את ההצפנה בשבילכם בלי שתצטרכו לעשות שום דבר.

אם אתם רוצים לשלוט ברוטציית מפתחות ההצפנה ולנהל אותה בעצמכם, אתם יכולים להשתמש ב-CMEK. המפתחות האלה מצפינים את המפתחות להצפנת הנתונים שמצפינים את הנתונים שלכם. מידע נוסף זמין במאמר ניהול מפתחות.

אתם יכולים גם להצפין סודות באשכול באמצעות מפתחות שאתם מנהלים. למידע נוסף, קראו את המאמר הצפנת סודות בשכבת האפליקציה.

ב-GKE, מפתחות CMEK יכולים להגן על נתונים בשני סוגים של דיסקים לאחסון: דיסקים לאתחול של צמתים ודיסקים מצורפים.

דיסקי אתחול של צמתים
דיסקים לאתחול של צמתים הם חלק ממאגרי הצמתים של האשכול. אפשר ליצור דיסק אתחול של צומת מוצפן באמצעות CMEK כשיוצרים אשכולות ומאגרי צמתים.
דיסקים מצורפים
דיסקים מצורפים הם נפחי אחסון מתמיד שמשמשים את קבוצות ה-Pod לאחסון עמיד. דיסקים לאחסון מתמיד שמצורפים ומוצפנים באמצעות CMEK זמינים ב-GKE כ-PersistentVolume שהוקצה באופן דינמי.

מידע נוסף על דיסקים לאחסון זמין במאמר אפשרויות אחסון. אי אפשר להגן על דיסקים של מישור הבקרה, שמשמשים למישורי בקרה של GKE, באמצעות CMEK.

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

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

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

    • ‫Cluster project: בפרויקט הזה יוצרים אשכול שמאפשר שימוש ב-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 לגשת למפתח ההצפנה שלכם ולהשתמש בו.

כדי להקצות את התפקיד 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 .

באשכולות רגילים, אפשר להצפין באמצעות מפתח 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.

המסוף

יצירת אשכול רגיל

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

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

    יצירת אשכול Kubernetes

  2. מגדירים את האשכול לפי הצורך.
  3. בחלונית הניווט, בקטע מאגרי צמתים, לוחצים על צמתים.
  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. לוחצים על הכרטיסייה Nodes (צמתים).

  4. לוחצים על יצירת מאגר צמתים בניהול משתמשים.

  5. בחלונית הניווט, לוחצים על Nodes.

  6. בקטע Machine Configuration, מוודאים שהערך של Boot disk type הוא Standard persistent disk או SSD persistent disk.

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

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

שימוש במכונות של Filestore או ב-Persistent Disk שמוגנים באמצעות CMEK

המידע הבא מסביר איך להצפין מכונות Filestore או Persistent Disk חדשות. אפשר להפעיל 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 וליצור אותו מחדש עם אותו שם, אבל עם קבוצת פרמטרים שונה.

    דיסקים לאחסון מתמיד

    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 כברירת מחדל.

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

    kubectl apply -f cmek-sc.yaml
    
  3. מוודאים ש-StorageClass השתמש במנהל התקן של CSI של Filestore או של דיסק לאחסון מתמיד ב-Compute Engine, וכולל את מזהה המפתח:

    מכונות של Filestore

    kubectl describe storageclass csi-filestore-cmek
    

    בודקים את הפלט של הפקודה:

    • מנהל ההקצאות מוגדר כ-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
    

    דיסקים לאחסון מתמיד

    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 מדיסק מתמשך.

אי אפשר להסיר הצפנת CMEK ממכונות Filestore.

GKE ומדיניות הארגון ל-CMEK

ב-GKE יש תמיכה במדיניות הארגון ל-CMEK (תצוגה מקדימה), שמאפשרת לדרוש הגנה באמצעות CMEK ולהגביל את מפתחות Cloud KMS שאפשר להשתמש בהם להגנה באמצעות CMEK.

אם container.googleapis.com נמצא ברשימת השירותים של מדיניות Deny לאילוץ constraints/gcp.restrictNonCmekServices, GKE לא יוצר את המשאבים הבאים אם לא מפעילים הגנה באמצעות CMEK:

  • אשכולות ומאגרי צמתים חדשים
  • מכונות חדשות של Filestore ודיסקים של אחסון מתמיד (persistent disks)

כשמגדירים את האילוץ constraints/gcp.restrictNonCmekCryptoKeyProjects במדיניות הארגון, GKE יוצר רק משאבים שמוגנים באמצעות CMEK ומשתמשים במפתח הצפנה מפרויקט, מתיקייה או מארגון מורשים.

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