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.