Dodawanie szyfrowania usługi KMS itp. do klastra Azure Kubernetes Service (AKS)

W tym artykule pokazano, jak włączyć szyfrowanie danych magazynowanych dla danych kubernetes itp. przy użyciu wtyczki usługi Azure Key Vault z wtyczką usługi zarządzania kluczami (KMS). Wtyczka usługi KMS umożliwia:

  • Używanie klucza w Key Vault do szyfrowania etcd
  • Używanie własnych kluczy
  • Zapewnianie szyfrowania magazynowanych dla wpisów tajnych przechowywanych w itd.
  • Obracanie kluczy w Key Vault

Aby uzyskać więcej informacji na temat korzystania z wtyczki usługi KMS, zobacz Szyfrowanie danych tajnych w spoczynku.

Zanim rozpoczniesz

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, możesz utworzyć bezpłatne konto.
  • Interfejs wiersza polecenia platformy Azure w wersji 2.39.0 lub nowszej. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Ostrzeżenie

Usługa KMS obsługuje tylko konnectivity. Możesz użyć kubectl get po -n kube-system polecenia , aby sprawdzić, czy jest uruchomiony zasobnik "konnectivity-agent-xxx".

Ograniczenia

Podczas integrowania szyfrowania KMS itp. z usługą AKS obowiązują następujące ograniczenia:

  • Usunięcie klucza, Key Vault lub skojarzonej tożsamości.
  • Szyfrowanie usługi KMS itp. nie działa z tożsamością zarządzaną System-Assigned. Przed włączeniem funkcji należy ustawić zasady dostępu do usługi Keyvault. Ponadto tożsamość zarządzana System-Assigned nie jest dostępna do momentu utworzenia klastra, dlatego istnieje zależność cyklu.
  • Używanie ponad 2000 wpisów tajnych w klastrze.
  • Bring your own (BYO) Azure Key Vault z innej dzierżawy.
  • Zmień skojarzony model usługi Azure Key Vault (publiczny, prywatny), jeśli usługa KMS jest włączona. Aby zmienić skojarzony tryb magazynu kluczy, należy ponownie wyłączyć i włączyć usługę KMS.
  • Zatrzymaj/uruchom klaster, który jest włączony w usłudze KMS z prywatnym magazynem kluczy.

Usługa KMS obsługuje teraz publiczny magazyn kluczy i prywatny magazyn kluczy .

Włączanie usługi KMS z publicznym magazynem kluczy

Tworzenie magazynu kluczy i klucza

Ostrzeżenie

Usunięcie klucza lub Key Vault platformy Azure nie jest obsługiwane i spowoduje, że wpisy tajne będą nieodwracalne w klastrze.

Jeśli musisz odzyskać Key Vault lub klucz, zapoznaj się z dokumentacją zarządzania odzyskiwaniem w usłudze Azure Key Vault za pomocą usuwania nietrwałego i ochrony przed przeczyszczeniem.

W przypadku magazynu kluczy innych niż RBAC

Użyj az keyvault create polecenia , aby utworzyć usługę KeyVault.

az keyvault create --name MyKeyVault --resource-group MyResourceGroup

Użyj az keyvault key create polecenia , aby utworzyć klucz.

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Użyj az keyvault key show polecenia , aby wyeksportować identyfikator klucza.

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Powyższy przykład przechowuje identyfikator klucza w KEY_ID.

W przypadku magazynu kluczy RBAC

Użyj az keyvault create polecenia , aby utworzyć usługę KeyVault przy użyciu Access Control opartej na rolach platformy Azure.

export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup  --enable-rbac-authorization true --query id -o tsv)

Przypisz sobie uprawnienia do tworzenia klucza.

