Предоставить разрешение на использование ключа в GKE - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь подготовить зашифрованный диск для GKE динамически. Но я действительно не понимаю следующую часть.

Grant permission to use the key
You must assign the Compute Engine service account used by nodes in your cluster the Cloud KMS CryptoKey Encrypter/Decrypter role. This is required for GKE Persistent Disks to access and use your encryption key.

The Compute Engine service account's name has the following format:

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

Действительно ли необходимо предоставить «Cloud KMS CryptoKey Encrypter / Decryter» учетной записи службы Compute Engine? Могу ли я создать новый SA и предоставить ему эту роль? В описании сказано, что SA используется узлами. Поэтому мне интересно, смогу ли я создать новый SA и предоставить роль Cloud KMS, а затем использовать этот SA для ускорения кластера GKE. Тогда я думаю, что это должно быть доступно для предоставления зашифрованных дисков для GKE.

официальный документ ниже:

dynamicically_provision_an_encrypted

1 Ответ

0 голосов
/ 13 января 2020

Я пытался следовать этой документации шаг за шагом:

  1. создать кластер gke ( проверить Совместимость с Kubernetes Совместимость, я решил придерживаться с 1.14 на этот раз), брелок и ключ

  2. развернуть драйвер CSI в кластере

    2.1. скачать драйвер $git clone https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver /PATH/gcp-compute-persistent-disk-csi-driver

    2.2. настроить переменные для вашего проекта в /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh

    2.3. создать учетную запись службы с /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh

2.4. настроить переменные для развертывания драйверов в /PATH/gcp-compute-persistent-disk-csi-driver/deploy/kubernetes/deploy-driver.sh и /PATH/gcp-compute-persistent-disk-csi-driver/deploy/kubernetes/deploy-driver.shinstall-kustomize.sh

2.5. развернуть драйвер CSI (я придерживаюсь стабильной версии)

$./deploy-driver.sh

включить Cloud KMS API

назначить роль Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) для Compute Engine Service Agent (service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com)

create StorageClass

$cat storage.yaml    
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: csi-gce-pd
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-standard
  disk-encryption-kms-key: projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY


$kubectl describe storageclass csi-gce-pd
Name:            csi-gce-pd
IsDefaultClass:  No
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1beta1","kind":"StorageClass","metadata":{"annotations":{},"name":"csi-gce-pd"},"parameters":{"disk-encryption-kms-key":"projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY","type":"pd-standard"},"provisioner":"pd.csi.storage.gke.io"}

Provisioner:           pd.csi.storage.gke.io
Parameters:            disk-encryption-kms-key=projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY,type=pd-standard
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

создать постоянный том

$ kubectl apply -f pv c .yaml
persistentvolumeclaim / podpv c создал

$ kubectl описать pv c podpvc Имя: podpvc Пространство имен: по умолчанию StorageClass: csi-gce-pd Статус: Связанный том: pv c -b383584a-32c5-11ea-ad6e-42010a9c007d Ярлыки : Аннотации:

   kubectl.kubernetes.io/last-applied-configuration:
             {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"podpvc","namespace":"default"},"spec":{"accessModes...
           pv.kubernetes.io/bind-completed: yes
           pv.kubernetes.io/bound-by-controller: yes
           volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      6Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason                 Age                From                                                                                                           Message
  ----    ------                 ----               ----                                                                                                           -------
  Normal  Provisioning           31m                pd.csi.storage.gke.io_gke-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d  External provisioner is provisioning volume for claim "default/podpvc"
  Normal  ExternalProvisioning   31m (x2 over 31m)  persistentvolume-controller                                                                                    waiting for a volume to be created, either by external provisioner "pd.csi.storage.gke.io" or manually created by system administrator
  Normal  ProvisioningSucceeded  31m                pd.csi.storage.gke.io_gke-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d  Successfully provisioned volume pvc-b383584a-32c5-11ea-ad6e-42010a9c007d

И он успешно подготовлен.

Затем я удалил роль Cloud KMS CryptoKey Encrypter/Decrypter из Compute Engine Service Agent и постоянный том, созданный на шаге 6, и попытался снова:

$kubectl apply -f pvc.yaml                                
persistentvolumeclaim/podpvc created

$kubectl describe pvc podpvc
Name:          podpvc
Namespace:     default
StorageClass:  csi-gce-pd
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
             {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"podpvc","namespace":"default"},"spec":{"accessModes...
           volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
Type     Reason                Age                   From                                                                                                           Message
----     ------                ----                  ----                                                                                                           -------
Normal   Provisioning          2m15s (x10 over 11m)  pd.csi.storage.gke.io_gke-serhii-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d  External provisioner is provisioning volume for claim "default/podpvc"
Warning  ProvisioningFailed    2m11s (x10 over 11m)  pd.csi.storage.gke.io_gke-serhii-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d  failed to provision volume with StorageClass "csi-gce-pd": rpc error: code = Internal desc = CreateVolume failed to create single zonal disk "pvc-b1a238b5-35fa-11ea-bec8-42010a9c01e6": failed to insert zonal disk: unkown Insert disk error: googleapi: Error 400: Cloud KMS error when using key projects/serhii-test-prj/locations/europe-west3/keyRings/SERHII-TEST-KEY-RING/cryptoKeys/SERHII-TEST-KEY: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/serhii-test-prj/locations/europe-west3/keyRings/SERHII-TEST-KEY-RING/cryptoKeys/SERHII-TEST-KEY' (or it may not exist)., kmsPermissionDenied
Normal   ExternalProvisioning  78s (x43 over 11m)    persistentvolume-controller                                                                                    waiting for a volume to be created, either by external provisioner "pd.csi.storage.gke.io" or manually created by system administrator

и постоянный том остался в состоянии ожидания.

И, как вы можете видеть, в документации необходимо:

Предоставить разрешение на использование ключа

Необходимо назначить служебную учетную запись Compute Engine, используемую узлами в кластере Cloud KMS Cr yptoKey Encrypter / Decrypter роль. Это требуется для постоянных дисков GKE для доступа и использования вашего ключа шифрования.

, и этого недостаточно для создания учетной записи службы с /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh, предоставляемой драйвером CSI.

РЕДАКТИРОВАТЬ Обратите внимание:

Для загрузочных дисков узла, защищенных CMEK, эта служебная учетная запись Compute Engine - это учетная запись, для которой требуется разрешение на шифрование с использованием вашего Облачный ключ KMS. Это верно, даже если вы используете настраиваемую учетную запись службы на своих узлах.

Таким образом, в этом случае невозможно использовать только учетную запись службы без учетной записи службы Compute Engine, поскольку постоянные тома с защитой CMEK управляются GCE, а не GKE. Между тем, вы можете предоставить только необходимые условия для вашей учетной записи пользовательского сервиса для повышения безопасности вашего проекта.

...