Szyfrowanie dysków systemu operacyjnego przy użyciu klucza zarządzanego przez klienta w usłudze Azure Red Hat OpenShift

Domyślnie Microsoft Azure używa automatycznie wygenerowanych kluczy do szyfrowania dysków systemu operacyjnego maszyn wirtualnych w klastrze Azure Red Hat OpenShift. Aby uzyskać dodatkowe zabezpieczenia, można zaszyfrować dyski systemu operacyjnego przy użyciu kluczy zarządzanych samodzielnie podczas wdrażania klastra. Ta funkcja zapewnia większą kontrolę dzięki szyfrowaniu poufnych danych za pomocą kluczy zarządzanych przez klienta.

Klastry z kluczami zarządzanymi przez klienta mają włączoną domyślną klasę pamięci dla tych kluczy. W związku z tym te klucze szyfrują zarówno dyski systemu operacyjnego, jak i dyski danych. Azure Key Vault przechowuje klucze zarządzane przez klienta. Aby uzyskać więcej informacji na temat używania usługi Key Vault do tworzenia kluczy i zarządzania nimi, zobacz Podstawowe pojęcia dotyczące usługi Azure Key Vault.

W przypadku szyfrowania opartego na hoście dane przechowywane na hoście maszyny wirtualnej węzła usługi Azure Red Hat OpenShift są szyfrowane w stanie spoczynku. Te dane są szyfrowane do Azure Storage. Szyfrowanie oparte na hoście oznacza, że dyski tymczasowe są szyfrowane w spoczynku przy użyciu kluczy zarządzanych przez platformę.

Pamięć podręczna dysków systemu operacyjnego i danych jest szyfrowana w spoczynku przy użyciu kluczy zarządzanych przez platformę lub kluczy zarządzanych przez klienta. Typ kluczy zależy od typu szyfrowania ustawionego na tych dyskach. Domyślnie w przypadku używania Azure Red Hat OpenShift dyski systemu operacyjnego i danych są szyfrowane w spoczynku przy użyciu kluczy zarządzanych przez platformę. To ustawienie domyślne oznacza, że pamięci podręczne dla tych dysków są również domyślnie szyfrowane w spoczynku przy użyciu kluczy zarządzanych przez platformę.

Możesz określić własne klucze zarządzane, wykonując kroki szyfrowania w następnej sekcji. Klucze określone w tym kroku również szyfrują pamięć podręczną dla tych dysków.

Ograniczenie

Klienci muszą obsługiwać magazyn kluczy i szyfrowanie dysków ustawione w Azure. Nieutrzymywanie kluczy skutkuje uszkodzeniem klastrów Azure Red Hat OpenShift. Maszyny wirtualne przestaną działać, a w rezultacie cały klaster Azure Red Hat OpenShift przestanie działać.

Zespół inżynierów Azure Red Hat OpenShift nie może uzyskać dostępu do kluczy. W związku z tym nie mogą tworzyć kopii zapasowych, replikować ani pobierać kluczy.

Aby uzyskać szczegółowe informacje na temat używania zestawów szyfrowania dysków do zarządzania kluczami szyfrowania, zobacz Szyfrowanie Azure Disk Storage po stronie serwera.

Wymagania wstępne

  • Zweryfikuj swoje uprawnienia. Musisz mieć uprawnienia do tworzenia klastra Azure Red Hat OpenShift, magazynu kluczy i zestawu szyfrowania dysków.

  • Upewnij się, że masz rolę Key Vault Crypto Officer. Ta rola ma uprawnienia do tworzenia klucza.

  • Jeśli masz wiele subskrypcji platformy Azure, zarejestruj dostawców zasobów. Aby uzyskać szczegółowe informacje o rejestracji, zobacz Rejestrowanie dostawców zasobów.

  • Upewnij się, że masz włączoną EncryptionAtHost funkcję w subskrypcji. Możesz ją włączyć, uruchamiając polecenie:

    az feature register --namespace Microsoft.Compute --name EncryptionAtHost
    

    Możesz sprawdzić bieżący stan funkcji, uruchamiając polecenie:

    az feature show --namespace Microsoft.Compute --name EncryptionAtHost
    