az role assignment create --role "Key Vault Crypto Officer" --assignee-object-id $(az ad signed-in-user show --query id --out tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

Użyj az keyvault key create polecenia , aby utworzyć klucz.

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Użyj az keyvault key show polecenia , aby wyeksportować identyfikator klucza.

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Powyższy przykład przechowuje identyfikator klucza w KEY_ID.

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika

Użyj polecenia az identity create , aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika.

az identity create --name MyIdentity --resource-group MyResourceGroup

Użyj az identity show polecenia , aby uzyskać identyfikator obiektu tożsamości.

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

Powyższy przykład przechowuje wartość identyfikatora obiektu tożsamości w IDENTITY_OBJECT_ID.

Użyj az identity show polecenia , aby uzyskać identyfikator zasobu tożsamości.

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Powyższy przykład przechowuje wartość identyfikatora zasobu tożsamości w IDENTITY_RESOURCE_ID.

Przypisywanie uprawnień (odszyfrowywanie i szyfrowanie) w celu uzyskania dostępu do magazynu kluczy

W przypadku magazynu kluczy innych niż RBAC

Jeśli magazyn kluczy nie jest włączony za --enable-rbac-authorizationpomocą usługi , możesz użyć az keyvault set-policy polecenia , aby utworzyć zasady usługi Azure KeyVault.

az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

W przypadku magazynu kluczy RBAC

Jeśli magazyn kluczy jest włączony w --enable-rbac-authorizationusłudze , musisz przypisać rolę RBAC "Key Vault Crypto User", która ma odszyfrowywać, szyfrować uprawnienia.

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Tworzenie klastra usługi AKS z włączonym szyfrowaniem kmS itp.

Utwórz klaster usługi AKS przy użyciu polecenia az aks create z parametrami --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-access i --azure-keyvault-kms-key-id w celu włączenia szyfrowania usługi KMS itp.

az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

Aktualizowanie istniejącego klastra usługi AKS w celu włączenia szyfrowania KMS itp.

Użyj polecenia az aks update z parametrami --enable-azure-keyvault-kmsi --azure-keyvault-kms-key-id , --azure-keyvault-kms-key-vault-network-access aby włączyć szyfrowanie usługi KMS itp. w istniejącym klastrze.

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

Użyj poniższego polecenia, aby zaktualizować wszystkie wpisy tajne. W przeciwnym razie stare wpisy tajne nie są szyfrowane.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Uwaga

W przypadku większych klastrów możesz rozdzielić wpisy tajne według przestrzeni nazw lub skryptu aktualizacji.

Obracanie istniejących kluczy

Po zmianie identyfikatora klucza (w tym nazwy klucza i wersji klucza) można użyć polecenia az aks update z --enable-azure-keyvault-kmsparametrami , --azure-keyvault-kms-key-vault-network-access i --azure-keyvault-kms-key-id do rotacji kluczy zakończenia usługi KMS.

Ostrzeżenie

Pamiętaj, aby zaktualizować wszystkie wpisy tajne po rotacji kluczy. W przeciwnym razie wpisy tajne będą niedostępne, jeśli stare klucze nie istnieją lub działają.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $NEW_KEY_ID 

Użyj poniższego polecenia, aby zaktualizować wszystkie wpisy tajne. W przeciwnym razie stare wpisy tajne są nadal szyfrowane przy użyciu poprzedniego klucza.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Uwaga

W przypadku większych klastrów możesz rozdzielić wpisy tajne według przestrzeni nazw lub skryptu aktualizacji.

Włączanie usługi KMS z prywatnym magazynem kluczy

Jeśli włączysz usługę KMS z prywatnym magazynem kluczy, usługa AKS automatycznie utworzy prywatny punkt końcowy i link prywatny w grupie zasobów węzła. Magazyn kluczy zostanie dodany do prywatnego połączenia punktu końcowego z klastrem usługi AKS.

Tworzenie prywatnego magazynu kluczy i klucza

Ostrzeżenie

Usunięcie klucza lub Key Vault platformy Azure nie jest obsługiwane i spowoduje, że wpisy tajne będą nieodwracalne w klastrze.

Jeśli musisz odzyskać Key Vault lub klucz, zapoznaj się z dokumentacją zarządzania odzyskiwaniem w usłudze Azure Key Vault za pomocą usuwania nietrwałego i ochrony przed przeczyszczeniem.

Użyj az keyvault create polecenia , aby utworzyć priate KeyVault.

az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Bez prywatnego punktu końcowego nie jest obsługiwane tworzenie ani aktualizowanie kluczy w prywatnym magazynie kluczy. Aby zarządzać prywatnym magazynem kluczy, zobacz Integrowanie Key Vault z Azure Private Link.

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika

Użyj polecenia az identity create , aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika.

az identity create --name MyIdentity --resource-group MyResourceGroup

Użyj az identity show polecenia , aby uzyskać identyfikator obiektu tożsamości.

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

Powyższy przykład przechowuje wartość identyfikatora obiektu tożsamości w IDENTITY_OBJECT_ID.

Użyj az identity show polecenia , aby uzyskać identyfikator zasobu tożsamości.

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Powyższy przykład przechowuje wartość identyfikatora zasobu tożsamości w IDENTITY_RESOURCE_ID.

Przypisywanie uprawnień (odszyfrowywanie i szyfrowanie) w celu uzyskania dostępu do magazynu kluczy

W przypadku magazynu kluczy innych niż RBAC

Jeśli magazyn kluczy nie jest włączony za --enable-rbac-authorizationpomocą usługi , możesz użyć az keyvault set-policy polecenia , aby utworzyć zasady usługi Azure KeyVault.

az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

W przypadku magazynu kluczy RBAC

Jeśli magazyn kluczy jest włączony z usługą --enable-rbac-authorization, musisz przypisać rolę RBAC, która zawiera co najmniej odszyfrowywanie, szyfrowanie uprawnień.

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

W przypadku magazynu kluczy prywatnych usługa AKS musi Key Vault rolę Współautor, aby utworzyć połączenie prywatne między prywatnym magazynem kluczy a klastrem.

az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Tworzenie klastra usługi AKS z prywatnym magazynem kluczy i włączanie szyfrowania usługi KMS itp.

Utwórz klaster usługi AKS przy użyciu polecenia az aks create z parametrami --enable-azure-keyvault-kms, --azure-keyvault-kms-key-idi --azure-keyvault-kms-key-vault-resource-id w --azure-keyvault-kms-key-vault-network-access celu włączenia szyfrowania usługi KMS itpd z prywatnym magazynem kluczy.

az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Aktualizowanie istniejącego klastra usługi AKS w celu włączenia szyfrowania kmS itp. za pomocą prywatnego magazynu kluczy

Użyj polecenia az aks update z parametrami --enable-azure-keyvault-kms, --azure-keyvault-kms-key-idi --azure-keyvault-kms-key-vault-resource-id , --azure-keyvault-kms-key-vault-network-access aby włączyć szyfrowanie usługi KMS itp. w istniejącym klastrze z prywatnym magazynem kluczy.

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Użyj poniższego polecenia, aby zaktualizować wszystkie wpisy tajne. W przeciwnym razie stare wpisy tajne nie są szyfrowane.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Uwaga

W przypadku większych klastrów możesz rozdzielić wpisy tajne według przestrzeni nazw lub skryptu aktualizacji.

Obracanie istniejących kluczy

Po zmianie identyfikatora klucza (w tym nazwy klucza i wersji klucza) można użyć polecenia az aks update z parametrami --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access i --azure-keyvault-kms-key-vault-resource-id do rotacji istniejących kluczy usługi KMS.

Ostrzeżenie

Pamiętaj, aby zaktualizować wszystkie wpisy tajne po rotacji kluczy. W przeciwnym razie wpisy tajne będą niedostępne, jeśli stare klucze nie istnieją lub działają.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Użyj poniższego polecenia, aby zaktualizować wszystkie wpisy tajne. W przeciwnym razie stare wpisy tajne są nadal szyfrowane przy użyciu poprzedniego klucza.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Uwaga

W przypadku większych klastrów możesz rozdzielić wpisy tajne według przestrzeni nazw lub skryptu aktualizacji.

Aktualizowanie trybu magazynu kluczy

Uwaga

Aby zmienić inny magazyn kluczy z innym trybem (publicznym, prywatnym), można uruchomić az aks update bezpośrednio. Aby zmienić tryb dołączonego magazynu kluczy, należy przeprowadzić dystrybucję usługi KMS i ponownie włączyć ją przy użyciu nowych identyfikatorów magazynu kluczy.

Poniżej przedstawiono kroki migracji dołączonego magazynu kluczy publicznych do trybu prywatnego.

Wyłączanie usługi KMS w klastrze

Użyj poniższego polecenia, aby wyłączyć usługę KMS w istniejącym klastrze i zwolnić magazyn kluczy.

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Zmienianie trybu magazynu kluczy

Zaktualizuj magazyn kluczy z publicznego na prywatny.

az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Włączanie usługi KMS w klastrze ze zaktualizowanym magazynem kluczy

Użyj poniższego polecenia, aby ponownie włączyć usługę KMS ze zaktualizowanym prywatnym magazynem kluczy.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Po skonfigurowaniu usługi KMS można włączyć ustawienia diagnostyczne magazynu kluczy w celu sprawdzenia dzienników szyfrowania.

Wyłączanie usługi KMS

Użyj poniższego polecenia, aby wyłączyć usługę KMS w istniejącym klastrze.

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Użyj poniższego polecenia, aby zaktualizować wszystkie wpisy tajne. W przeciwnym razie stare wpisy tajne są nadal szyfrowane przy użyciu poprzedniego klucza.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Uwaga

W przypadku większych klastrów możesz rozdzielić wpisy tajne według przestrzeni nazw lub skryptu aktualizacji.