Kontrollera åtkomsten till klusterresurser med hjälp av rollbaserad åtkomstkontroll i Kubernetes och Azure Active Directory identiteter i Azure Kubernetes Service

Azure Kubernetes Service (AKS) kan konfigureras att använda Azure Active Directory (AD) för användarautentisering. I den här konfigurationen loggar du in på ett AKS-kluster med en Azure AD-autentiseringstoken. När autentiseringen är klar kan du använda den inbyggda Kubernetes-rollbaserade åtkomstkontrollen (Kubernetes RBAC) för att hantera åtkomst till namnrymder och klusterresurser baserat på en användares identitet eller gruppmedlemskap.

Den här artikeln visar hur du styr åtkomst med Kubernetes RBAC i ett AKS-kluster baserat på Azure AD-gruppmedlemskap. Exempelgrupper och användare skapas i Azure AD. Sedan skapas roller och rollbindningar i AKS-klustret för att ge lämpliga behörigheter för att skapa och visa resurser.

Innan du börjar

Den här artikeln förutsätter att du har ett befintligt AKS-kluster aktiverat med Azure AD-integrering. Om du behöver ett AKS-kluster kan du gå till Azure Active Directory med AKS.

Azure CLI version 2.0.61 eller senare måste vara installerat och konfigurerat. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.

Skapa demogrupper i Azure AD

I den här artikeln ska vi skapa två användarroller som kan användas för att visa hur Kubernetes RBAC och Azure AD styr åtkomsten till klusterresurser. Följande två exempelroller används:

  • Programutvecklare
    • En användare med namnet aksdev som ingår i appdev-gruppen.
  • Tekniker för webbplatstillförlitlighet
    • En användare med namnet akssre som är en del av opssre-gruppen.

I produktionsmiljöer kan du använda befintliga användare och grupper i en Azure AD-klientorganisation.

Hämta först resurs-ID:t för ditt AKS-kluster med kommandot az aks show. Tilldela resurs-ID:t till en variabel AKS_ID så att den kan refereras till i ytterligare kommandon.

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

Skapa den första exempelgruppen i Azure AD för programutvecklare med kommandot az ad group create. I följande exempel skapas en grupp med namnet appdev:

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

Skapa nu en Azure-rolltilldelning för appdev-gruppen med kommandot az role assignment create. Med den här tilldelningen kan alla medlemmar i gruppen interagera med ett AKS-kluster genom att ge dem kubectl Azure Kubernetes Service-klusteranvändarrollen.

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

Tips

Om du får ett felmeddelande som väntar du några sekunder på att objekt-ID:t för Azure AD-gruppen ska spridas genom katalogen och Principal 35bfec9328bd4d8d9b54dea6dac57b82 does not exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5. försöker sedan med kommandot az role assignment create igen.

Skapa en andra exempelgrupp, den här för SRE:er med namnet opssre:

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

Skapa återigen en Azure-rolltilldelning för att bevilja medlemmar i gruppen Azure Kubernetes Service klusteranvändarrollen:

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

Skapa demoanvändare i Azure AD

Med två exempelgrupper som skapats i Azure AD för våra programutvecklare och SRE:er kan vi nu skapa två exempelanvändare. Om du vill testa Kubernetes RBAC-integreringen i slutet av artikeln loggar du in på AKS-klustret med dessa konton.

Ange användarens huvudnamn (UPN) och lösenord för programutvecklaren. Följande kommando uppmanar dig att ange UPN och anger det till AAD_DEV_UPN för användning i ett senare kommando (kom ihåg att kommandona i den här artikeln anges i ett BASH-gränssnitt). UPN måste innehålla det verifierade domännamnet för din klientorganisation, till exempel aksdev@contoso.com .

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

Följande kommando uppmanar dig att ange lösenordet och anger det till AAD_DEV_PW för användning i ett senare kommando.

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

Skapa det första användarkontot i Azure AD med kommandot az ad user create.

