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

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

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

  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 .

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

  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. לוחצים על הכרטיסייה Nodes.

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

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

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

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

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

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

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

    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 השתמש במנהל התקן (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 החדש.

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

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

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