Řízení přístupu k prostředkům clusteru pomocí řízení přístupu na základě role Kubernetes a Azure Active Directory identit v Azure Kubernetes Service

Azure Kubernetes Service (AKS) je možné nakonfigurovat tak, aby Azure Active Directory ověřování uživatelů (AD). V této konfiguraci se přihlásíte ke clusteru AKS pomocí ověřovacího tokenu Azure AD. Po ověření můžete použít integrované řízení přístupu na základě role Kubernetes (Kubernetes RBAC) ke správě přístupu k oborům názvů a prostředkům clusteru na základě identity uživatele nebo členství ve skupinách.

Tento článek ukazuje, jak řídit přístup pomocí řízení přístupu na základě role Kubernetes v clusteru AKS na základě členství ve skupině Azure AD. V Azure AD se vytvoří příklady skupin a uživatelů a pak se v clusteru AKS vytvoří vazby rolí a rolí, aby se udělly příslušná oprávnění k vytváření a zobrazování prostředků.

Než začnete

Tento článek předpokládá, že máte existující cluster AKS povolený s integrací Azure AD. Pokud potřebujete cluster AKS, podívejte se na Azure Active Directory s AKS.

Potřebujete mít nainstalované a nakonfigurované Rozhraní příkazového řádku Azure CLI verze 2.0.61 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Vytvoření ukázkových skupin v Azure AD

V tomto článku vytvoříme dvě role uživatele, které můžete použít k zobrazení toho, jak Řízení přístupu na základě role v Kubernetes a Azure AD řídí přístup k prostředkům clusteru. Používají se následující dvě příklady rolí:

  • Vývojář aplikací
    • Uživatel s názvem aksdev, který je součástí skupiny appdev.
  • Technik pro spolehlivost webů
    • Uživatel s názvem akssre, který je součástí skupiny opssre.

V produkčních prostředích můžete použít stávající uživatele a skupiny v rámci tenanta Azure AD.

Nejprve pomocí příkazu az aks show získejte ID prostředku clusteru AKS. Přiřaďte ID prostředku proměnné s názvem AKS_ID, aby na něj bylo možné odkazovat v dalších příkazech.

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

Vytvořte první příklad skupiny v Azure AD pro vývojáře aplikací pomocí příkazu az ad group create. Následující příklad vytvoří skupinu s názvem appdev:

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

Teď vytvořte přiřazení role Azure pro skupinu appdev pomocí příkazu az role assignment create. Toto přiřazení umožňuje, aby každý člen skupiny komunikoval s clusterem AKS tím, že jim udělí kubectl roli uživatele Azure Kubernetes Service clusteru.

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

Tip

Pokud se zobrazí chyba, jako je , počkejte několik sekund, než se ID objektu skupiny Azure AD rozšíří do Principal 35bfec9328bd4d8d9b54dea6dac57b82 does not exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5. adresáře, a pak zkuste az role assignment create příkaz znovu.

Vytvořte druhou příkladovou skupinu– tuto skupinu pro SRE s názvem opssre:

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

Znovu vytvořte přiřazení role Azure, která členům skupiny udělí Azure Kubernetes Service role uživatele clusteru:

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

Vytvoření ukázkových uživatelů v Azure AD

Díky dvěma příkladům skupin vytvořených v Azure AD pro naše vývojáře aplikací a SRE teď vytvoříme dva příklady uživatelů. Pokud chcete otestovat integraci RBAC s Kubernetes na konci článku, přihlaste se ke clusteru AKS pomocí těchto účtů.

Nastavte hlavní název uživatele (UPN) a heslo pro vývojáře aplikací. Následující příkaz vás vyzve k zadání zadat hlavní název uživatele (UPN) a nastaví ho na AAD_DEV_UPN pro použití v pozdějším příkazu (nezapomeňte, že příkazy v tomto článku jsou zadané do prostředí BASH). Hlavní název uživatele musí obsahovat ověřený název domény vašeho tenanta, například aksdev@contoso.com .

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

Následující příkaz vás vyzve k zadání hesla a nastaví ho AAD_DEV_PW pro použití v pozdějším příkazu.

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

Vytvořte první uživatelský účet v Azure AD pomocí příkazu az ad user create.

