Aracılığıyla paylaş


Azure Arc özellikli Kubernetes kümelerinde çevrimdışı erişime yönelik gizli anahtarlara erişmek için Gizli Dizi Deposu uzantısını kullanın.

Kubernetes (SSE) için Azure Key Vault Gizli Depolama uzantısı, çevrimdışı erişim için Azure Key Vault'tanAzure Arc özellikli kubernetes kümesine gizli dizileri otomatik olarak eşitler. Bu, Kubernetes kümenizi yarı bağlantısız durumda çalıştırırken bile gizli dizilerinizi depolamak, korumak ve döndürmek için Azure Key Vault kullanabileceğiniz anlamına gelir. Eşitlenmiş gizli bilgiler küme gizli bilgi deposunda depolanır ve Kubernetes gizli bilgileri olarak kullanılabilir hale getirerek alışıldık şekillerde kullanılabilir: veri birimleri olarak bağlanır veya poddaki bir kapsayıcıya ortam değişkenleri olarak sunulur.

Eşitlenmiş gizli diziler kritik iş varlıklarıdır, bu nedenle SSE yalıtılmış ad alanları, rol tabanlı erişim denetimi (RBAC) ilkeleri ve eşitleme denetleyicisi için sınırlı izinler aracılığıyla bunların güvenliğini sağlar. Ek koruma için kümenizdeki Kubernetes gizli anahtar deposunu şifreleyin.

Bu makalede SSE'yi Azure Arc özellikli kubernetes uzantısı olarak yükleme ve yapılandırma adımları gösterilmektedir.

İpucu

Azure Key Vault'a bağlantının mükemmel olmayabileceği Azure bulutu dışındaki kümeler için SSE önerilir. SSE doğası gereği Kubernetes secret (gizli anahtar) deposunda gizli verilerinizin kopyalarını oluşturur. Gizli dizilerin yerel kopyalarını oluşturmaktan kaçınmayı tercih ediyorsanız ve kümenizin Azure Key Vault ile mükemmel bağlantısı varsa Arc özellikli Kubernetes kümelerinizde gizli dizi erişimi için yalnızca çevrimiçi Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını kullanabilirsiniz. Aynı kümede hem çevrimiçi Azure Key Vault Gizli Dizileri Sağlayıcısı uzantısının hem de çevrimdışı SSE'nin yan yana çalıştırılması önerilmez.

Önkoşullar

Henüz yapmadıysanız Azure CLI'yi yükleyin ve oturum açın:

az login

Başlamadan önce, Azure ve küme kaynaklarını yapılandırmak için kullanılacak ortam değişkenlerini ayarlayın. Burada listelenen bir yönetilen kimliğiniz, Azure Key Vault'nuz veya başka bir kaynağınız varsa ortam değişkenlerindeki adları bu kaynakları yansıtacak şekilde güncelleştirin. KEYVAULT_NAME genel olarak benzersiz olması gerektiğini unutmayın; bu ad Azure'da zaten kullanılıyorsa keyvault oluşturma işlemi daha sonra başarısız olur.

export RESOURCE_GROUP="AzureArcTest"
export CLUSTER_NAME="AzureArcTest1"
export LOCATION="EastUS"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export AZURE_TENANT_ID="$(az account show -s $SUBSCRIPTION --query tenantId --output tsv)"
export CURRENT_USER="$(az account show --query user.name --output tsv)"
export KEYVAULT_NAME="my-UNIQUE-kv-name"
export KEYVAULT_SECRET_NAME="my-secret"
export USER_ASSIGNED_IDENTITY_NAME="my-identity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="my-credential"
export KUBERNETES_NAMESPACE="my-namespace"
export SERVICE_ACCOUNT_NAME="my-service-account"

Gerekirse kaynak grubunu oluşturun:

az group create --name ${RESOURCE_GROUP}  --location ${LOCATION}

Kümenizde iş yükü kimlik federasyonunu etkinleştirin.

SSE, Azure Key Vault gizli dizilerine erişmek ve bu gizli dizileri eşitlemek için iş yükü kimlik federasyonu adlı bir özellik kullanır. Bu bölümde özelliğin nasıl ayarlanacağı açıklanmaktadır. Aşağıdaki bölümlerde nasıl kullanıldığı ayrıntılı olarak açıklanmaktadır.

İpucu

Aşağıdaki adımlar, Arc özellikli Kubernetes'i iş yükü kimlik federasyonuyla yapılandırmaya yönelik Nasıl Yapılır kılavuzuna dayanır. Ek yardım için bu belgelere bakın.