I följande exempel skapas en användare med visningsnamnet AKS Dev och UPN och ett säkert lösenord med hjälp av värdena i AAD_DEV_UPN och AAD_DEV_PW:

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

Lägg nu till användaren i den appdev-grupp som skapades i föregående avsnitt med kommandot az ad group member add:

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

Ange UPN och lösenord för SRE:er. Följande kommando uppmanar dig att ange UPN och anger det till AAD_SRE_UPN för användning i ett senare kommando (kom ihåg att kommandona i den här artikeln anges i ett BASH-gränssnitt). UPN måste innehålla det verifierade domännamnet för din klientorganisation, till exempel akssre@contoso.com .

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

Följande kommando uppmanar dig att ange lösenordet och anger det till AAD_SRE_PW för användning i ett senare kommando.

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

Skapa ett andra användarkonto. I följande exempel skapas en användare med visningsnamnet AKS SRE och UPN och ett säkert lösenord med hjälp av värdena i AAD_SRE_UPN och AAD_SRE_PW:

# 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

Skapa AKS-klusterresurser för apputveckling

Nu skapas Azure AD-grupper och -användare. Azure-rolltilldelningar har skapats för att gruppmedlemmarna ska kunna ansluta till ett AKS-kluster som en vanlig användare. Nu ska vi konfigurera AKS-klustret så att de olika grupperna får åtkomst till specifika resurser.

Hämta först autentiseringsuppgifterna för klusteradministratören med hjälp av kommandot az aks get-credentials. I något av följande avsnitt får du vanliga autentiseringsuppgifter för användarkluster för att se hur Azure AD-autentiseringsflödet fungerar i praktiken.

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

Skapa ett namnområde i AKS-klustret med kommandot kubectl create namespace. I följande exempel skapas ett namnområdesnamn för dev:

kubectl create namespace dev

I Kubernetes definierar roller behörigheterna som ska beviljas och RoleBindings tillämpar dem på önskade användare eller grupper. Dessa tilldelningar kan tillämpas på ett visst namnområde eller i hela klustret. Mer information finns i Använda Kubernetes RBAC-auktorisering.

Skapa först en roll för utvecklingsnamnrymden. Den här rollen ger fullständiga behörigheter till namnområdet. I produktionsmiljöer kan du ange mer detaljerade behörigheter för olika användare eller grupper.

Skapa en fil med namnet role-dev-namespace.yaml och klistra in följande YAML-manifest:

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: ["*"]

Skapa rollen med kommandot kubectl apply och ange filnamnet för ditt YAML-manifest:

kubectl apply -f role-dev-namespace.yaml

Hämta sedan resurs-ID:t för appdev-gruppen med kommandot az ad group show. Den här gruppen anges som ämne för en RoleBinding i nästa steg.

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

Skapa nu en RoleBinding för appdev-gruppen för att använda den tidigare skapade rollen för åtkomst till namnområdet. Skapa en fil med namnet rolebinding-dev-namespace.yaml och klistra in följande YAML-manifest. På den sista raden ersätter du groupObjectId med utdata för gruppobjekt-ID från föregående kommando:

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

Skapa RoleBinding med kommandot kubectl apply och ange filnamnet för ditt YAML-manifest:

kubectl apply -f rolebinding-dev-namespace.yaml

Skapa AKS-klusterresurser för SRE:er

Upprepa nu föregående steg för att skapa ett namnområde, en roll och en rollbindning för SRE:erna.

Skapa först ett namnområde för sre med kommandot kubectl create namespace:

kubectl create namespace sre

Skapa en fil med namnet role-sre-namespace.yaml och klistra in följande YAML-manifest:

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: ["*"]

Skapa rollen med kommandot kubectl apply och ange filnamnet för ditt YAML-manifest:

kubectl apply -f role-sre-namespace.yaml

Hämta resurs-ID:t för opssre-gruppen med kommandot az ad group show:

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