Následující příklad vytvoří uživatele se zobrazovaným názvem AKS Dev a hlavní název uživatele (UPN) a zabezpečí heslo pomocí hodnot v AAD_DEV_UPN a 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)

Teď přidejte uživatele do skupiny appdev vytvořené v předchozí části pomocí příkazu az ad group member add:

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

Nastavte hlavní název uživatele (UPN) a heslo pro S SREs. Následující příkaz vás vyzve k zadání zadat hlavní název uživatele (UPN) a nastaví ho na AAD_SRE_UPN pro použití v pozdějším příkazu (nezapomeňte, že příkazy v tomto článku jsou zadané do prostředí BASH). Hlavní název uživatele musí obsahovat ověřený název domény vašeho tenanta, například akssre@contoso.com .

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

Následující příkaz vás vyzve k zadání hesla a nastaví ho AAD_SRE_PW pro použití v pozdějším příkazu.

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

Vytvořte druhý uživatelský účet. Následující příklad vytvoří uživatele se zobrazovaným názvem AKS SRE a hlavní název uživatele (UPN) a zabezpečí heslo pomocí hodnot v AAD_SRE_UPN a 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

Vytvoření prostředků clusteru AKS pro vývoj aplikací

Teď se vytvoří skupiny a uživatelé Azure AD. Přiřazení rolí Azure byla vytvořena pro členy skupiny pro připojení ke clusteru AKS jako běžný uživatel. Teď nakonfigurujeme cluster AKS tak, aby těmto různým skupinám umožnil přístup ke konkrétním prostředkům.

Nejprve pomocí příkazu az aks get-credentials získejte přihlašovací údaje správce clusteru. V jedné z následujících částí získáte běžné přihlašovací údaje clusteru uživatelů, abyste viděli tok ověřování Azure AD v akci.

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

Vytvořte obor názvů v clusteru AKS pomocí příkazu kubectl create namespace. Následující příklad vytvoří obor názvů dev:

kubectl create namespace dev

V Kubernetes role definují oprávnění, která se mají udělit, a vazby rolí je aplikují na požadované uživatele nebo skupiny. Tato přiřazení je možné použít pro daný obor názvů nebo napříč celým clusterem. Další informace najdete v tématu Použití autorizace RBAC v Kubernetes.

Nejprve vytvořte roli pro obor názvů dev. Tato role uděluje úplná oprávnění k oboru názvů. V produkčních prostředích můžete pro různé uživatele nebo skupiny zadat podrobnější oprávnění.

Vytvořte soubor s názvem a role-dev-namespace.yaml vložte následující manifest YAML:

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

Vytvořte roli pomocí příkazu kubectl apply a zadejte název souboru manifestu YAML:

kubectl apply -f role-dev-namespace.yaml

Dále pomocí příkazu az ad group show získejte ID prostředku pro skupinu appdev. Tato skupina je v dalším kroku nastavená jako předmět vazby rolí.

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

Teď vytvořte vazby rolí pro skupinu appdev, která bude používat dříve vytvořenou roli pro přístup k oboru názvů. Vytvořte soubor s názvem a rolebinding-dev-namespace.yaml vložte následující manifest YAML. Na posledním řádku nahraďte groupObjectId výstupem ID objektu skupiny z předchozího příkazu:

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

Vytvořte vazby rolí pomocí příkazu kubectl apply a zadejte název souboru manifestu YAML:

kubectl apply -f rolebinding-dev-namespace.yaml

Vytvoření prostředků clusteru AKS pro S SRE

Teď zopakujte předchozí kroky a vytvořte obor názvů, roli a vazby rolí pro S SRE.

Nejprve vytvořte obor názvů pro SRE pomocí příkazu kubectl create namespace:

kubectl create namespace sre

Vytvořte soubor s názvem a role-sre-namespace.yaml vložte následující manifest YAML:

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

Vytvořte roli pomocí příkazu kubectl apply a zadejte název souboru manifestu YAML:

kubectl apply -f role-sre-namespace.yaml

Získejte ID prostředku pro skupinu opssre pomocí příkazu az ad group show:

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

Vytvořte vazby rolí pro skupinu opssre, která bude používat dříve vytvořenou roli pro přístup k oboru názvů. Vytvořte soubor s názvem a rolebinding-sre-namespace.yaml vložte následující manifest YAML. Na posledním řádku nahraďte groupObjectId výstupem ID objektu skupiny z předchozího příkazu:

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

