Azure kubernetes hizmetinde kubernetes rol tabanlı erişim denetimi ve Azure Active Directory kimliklerini kullanarak küme kaynaklarına erişimi denetleme

Azure kubernetes hizmeti (aks), kullanıcı kimlik doğrulaması için Azure Active Directory (AD) kullanacak şekilde yapılandırılabilir. Bu yapılandırmada, bir Azure AD kimlik doğrulama belirteci kullanarak bir AKS kümesinde oturum açın. Kimliği doğrulandıktan sonra, yerleşik Kubernetes rol tabanlı erişim denetimini (Kubernetes RBAC) kullanarak, bir kullanıcının kimliğini veya grup üyeliğini temel alarak ad alanlarına ve küme kaynaklarına erişimi yönetebilirsiniz.

Bu makalede, Azure AD grup üyeliğine dayanan bir AKS kümesinde Kubernetes RBAC kullanarak erişimin nasıl denetlediğiniz gösterilmektedir. Örnek gruplar ve kullanıcılar Azure AD 'de oluşturulur, ardından kaynaklar oluşturmak ve görüntülemek için uygun izinleri vermek üzere AKS kümesinde roller ve RoleBindings oluşturulur.

Başlamadan önce

Bu makalede, Azure AD tümleştirmesi ile mevcut bir AKS kümeniz olduğunu varsaymaktadır. aks kümesine ihtiyacınız varsa bkz. Azure Active Directory aks ile tümleştirme.

Azure CLı sürüm 2.0.61 veya sonraki bir sürümün yüklü ve yapılandırılmış olması gerekir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Azure AD 'de tanıtım grupları oluşturma

Bu makalede, Kubernetes RBAC ve Azure AD denetimi 'nin küme kaynaklarına nasıl erişiminin olduğunu göstermek için kullanılabilecek iki kullanıcı rolü oluşturalım. Aşağıdaki iki örnek rol kullanılır:

  • Uygulama geliştiricisi
    • AppDev grubunun bir parçası olan aksdev adlı bir kullanıcı.
  • Site güvenilirliği mühendisi
    • Opssre grubunun bir parçası olan akssre adlı bir kullanıcı.

Üretim ortamlarında, bir Azure AD kiracısı içinde mevcut kullanıcıları ve grupları kullanabilirsiniz.

İlk olarak, az aks Show komutunu kullanarak aks KÜMENIZIN kaynak kimliğini alın. Kaynak KIMLIĞINI AKS_ID adlı bir değişkene atayın, böylece ek komutlarda başvurulabilirler.

AKS_ID=$(az aks show \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --query id -o tsv)

Az Ad Group Create komutunu kullanarak uygulama geliştiricileri IÇIN Azure AD 'de ilk örnek grubunu oluşturun. Aşağıdaki örnek AppDev adlı bir grup oluşturur:

APPDEV_ID=$(az ad group create --display-name appdev --mail-nickname appdev --query objectId -o tsv)

Şimdi, az role atama Create komutunu kullanarak AppDev grubu için bir Azure rol ataması oluşturun. Bu atama, grubun herhangi bir üyesinin kubectl Azure Kubernetes hizmet kümesi Kullanıcı rolü vererek bir aks kümesiyle etkileşime geçmesini sağlar.

az role assignment create \
  --assignee $APPDEV_ID \
  --role "Azure Kubernetes Service Cluster User Role" \
  --scope $AKS_ID

İpucu

Gibi bir hata alırsanız Principal 35bfec9328bd4d8d9b54dea6dac57b82 does not exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5. , Azure AD grubu nesne kimliğinin dizin aracılığıyla yayılması için birkaç saniye bekleyin ve sonra az role assignment create komutu tekrar deneyin.

İkinci bir örnek grup oluşturun; Bu bir tane, opssre adlı SRES için:

OPSSRE_ID=$(az ad group create --display-name opssre --mail-nickname opssre --query objectId -o tsv)

Daha sonra, Azure Kubernetes hizmet kümesi Kullanıcı rolünü grubun üyelerine vermek Için bir Azure rol ataması oluşturun:

az role assignment create \
  --assignee $OPSSRE_ID \
  --role "Azure Kubernetes Service Cluster User Role" \
  --scope $AKS_ID

Azure AD 'de tanıtım kullanıcıları oluşturma