Kümeniz henüz Azure Arc'a bağlı değilse şu adımları izleyin. Bu adımlar sırasında, komutun bir parçası olarak iş yükü kimliği federasyonunu connect etkinleştirin:

az connectedk8s connect --name ${CLUSTER_NAME} --resource-group ${RESOURCE_GROUP} --enable-oidc-issuer

Kümeniz zaten Azure Arc'a bağlıysa komutunu kullanarak update iş yükü kimliğini etkinleştirin:

az connectedk8s update --name ${CLUSTER_NAME} --resource-group ${RESOURCE_GROUP} --enable-oidc-issuer

Şimdi kümenizi, Microsoft Entra Id'nin bu belirteçleri doğrulamak için gerekli ortak anahtarları bulmasını sağlayan yeni bir veren URL'si (service-account-issuer) ile hizmet hesabı belirteçleri düzenleyebilecek şekilde yapılandırın. Bu ortak anahtarlar, kümenin kendi hizmet hesabı belirteci oluşturucuya aittir ve daha önce ayarladığınız --enable-oidc-issuer seçeneği bir sonucu olarak bu URL'de elde edildi ve bulutta barındırılıyor.

İsteğe bağlı olarak, erişim denetleyicisini yapılandırarak SSE'nin kendi izinlerindeki sınırları denetim düzleminde çalışan ayrıcalıklı bir kaynak olarak da yapılandırabilirsiniz.OwnerReferencesPermissionEnforcement Bu erişim denetleyicisi, SSE'nin kümedeki diğer nesneleri ne kadar değiştirebileceğini kısıtlar.

  1. Kendi kube-apiserver'ınızı, verici URL alanı ve izin uygulanması ile yapılandırın. Aşağıdaki örnek k3s kümesi içindir. Kümenizin API sunucusu bağımsız değişkenlerini değiştirmek için farklı yöntemleri olabilir: --kube-apiserver-arg="--service-account-issuer=${SERVICE_ACCOUNT_ISSUER}", --kube-apiserver-arg=service-account-max-token-expiration=24h ve --kube-apiserver-arg="--enable-admission-plugins=OwnerReferencesPermissionEnforcement".

    • Hizmet hesabı veren URL'sini alın.

      export SERVICE_ACCOUNT_ISSUER="$(az connectedk8s show --name ${CLUSTER_NAME} --resource-group ${RESOURCE_GROUP} --query "oidcIssuerProfile.issuerUrl" --output tsv)"
      echo $SERVICE_ACCOUNT_ISSUER
      
    • K3s kümesinin yapılandırma dosyasındaki API sunucusu bağımsız değişkenlerini güncelleştirin.

      cat <<EOF > /tmp/k3s-config.yaml
      kube-apiserver-arg:
          - 'service-account-issuer=${SERVICE_ACCOUNT_ISSUER}'
          - 'service-account-max-token-expiration=24h'
          - 'enable-admission-plugins=OwnerReferencesPermissionEnforcement'
      EOF
      sudo mv /tmp/k3s-config.yaml /etc/rancher/k3s/config.yaml
      
  2. kube-apiserver'ınızı yeniden başlatın.

    sudo systemctl restart k3s
    
  3. (isteğe bağlı) Hizmet hesabı verenin doğru yapılandırıldığını doğrulayın:

    kubectl cluster-info dump | grep service-account-issuer
    

Bir gizli anahtar oluşturun ve buna erişmek için bir kimlik yapılandırın

Belirli bir Azure Key Vault gizli dizisine erişmek ve bunları eşitlemek için SSE, bu gizli diziye erişmek için uygun Azure izinlerine sahip bir Azure yönetilen kimliğine erişim gerektirir. Yönetilen kimlik, daha önce etkinleştirdiğiniz iş yükü kimliği özelliği kullanılarak bir Kubernetes hizmet hesabına bağlanmalıdır. SSE, Azure Key Vault'taki sırları Kubernetes için gizli bilgilerin depolandığı alanınıza çekmek amacıyla ilişkili federasyonlu Azure yönetilen kimliğini kullanır. Aşağıdaki bölümlerde bunun nasıl ayarlanacağı açıklanmaktadır.

Azure Key Vault oluşturma

Azure Key Vault oluşturun ve bir gizli ekleyin. Zaten bir Azure Key Vault ve gizli anahtarınız varsa bu bölümü atlayabilirsiniz.

  1. Azure Key Vault oluşturma:

    az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --name "${KEYVAULT_NAME}" --enable-rbac-authorization
    
  2. Kasada kendi kendinize 'Gizli Bilgi Yetkilisi' yetkilerini verin ki bir gizli bilgi oluşturabilin.

    az role assignment create --role "Key Vault Secrets Officer" --assignee ${CURRENT_USER} --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    

    İpucu

    Bu komut koşullu erişim ilkeleri nedeniyle başarısız olursa, bunun yerine Azure portalını kullanarak hesabınıza 'Gizli Dizi Sorumlusu' rolünü atayabilirsiniz.

  3. Bir gizli oluşturun ve iki sürümü olacak şekilde güncelleyin.

    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello2'
    