Vytvořte vazby rolí pomocí příkazu kubectl apply a zadejte název souboru manifestu YAML:

kubectl apply -f rolebinding-sre-namespace.yaml

Interakce s prostředky clusteru s využitím identit Azure AD

Teď otestujte, že očekávaná oprávnění fungují při vytváření a správě prostředků v clusteru AKS. V těchto příkladech naplánujte a zobrazte pody v oboru názvů přiřazeném uživatelem. Pak se pokusíte naplánovat a zobrazit pody mimo přiřazený obor názvů.

Nejprve resetujte kontext kubeconfig pomocí příkazu az aks get-credentials. V předchozí části nastavíte kontext pomocí přihlašovacích údajů správce clusteru. Uživatel s rolí správce obchází výzvy k přihlášení k Azure AD. Bez parametru se použije kontext uživatele, který vyžaduje ověření všech požadavků --admin pomocí Azure AD.

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

Naplánujte základní pod NGINX pomocí příkazu kubectl run v oboru názvů dev:

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

Po zobrazení výzvy k přihlášení zadejte přihlašovací údaje k vlastnímu appdev@contoso.com účtu vytvořenému na začátku článku. Po úspěšném přihlášení se token účtu ukládá do mezipaměti pro budoucí kubectl příkazy. Server NGINX je úspěšně naplánován, jak je znázorněno v následujícím příkladu výstupu:

$ 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

Teď pomocí příkazu kubectl get pods zobrazte pody v oboru názvů dev.

kubectl get pods --namespace dev

Jak je znázorněno v následujícím příkladu výstupu, pod NGINX je úspěšně spuštěný:

$ kubectl get pods --namespace dev

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

Vytvoření a zobrazení prostředků clusteru mimo přiřazený obor názvů

Teď se pokuste zobrazit pody mimo obor názvů dev. Znovu použijte příkaz kubectl get pods, tentokrát se podívejte --all-namespaces takto:

kubectl get pods --all-namespaces

Členství uživatele ve skupině nemá roli Kubernetes, která tuto akci umožňuje, jak je znázorněno v následujícím příkladu výstupu:

$ 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

Stejným způsobem se pokuste naplánovat pod v jiném oboru názvů, například v oboru názvů sre. Členství uživatele ve skupinách neodpovídá rolím Kubernetes a vazbám rolí, aby bylo možné tato oprávnění udělit, jak je znázorněno v následujícím příkladu výstupu:

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

Testování přístupu SRE k prostředkům clusteru AKS

Pokud chcete potvrdit, že naše členství ve skupině Azure AD a Kubernetes RBAC funguje správně mezi různými uživateli a skupinami, zkuste předchozí příkazy přihlášeni jako uživatel opssre .

Obnovte kontext kubeconfig pomocí příkazu AZ AKS Get-Credentials , který vymaže ověřovací token dříve uložených v mezipaměti pro uživatele aksdev :

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

Zkuste naplánovat a zobrazit lusky v přiřazeném oboru názvů SRE . Po zobrazení výzvy se přihlaste s vlastními opssre@contoso.com přihlašovacími údaji vytvořenými na začátku článku:

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

Jak je znázorněno v následujícím příkladu výstupu, můžete úspěšně vytvořit a zobrazit lusky:

$ 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

Nyní se pokuste zobrazit nebo naplánovat lusky mimo přiřazený obor názvů SRE:

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

Tyto kubectl příkazy selžou, jak je znázorněno v následujícím příkladu výstupu. Členství ve skupinách uživatelů a role Kubernetes a RoleBindings neudělují oprávnění k vytváření prostředků nebo správce v jiných oborech názvů:

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

Vyčištění prostředků

V tomto článku jste vytvořili prostředky v clusteru AKS a uživatelích a skupinách v Azure AD. Pro vyčištění všech těchto prostředků spusťte následující příkazy:

# 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

Další kroky

Další informace o tom, jak zabezpečit clustery Kubernetes, najdete v tématu Možnosti přístupu a identit pro AKS).

Osvědčené postupy týkající se identit a řízení prostředků najdete v tématu osvědčené postupy pro ověřování a autorizaci v AKS.