Utwórz wystąpienie Key Vault

Do przechowywania kluczy należy użyć wystąpienia Key Vault. Utwórz nowy magazyn kluczy z włączoną ochroną przeczyszczania. Następnie utwórz nowy klucz w magazynie kluczy, aby przechowywać własny klucz.

  1. Ustaw zmienne środowiskowe:

    export KEYVAULT_NAME=aro-enckv
    export KEYVAULT_KEY_NAME=aro-key
    export DISK_ENCRYPTION_SET_NAME=aro-des
    export LOCATION=<location-name>
    export RESOURCEGROUP=<resource-group-name>
    
  2. Utwórz magazyn kluczy:

    az keyvault create \
        --name $KEYVAULT_NAME \
        --resource-group $RESOURCEGROUP \
        --location $LOCATION \
        --enable-purge-protection true
    

    Uwaga / Notatka

    Należy włączyć ochronę przed trwałym usunięciem. Zobacz Konfigurowanie usługi Azure Key Vault.

    Opcjonalnie: ponieważ ochrona przed przeczyszczeniem jest włączona, nie można natychmiast ponownie użyć nazwy magazynu kluczy po usunięciu. Dodając specyfikację --retention-days <NUMBER_OF_DAYS>, możesz określić, jak długo magazyn pozostaje w stanie „usunięcia nietrwałego”. Wartość domyślna to 90 dni, ale ustawienie jej na niższą wartość (minimum 7 dni) oznacza, że można szybciej odzyskać nazwę.

  3. Utwórz klucz w magazynie kluczy:

    az keyvault key create \
        --vault-name $KEYVAULT_NAME \
        --name $KEYVAULT_KEY_NAME \
        --protection software
    
  4. Ustaw identyfikator zasobu usługi Key Vault i zmienne adresu URL klucza:

    KEYVAULT_ID=$(az keyvault show --name $KEYVAULT_NAME --query "[id]" -o tsv)
    
    KEYVAULT_KEY_URL=$(az keyvault key show --vault-name $KEYVAULT_NAME --name $KEYVAULT_KEY_NAME --query "[key.kid]" -o tsv)
    

Tworzenie zestawu szyfrowania dysku

Użyj zestawu szyfrowania dysków Azure jako punktu odniesienia dla dysków w klastrach Azure Red Hat OpenShift. Jest on połączony z magazynem kluczy utworzonym w poprzednim kroku i pobiera klucze zarządzane przez klienta z tej lokalizacji.

  1. Utwórz zestaw szyfrowania dysków:

    az disk-encryption-set create \
        --name $DISK_ENCRYPTION_SET_NAME \
        --location $LOCATION \
        --resource-group $RESOURCEGROUP \
        --source-vault $KEYVAULT_ID \
        --key-url $KEYVAULT_KEY_URL
    
  2. Określ identyfikator zasobu zestawu szyfrowania dysków oraz zmienne tożsamości:

    DES_ID=$(az disk-encryption-set show --name $DISK_ENCRYPTION_SET_NAME --resource-group $RESOURCEGROUP --query 'id' -o tsv)
    
    DES_IDENTITY=$(az disk-encryption-set show --name $DISK_ENCRYPTION_SET_NAME --resource-group $RESOURCEGROUP --query "[identity.principalId]" -o tsv)
    

Udzielanie uprawnień dla zestawu szyfrowania dysków w celu uzyskania dostępu do magazynu kluczy

Chcesz, aby tożsamość zarządzana zestawu szyfrowania dysków używała klucza szyfrowania. Przypisz wbudowaną rolę, która zapewnia wymagane uprawnienia klucza, takie jak użytkownik szyfrowania usługi kryptograficznej Key Vault lub użytkownik kryptograficzny Key Vault. Alternatywnie należy użyć roli niestandardowej, o ile zawiera niezbędne uprawnienia (wrapkey, unwrapkeyi get) do wykonywania kluczowych operacji wymaganych przez zestawy szyfrowania dysków.