Uygulama geliştiricilerimiz ve SREs için Azure AD 'de oluşturulan iki örnek grup ile, artık iki örnek kullanıcı oluşturmaya izin verir. Makalenin sonundaki Kubernetes RBAC tümleştirmesini test etmek için, AKS kümesinde bu hesaplarla oturum açın.

Uygulama geliştiricileri için Kullanıcı asıl adını (UPN) ve parolayı ayarlayın. Aşağıdaki komut, UPN için sizi uyarır ve daha sonraki bir komutta kullanılmak üzere AAD_DEV_UPN ayarlar (Bu makaledeki komutların bash kabuğu 'na girildiğini unutmayın). UPN, kiracınızın doğrulanmış etki alanı adını (örneğin,) içermelidir aksdev@contoso.com .

echo "Please enter the UPN for application developers: " && read AAD_DEV_UPN

Aşağıdaki komut, parolayı ister ve daha sonra kullanmak üzere AAD_DEV_PW olarak ayarlar.

echo "Please enter the secure password for application developers: " && read AAD_DEV_PW

Az ad User Create komutunu kullanarak Azure AD 'de ilk kullanıcı hesabını oluşturun.

Aşağıdaki örnek, AAD_DEV_UPN ve AAD_DEV_PW değerlerini kullanarak görünen ad aks dev ve UPN ve güvenli parola ile bir kullanıcı oluşturur:

AKSDEV_ID=$(az ad user create \
  --display-name "AKS Dev" \
  --user-principal-name $AAD_DEV_UPN \
  --password $AAD_DEV_PW \
  --query objectId -o tsv)

Şimdi, az Ad Group member Add komutunu kullanarak kullanıcıyı önceki bölümde oluşturulan AppDev grubuna ekleyin:

az ad group member add --group appdev --member-id $AKSDEV_ID

SREs için UPN ve parolayı ayarlayın. Aşağıdaki komut, UPN için sizi uyarır ve daha sonraki bir komutta kullanılmak üzere AAD_SRE_UPN ayarlar (Bu makaledeki komutların bash kabuğu 'na girildiğini unutmayın). UPN, kiracınızın doğrulanmış etki alanı adını (örneğin,) içermelidir akssre@contoso.com .

echo "Please enter the UPN for SREs: " && read AAD_SRE_UPN

Aşağıdaki komut, parolayı ister ve daha sonra kullanmak üzere AAD_SRE_PW olarak ayarlar.

echo "Please enter the secure password for SREs: " && read AAD_SRE_PW

İkinci bir kullanıcı hesabı oluşturun. Aşağıdaki örnek, AAD_SRE_UPN ve AAD_SRE_PW değerlerini kullanarak görünen adı aks SRE ve UPN ve güvenli parola ile birlikte bir kullanıcı oluşturur:

# Create a user for the SRE role
AKSSRE_ID=$(az ad user create \
  --display-name "AKS SRE" \
  --user-principal-name $AAD_SRE_UPN \
  --password $AAD_SRE_PW \
  --query objectId -o tsv)

# Add the user to the opssre Azure AD group
az ad group member add --group opssre --member-id $AKSSRE_ID

Uygulama geliştiriciler için aks kümesi kaynakları oluşturma

Azure AD grupları ve kullanıcılar artık oluşturulmuştur. Grup üyelerinin, bir AKS kümesine normal kullanıcı olarak bağlanması için Azure rol atamaları oluşturulmuştur. Şimdi bu farklı grupların belirli kaynaklara erişmesine izin vermek için AKS kümesini yapılandıralim.

İlk olarak, az aks Get-Credentials komutunu kullanarak küme yöneticisi kimlik bilgilerini alın. Aşağıdaki bölümlerden birinde, Azure AD kimlik doğrulama akışını eylemde görmek için normal Kullanıcı kümesi kimlik bilgilerini alırsınız.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin

Kubectl Create Namespace komutunu kullanarak aks kümesinde bir ad alanı oluşturun. Aşağıdaki örnek, bir ad alanı adı geliştirme oluşturur:

kubectl create namespace dev

Kubernetes 'te Roller verilecek izinleri tanımlar ve rolebindings bunları istenen kullanıcılara veya gruplara uygular. Bu atamalar, belirli bir ad alanına veya tüm küme genelinde uygulanabilir. Daha fazla bilgi için bkz. Kubernetes RBAC yetkilendirmesini kullanma.

İlk olarak, dev ad alanı Için bir rol oluşturun. Bu rol, ad alanına tam izinler verir. Üretim ortamlarında, farklı kullanıcılar veya gruplar için daha ayrıntılı izinler belirtebilirsiniz.

Adlı bir dosya oluşturun role-dev-namespace.yaml ve aşağıdaki YAML bildirimini yapıştırın:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-user-full-access
  namespace: dev
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]

Kubectl Apply komutunu kullanarak rolü oluşturun ve YAML bildiriminizde dosya adını belirtin:

kubectl apply -f role-dev-namespace.yaml

Ardından, az Ad Group Show komutunu kullanarak AppDev grubunun kaynak kimliğini alın. Bu grup bir sonraki adımda RoleBinding konusunun konusu olarak ayarlanır.

az ad group show --group appdev --query objectId -o tsv

Şimdi, ad alanı erişimi için önceden oluşturulmuş rolü kullanmak üzere AppDev grubu Için bir rolebinding oluşturun. Adlı bir dosya oluşturun rolebinding-dev-namespace.yaml ve aşağıdaki YAML bildirimini yapıştırın. Son satırda, Groupobjectıd ' yi önceki komuttan gelen nesne kimliği çıkışıyla değiştirin:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-user-access
  namespace: dev
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dev-user-full-access
subjects:
- kind: Group
  namespace: dev
  name: groupObjectId

Kubectl Apply komutunu kullanarak rolebinding oluşturun ve YAML bildiriminizde dosya adını belirtin:

kubectl apply -f rolebinding-dev-namespace.yaml

SREs için AKS kümesi kaynakları oluşturma

Şimdi, SREs için bir ad alanı, rol ve RoleBinding oluşturmak üzere önceki adımları tekrarlayın.

İlk olarak, kubectl Create Namespace komutunu kullanarak SRE için bir ad alanı oluşturun:

kubectl create namespace sre

Adlı bir dosya oluşturun role-sre-namespace.yaml ve aşağıdaki YAML bildirimini yapıştırın:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-user-full-access
  namespace: sre
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]