Kullanıcı tarafından atanan yönetilen kimlik oluşturma

Ardından, kullanıcı tarafından atanan bir yönetilen kimlik oluşturun ve Azure Key Vault'a erişim izinleri verin. Azure Key Vault'ta Key Vault Okuyucu ve Gizli Kullanıcı izinlerine sahip yönetilen bir kimliğe zaten sahipseniz, bu bölümü atlayabilirsiniz. Daha fazla bilgi için bkz. Kullanıcı tarafından atanan yönetilen kimlik oluşturma ve Key Vault ile Azure RBAC gizli dizisini, anahtarını ve sertifika izinlerini kullanma.

  1. Kullanıcı tarafından atanan yönetilen kimliği oluşturun:

    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
    
  2. Kimliğe Key Vault Okuyucu ve Key Vault Sırları Kullanıcısı izinleri verin. Bu komutların başarılı olması için kimlik oluşturma işleminin tamamlanmasını beklemeniz gerekebilir.

    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
    az role assignment create --role "Key Vault Reader" --assignee "${USER_ASSIGNED_CLIENT_ID}" --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    az role assignment create --role "Key Vault Secrets User" --assignee "${USER_ASSIGNED_CLIENT_ID}" --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    

Federasyon kimlik bilgisi oluştur

İş yükünün gizli bilgilere erişmesi için bir Kubernetes hizmet hesabı oluşturun. Ardından, yönetilen kimlik ile OIDC hizmet hesabı yayımlayıcısı ve Kubernetes hizmet hesabı arasında bağlantı kurmak için bir federasyon kimliği kimlik bilgisi oluşturun.

  1. Yönetilen kimliğe federasyon olarak bağlanacak bir Kubernetes hizmet hesabı oluşturun. İlgili kullanıcı tarafından atanan yönetilen kimliğin ayrıntılarını açıklayın.

    kubectl create ns ${KUBERNETES_NAMESPACE}
    
    cat <<EOF | kubectl apply -f -
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: ${SERVICE_ACCOUNT_NAME}
        namespace: ${KUBERNETES_NAMESPACE}
    EOF
    
  2. Bir federe kimlik bilgisi oluşturun.

    az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name ${USER_ASSIGNED_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --issuer ${SERVICE_ACCOUNT_ISSUER} --subject system:serviceaccount:${KUBERNETES_NAMESPACE}:${SERVICE_ACCOUNT_NAME} --audience api://AzureADTokenExchange
    

SSE'yi yükleme

SSE, Azure Arc uzantısı olarak kullanılabilir. Azure Arc özellikli Kubernetes kümesi, Azure Arc özellikli Kubernetes uzantılarıyla genişletilebilir. Uzantılar, bağlı kümenizde Azure özelliklerini etkinleştirir ve uzantı yükleme ve yaşam döngüsü yönetimi için Azure Resource Manager temelli bir deneyim sağlar.

cert-manager ve trust-manager, küme hizmetleri arasındaki günlüklerin güvenli iletişimi için de gereklidir ve Arc uzantısından önce yüklenmelidir.

  1. cert-manager'ı yükleyin.

    helm repo add jetstack https://charts.jetstack.io/ --force-update
    helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true 
    
  2. trust-manager'ı yükleyin.

    helm upgrade trust-manager jetstack/trust-manager --install --namespace cert-manager --wait
    
  3. Aşağıdaki komutu kullanarak Arc özellikli kümenize SSE yükleyin:

    az k8s-extension create \
      --cluster-name ${CLUSTER_NAME} \
      --cluster-type connectedClusters \
      --extension-type microsoft.azure.secretstore \
      --resource-group ${RESOURCE_GROUP} \
      --name ssarcextension \
      --scope cluster
    

    İsterseniz, --configuration-settings rotationPollIntervalInSeconds=<time_in_seconds> ekleyerek varsayılan döndürme yoklama aralığını değiştirebilirsiniz ( yapılandırma referansına bakın).

SSE'yi yapılandırma

Yüklü uzantıyı, Azure Key Vault'unuz ve kümenizle eşitlenecek gizli bilgileri belirtmek için Kubernetes özel kaynaklarının örneklerini tanımlayarak yapılandırın.

SSE, çoğu kullanım örneğine uyacak şekilde tasarlanmış tek bir basitleştirilmiş kaynakla yapılandırılabilir veya SSE iç bileşenleri doğrudan iki kaynak aracılığıyla yapılandırılabilir. Basitleştirilmiş yapılandırma bir önizleme özelliğidir ve gelecek sürümlerde yapılan küçük değişikliklerden yararlanabilir. Doğrudan yapılandırma stili tüm dağıtımlar için kullanılabilir durumda kalır.

SSE'yi yapılandırmanın en kolay yolu özel bir AKVSync kaynak oluşturmaktır. Bu kaynak, AKV örneğinizle ilgili ayrıntıları, hangi gizli verilerin getirileceğini ve bunların Kubernetes'in gizli veri deposuna nereye yerleştirileceğini yakalar.

cat <<EOF > akvsync.yaml
kind: AKVSync
apiVersion: secret-sync.x-k8s.io/v1alpha1
metadata:
  name: my-akv-secrets
  namespace: ${KUBERNETES_NAMESPACE}
spec:
  keyvaultName: ${KEYVAULT_NAME}
  clientID: "${USER_ASSIGNED_CLIENT_ID}"
  tenantID: "${AZURE_TENANT_ID}"
  serviceAccountName: ${SERVICE_ACCOUNT_NAME}
  objects:
    - secretInAKV: ${KEYVAULT_SECRET_NAME}
EOF

Ekstra yapılandırma kılavuzuna ulaşmak için AKVSync başvurusuna bakın.

Yapılandırmayı uygulama

Komutunu kullanarak kubectl apply yapılandırma özel kaynağını (CR) uygulayın:

kubectl apply -f ./akvsync.yaml

Bir AKVSync yapılandırma uygulandığında SSE otomatik olarak eşdeğer doğrudan yapılandırma kaynakları oluşturur. Otomatik olarak oluşturulan SecretSync ve SecretProviderClass kaynakları değiştirmeyin, gerektiğinde otomatik olarak güncelleştirilir.

SSE gizli bilgileri otomatik olarak arar ve kümeyle senkronize etmeye başlar.

Küme ile senkronize edilen gizli bilgileri gözlemleyin

Yapılandırma uygulandıktan sonra, gizli bilgiler, SSE kurulumu sırasında belirtilen sıklıkla kümeyle otomatik olarak eşitlenmeye başlar.

Eşitlenmiş gizli bilgileri görüntüle

Aşağıdaki komutu çalıştırarak kümeyle eşitlenen sırları görüntüleyin:

# View a list of all secrets in the namespace
kubectl get secrets -n ${KUBERNETES_NAMESPACE}

İpucu

-o yaml veya -o json ekleyerek kubectl get ve kubectl describe komutlarının çıktı biçimini değiştirin.

Gizli değeri görüntüle

Şimdi Kubernetes gizli dizi deposunda depolanan eşitlenmiş gizli dizi değerini görüntülemek için aşağıdaki komutu kullanın:

kubectl get secret <NAME> -n ${KUBERNETES_NAMESPACE} -o jsonpath="{.data.v0}" | base64 -d && echo

<NAME> , ${KEYVAULT_SECRET_NAME} basitleştirilmiş yapılandırma örneğini kullanıyorsanız veya secret-sync-name doğrudan yapılandırma örneğini kullanıyorsanız.

Sorun giderme

Sorunları tanılama ve çözme konusunda yardım için sorun giderme kılavuzuna bakın.

SSE'yi kaldırma

SSE'yi kaldırmak ve gizli anahtarların eşitlemesini durdurmak için şu komutu kullanın: az k8s-extension delete

az k8s-extension delete --name ssarcextension --cluster-name $CLUSTER_NAME  --resource-group $RESOURCE_GROUP  --cluster-type connectedClusters    

Uzantının kaldırılması kümeden gizli dizileri veya CRD'leri (AKVSync, SecretSyncveya SecretProviderClass) kaldırmaz. Bu nesneler doğrudan kubectl ile kaldırılmalıdır.

Varsayılan olarak, silme SecretSync veya AKVSync kaynak içinde tanımlanan tüm gizli dizileri kaldırır, ancak aşağıdaki durumlarda gizli diziler kalıcı olabilir:

  • Sırlardan herhangi birinin sahipliğinde değişiklik yaptınız.
  • Kümenizde çöp toplama ayarlarını, farklı sonlandırıcılar ayarlamayı da içerecek şekilde değiştirdiniz.

Böyle durumlarda gizli diziler kullanılarak doğrudan kubectlsilinmelidir.

Sonraki adımlar