az role assignment create \
    --assignee $DES_IDENTITY \
    --role "Key Vault Crypto Service Encryption User" \
    --scope $KEYVAULT_ID

Tworzenie klastra usługi Azure Red Hat OpenShift

Podczas tworzenia klastra można włączyć klucze zarządzane przez klienta, określając zestaw szyfrowania dysków. Użyj parametru --disk-encryption-set . Na przykład --disk-encryption-set $DES_ID.

Aby utworzyć klaster z jednostką usługi, postępuj zgodnie z instrukcjami w Tworzenie klastra Azure Red Hat OpenShift.

Oto przykład tworzenia klastra z parametrem --disk-encryption-set :

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master-subnet \
    --worker-subnet worker-subnet \
    --disk-encryption-set $DES_ID

Uwaga / Notatka

Klucze zarządzane przez klienta można włączyć tylko w istniejących klastrach dla węzłów roboczych, a nie węzłów głównych. Tę konfigurację można osiągnąć. Aby uzyskać więcej informacji, zobacz dokumentację oprogramowania Red Hat, w tym Włączanie kluczy szyfrowania zarządzanych przez klienta dla zestawu maszyn i Modyfikowanie zestawu maszyn obliczeniowych.

Aby utworzyć klaster Azure Red Hat OpenShift z tożsamościami zarządzanymi, przed utworzeniem klastra należy nadać uprawnienia tożsamości machine-api i tożsamości disk-csi-driver. Należy również przyznać jednostce usługi Azure Red Hat OpenShift Microsoft.Compute/diskEncryptionSets/read uprawnienia do zestawu szyfrowania dysków.

Przykładowe przypisania ról dla tożsamości machine-api, tożsamości disk-csi-driver oraz jednostki usługi ARO własnej firmy Microsoft:

az role assignment create \
  --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name disk-csi-driver --query principalId -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID"

az role assignment create \
  --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID

az role assignment create \
  --assignee-object-id "$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)" \
  --assignee-principal-type ServicePrincipal \
  --role <ROLE> \
  --scope $DES_ID

Po utworzeniu klastra Usługi Azure Red Hat OpenShift wszystkie maszyny wirtualne są szyfrowane przy użyciu kluczy szyfrowania zarządzanych przez klienta.

Aby sprawdzić, czy klucze zostały prawidłowo skonfigurowane, uruchom następujące polecenia:

  1. Pobierz nazwę grupy zasobów klastra, w której znajdują się maszyny wirtualne, dyski i inna infrastruktura klastra:

    CLUSTERRESOURCEGROUP=$(az aro show --resource-group $RESOURCEGROUP --name $CLUSTER --query 'clusterProfile.resourceGroupId' -o tsv | cut -d '/' -f 5)
    
  2. Sprawdź, czy dyski mają dołączony prawidłowy zestaw szyfrowania dysków:

    az disk list --resource-group $CLUSTERRESOURCEGROUP --query '[].encryption'
    

Pole diskEncryptionSetId w danych wyjściowych musi wskazywać zestaw szyfrowania dysku określony podczas tworzenia klastra Azure Red Hat OpenShift.

Dodaj obsługę zarządzanego modułu HSM (mHSM) dla kluczy zarządzanych przez klienta i egzekwowania zasad Azure Policy

Można również dodać obsługę zarządzanego modułu HSM (mHSM) dla kluczy zarządzanych przez klienta oraz wymagać i odrzucać określone atrybuty szyfrowania. Ta obsługa wymaga zmian interfejsu API i Azure Policy.