Kubectl Apply komutunu kullanarak rolü oluşturun ve YAML bildiriminizde dosya adını belirtin:

kubectl apply -f role-sre-namespace.yaml

Az Ad Group Show komutunu kullanarak opssre grubunun kaynak kimliğini alın:

az ad group show --group opssre --query objectId -o tsv

Opssre grubu için, ad alanı erişimi için önceden oluşturulmuş rolü kullanmak üzere bir rolebinding oluşturun. Adlı bir dosya oluşturun rolebinding-sre-namespace.yaml ve aşağıdaki YAML bildirimini yapıştırın. Son satırda, Groupobjectıd ' yi önceki komuttan gelen nesne kimliği çıkışıyla değiştirin:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-user-access
  namespace: sre
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: sre-user-full-access
subjects:
- kind: Group
  namespace: sre
  name: groupObjectId

Kubectl Apply komutunu kullanarak rolebinding oluşturun ve YAML bildiriminizde dosya adını belirtin:

kubectl apply -f rolebinding-sre-namespace.yaml

Azure AD kimliklerini kullanarak küme kaynaklarıyla etkileşim kurma

Şimdi, bir AKS kümesinde kaynak oluşturup yönetirken beklenen izinlerin çalışmasını test edelim. Bu örneklerde, Pod 'yi kullanıcının atanan ad alanında zamanlar ve görüntüleyebilirsiniz. Ardından, atanan ad alanının dışında Pod 'yi zamanlamayı ve görüntülemeyi deneyolursunuz.

İlk olarak, az aks Get-Credentials komutunu kullanarak kubeconfig bağlamını sıfırlayın. Önceki bölümde, Küme Yöneticisi kimlik bilgilerini kullanarak bağlamı ayarlarsınız. Yönetici Kullanıcı Azure AD oturum açma istemlerini atlar. Parametresi olmadan --admin , tüm Isteklerin Azure AD ile doğrulanmasını gerektiren Kullanıcı bağlamı uygulanır.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing

Geliştirme ad alanındaki kubectl Run komutunu kullanarak temel NGINX Pod 'u zamanlayın:

kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

Oturum açma isteminde, makalenin başlangıcında oluşturulan kendi hesabınızın kimlik bilgilerini girin appdev@contoso.com . Başarıyla oturum açtıktan sonra, hesap belirteci gelecekteki komutlar için önbelleğe alınır kubectl . Aşağıdaki örnek çıktıda gösterildiği gibi NGıNX başarıyla zamanlanır:

$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code B24ZD6FP8 to authenticate.

pod/nginx-dev created

Şimdi, dev ad alanındaki Pod 'yi görüntülemek için kubectl Get Pod komutunu kullanın.

kubectl get pods --namespace dev

Aşağıdaki örnek çıktıda gösterildiği gibi, NGıNX Pod, başarıyla çalışıyor:

$ kubectl get pods --namespace dev

NAME        READY   STATUS    RESTARTS   AGE
nginx-dev   1/1     Running   0          4m

Atanan ad alanının dışında küme kaynakları oluşturma ve görüntüleme

Şimdi de dev ad alanı dışında Pod görüntülemeyi deneyin. Şu şekilde görmek için kubectl Get Pod komutunu tekrar kullanın --all-namespaces :

kubectl get pods --all-namespaces

Kullanıcının grup üyeliğinde, bu eyleme izin veren bir Kubernetes rolü yoktur, çünkü aşağıdaki örnek çıktıda gösterildiği gibi:

$ kubectl get pods --all-namespaces

Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot list resource "pods" in API group "" at the cluster scope

Aynı şekilde, farklı bir ad alanında (örneğin, SRE ad alanı) bir pod zamanlamaya çalışın. Aşağıdaki örnek çıktıda gösterildiği gibi, kullanıcının grup üyeliği bir Kubernetes rolü ve RoleBinding ile hizalanmaz:

$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre

Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot create resource "pods" in API group "" in the namespace "sre"

AKS kümesi kaynaklarına erişimi test etme

Azure AD grup üyeliğimizin ve Kubernetes RBAC 'in farklı kullanıcılar ve gruplar arasında doğru şekilde çalıştığını onaylamak için, opssre kullanıcısı olarak oturum açıldığında önceki komutları deneyin.

Diğer aks Get-Credentials komutunu kullanarak kubeconfig bağlamını sıfırlayın ve bu, daha önce önbelleğe alınmış kimlik doğrulama belirtecini aksdev kullanıcısına temizler:

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing

Atanan SRE ad alanında Pod 'yi zamanlamayı ve görüntülemeyi deneyin. İstendiğinde, opssre@contoso.com makalenin başlangıcında oluşturduğunuz kendi kimlik bilgilerinizle oturum açın:

kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
kubectl get pods --namespace sre

Aşağıdaki örnek çıktıda gösterildiği gibi, pods 'yi başarıyla oluşturabilir ve görüntüleyebilirsiniz:

$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code BM4RHP3FD to authenticate.

pod/nginx-sre created

$ kubectl get pods --namespace sre

NAME        READY   STATUS    RESTARTS   AGE
nginx-sre   1/1     Running   0

Şimdi, atanmış SRE ad alanı dışında bir pod görüntülemeyi veya zamanlamayı deneyin:

kubectl get pods --all-namespaces
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

kubectlAşağıdaki örnek çıktıda gösterildiği gibi bu komutlar başarısız olur. Kullanıcının grup üyeliği ve Kubernetes rolü ve RoleBindings, diğer ad alanlarında kaynak oluşturma veya Yönetici kaynakları için izin vermez:

$ kubectl get pods --all-namespaces
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot list pods at the cluster scope

$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot create pods in the namespace "dev"

Kaynakları temizleme

Bu makalede, Azure AD 'de AKS kümesinde ve kullanıcılar ve gruplar 'daki kaynakları oluşturdunuz. Tüm bu kaynakları temizlemek için aşağıdaki komutları çalıştırın:

# Get the admin kubeconfig context to delete the necessary cluster resources
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin

# Delete the dev and sre namespaces. This also deletes the pods, Roles, and RoleBindings
kubectl delete namespace dev
kubectl delete namespace sre

# Delete the Azure AD user accounts for aksdev and akssre
az ad user delete --upn-or-object-id $AKSDEV_ID
az ad user delete --upn-or-object-id $AKSSRE_ID

# Delete the Azure AD groups for appdev and opssre. This also deletes the Azure role assignments.
az ad group delete --group appdev
az ad group delete --group opssre

Sonraki adımlar

Kubernetes kümelerinin güvenliğini sağlama hakkında daha fazla bilgi için bkz. AKS Için erişim ve kimlik seçenekleri.

Kimlik ve kaynak denetiminde en iyi uygulamalar için bkz. AKS 'de kimlik doğrulama ve yetkilendirme Için en iyi uygulamalar.