Skapa en RoleBinding för opssre-gruppen för att använda den tidigare skapade rollen för åtkomst till namnområdet. Skapa en fil med namnet rolebinding-sre-namespace.yaml och klistra in följande YAML-manifest. På den sista raden ersätter du groupObjectId med utdata för gruppobjekt-ID från föregående kommando:

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

Skapa RoleBinding med kommandot kubectl apply och ange filnamnet för ditt YAML-manifest:

kubectl apply -f rolebinding-sre-namespace.yaml

Interagera med klusterresurser med hjälp av Azure AD-identiteter

Nu ska vi testa att de förväntade behörigheterna fungerar när du skapar och hanterar resurser i ett AKS-kluster. I de här exemplen schemalägger och visar du poddar i användarens tilldelade namnområde. Sedan försöker du schemalägga och visa poddar utanför det tilldelade namnområdet.

Återställ först kubeconfig-kontexten med kommandot az aks get-credentials. I ett tidigare avsnitt anger du kontexten med autentiseringsuppgifterna för klusteradministratören. Administratörsanvändaren kringgår uppmaningar om Azure AD-inloggning. Utan --admin parametern tillämpas användarkontexten som kräver att alla begäranden autentiseras med Hjälp av Azure AD.

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

Schemalägg en grundläggande NGINX-podd med kommandot kubectl run i dev-namnområdet:

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

Som inloggningsfråga anger du autentiseringsuppgifterna för ditt appdev@contoso.com eget konto som skapades i början av artikeln. När du har loggat in cachelagras kontotoken för framtida kubectl kommandon. NGINX schemaläggs korrekt, som du ser i följande exempelutdata:

$ 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

Använd nu kommandot kubectl get pods för att visa poddar i dev-namnområdet.

kubectl get pods --namespace dev

Som du ser i följande exempelutdata körs NGINX-podden :

$ kubectl get pods --namespace dev

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

Skapa och visa klusterresurser utanför det tilldelade namnområdet

Försök nu att visa poddar utanför namnområdet dev. Använd kommandot kubectl get pods igen, den här gången för att se --all-namespaces följande:

kubectl get pods --all-namespaces

Användarens gruppmedlemskap har ingen Kubernetes-roll som tillåter den här åtgärden, som du ser i följande exempelutdata:

$ 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

På samma sätt kan du försöka schemalägga en podd i ett annat namnområde, till exempel namnområdet sre. Användarens gruppmedlemskap överensstämmer inte med en Kubernetes-roll och RoleBinding för att bevilja dessa behörigheter, som du ser i följande exempelutdata:

$ 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"

Testa SRE-åtkomsten till AKS-klusterresurserna

För att bekräfta att vårt Azure AD-gruppmedlemskap och Kubernetes RBAC fungerar korrekt mellan olika användare och grupper kan du prova de tidigare kommandona när du är inloggad som opssre-användare.

Återställ kubeconfig-kontexten med kommandot az aks get-credentials som rensar den tidigare cachelagrade autentiseringstoken för aksdev-användaren:

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

Försök att schemalägga och visa poddar i det tilldelade sre-namnområdet. När du uppmanas till det loggar du in med opssre@contoso.com dina egna autentiseringsuppgifter som skapades i början av artikeln:

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

Som du ser i följande exempelutdata kan du skapa och visa poddarna:

$ 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

Försök nu att visa eller schemalägga poddar utanför det tilldelade SRE-namnområdet:

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

Dessa kubectl kommandon misslyckas, som du ser i följande exempelutdata. Användarens gruppmedlemskap och Kubernetes Role och RoleBindings beviljar inte behörighet att skapa eller manager-resurser i andra namnområden:

$ 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"

Rensa resurser

I den här artikeln har du skapat resurser i AKS-klustret och användare och grupper i Azure AD. Kör följande kommandon för att rensa alla dessa resurser:

# 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

Nästa steg

Mer information om hur du skyddar Kubernetes-kluster finns i Åtkomst- och identitetsalternativ för AKS).

Metodtips för identitets- och resurskontroll finns i Metodtips för autentisering och auktorisering i AKS.