Wykonaj następujące kroki, aby utworzyć klaster Azure Red Hat OpenShift przy użyciu oprogramowania mHSM i kluczy zarządzanych przez klienta:

  1. Aprowizuj i aktywuj zarządzany moduł HSM przy użyciu Azure CLI.

  2. Eksportuj zmienne środowiskowe z poprzedniego kroku:

    export HSM_NAME=<hsm-name>
    export RESOURCE_GROUP=<resource-group>
    
  3. Włącz ochronę przed przeczyszczaniem i zarządzanie kluczami za pomocą Azure Resource Manager:

    az keyvault update-hsm \
      --hsm-name $HSM_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-purge-protection true
    
    az keyvault setting update \
      --hsm-name $HSM_NAME \
      --name AllowKeyManagementOperationsThroughARM \
      --value true 
    
  4. Wykonaj pozostałe kroki, aby aktywować rozwiązanie mHSM: Aktywowanie zarządzanego modułu HSM.

  5. Przypisz sobie rolę Managed HSM Crypto User, aby móc tworzyć klucze w module mHSM.

    oid=$(az ad signed-in-user show --query id -o tsv)
    az keyvault role assignment create \        
      --hsm-name $HSM_NAME \ 
      --role "Managed HSM Crypto User" \ 
      --assignee $oid \ 
      --scope /keys 
    
  6. Utwórz klucz mHSM.

  7. Utwórz tożsamość zarządzaną i przyznaj Managed HSM Crypto Service Encryption User jej rolę w usłudze mHSM.

    export UA_IDENTITY=<new-ua-identity>
    
    HSM_ID="https://${HSM_NAME}.managedhsm.azure.net"
    
    az identity create \
      --resource-group $RESOURCE_GROUP \
      --name $UA_IDENTITY
    
    IDENTITY_OBJECT_ID=$(az identity show \ 
      --resource-group $RESOURCE_GROUP \ 
      --name $UA_IDENTITY \ 
      --query principalId -o tsv) 
    
    az keyvault role assignment create \ 
      --id "$HSM_ID" \ 
      --role "Managed HSM Crypto Service Encryption User" \ 
      --assignee-object-id "$IDENTITY_OBJECT_ID" \ 
      --scope "/keys/byok-key"
    
  8. Utwórz zestaw szyfrowania dysków, biorąc pod uwagę:

    1. Ustaw typ szyfrowania na Encryption at-rest with a customer-managed key.

    2. Użyj tożsamości przypisanej przez użytkownika utworzonej w poprzednim kroku.

    3. Przed utworzeniem zestawu szyfrowania dysków ukończ przypisanie roli.

  9. Eksportuj zmienne środowiskowe z poprzedniego kroku:

    export LOCATION=<yourLocation>
    export CLUSTER=<yourNewClusterName> 
    export VIRTUAL_NETWORK=<yourVirtualNetwork>
    export KEYVAULT_NAME=<yourKeyvaultName>
    export KEYVAULT_KEY_NAME=byok-key 
    export DISK_ENCRYPTION_SET_NAME=<yourDiskEncryptionSetName>
    
  10. Utwórz klaster z nowym zestawem szyfrowania dysków:

    DES_ID=$(az disk-encryption-set show -n $DISK_ENCRYPTION_SET_NAME -g $RESOURCE_GROUP --query 'id' -o tsv) 
    
    az aro create --resource-group $RESOURCE_GROUP \ 
      --name $CLUSTER  \ 
      --vnet $VIRTUAL_NETWORK  \ 
      --master-subnet master-subnet \ 
      --worker-subnet worker-subnet \ 
      --disk-encryption-set $DES_ID 
    
  11. Po uruchomieniu klastra potwierdź szyfrowanie:

    az disk list -g $VIRTUAL_NETWORK --query "[].{DiskName:name, VM:managedBy, EncryptionType:encryption.type, DiskEncryptionSet:encryption.diskEncryptionSetId}" -o table 
    

    Aby zweryfikować szyfrowanie, poszukaj EncryptionAtRestWithCustomerKey w kolumnie EncryptionType .