استخدام التحكم في الوصول المستند إلى الدور في Kubernetes مع معرف Microsoft Entra في خدمة Azure Kubernetes

يمكن تكوين خدمة Azure Kubernetes (AKS) لاستخدام معرف Microsoft Entra لمصادقة المستخدم. في هذا التكوين، يمكنك تسجيل الدخول إلى نظام مجموعة AKS باستخدام رمز مصادقة Microsoft Entra المميز. بمجرد المصادقة، يمكنك استخدام التحكم في الوصول المستند إلى الأدوار Kubernetes (Kubernetes RBAC) لإدارة الوصول إلى مساحات الأسماء وموارد المجموعة استناداً إلى هوية المستخدم أو عضوية المجموعة.

توضح لك هذه المقالة كيفية:

  • التحكم في الوصول باستخدام Kubernetes RBAC في مجموعة AKS استنادا إلى عضوية مجموعة Microsoft Entra.
  • إنشاء أمثلة على المجموعات والمستخدمين في معرف Microsoft Entra.
  • إنشاء الأدوار و RoleBindings في نظام مجموعة AKS لمنح الأذونات المناسبة لإنشاء الموارد وعرضها.

قبل البدء

  • لديك مجموعة AKS موجودة مع تمكين تكامل Microsoft Entra. إذا كنت بحاجة إلى نظام مجموعة AKS مع هذا التكوين، فشاهد دمج معرف Microsoft Entra مع AKS.
  • يتم تمكين Kubernetes RBAC بشكل افتراضي أثناء إنشاء مجموعة AKS. لترقية نظام المجموعة الخاص بك مع تكامل Microsoft Entra وKubernetes RBAC، قم بتمكين تكامل Microsoft Entra على مجموعة AKS الموجودة لديك.
  • تأكد من تثبيت وتكوين الإصدار 2.0.61 من Azure CLI أو أحدث. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.
  • إذا كنت تستخدم Terraform، فقم بتثبيت الإصدار 2.99.0 من Terraform أو أحدث.

استخدم مدخل Azure أو Azure CLI للتحقق من تمكين تكامل Microsoft Entra مع Kubernetes RBAC.

للتحقق من استخدام مدخل Microsoft Azure:

  • من المستعرض، سجل الدخول إلى مدخل Microsoft Azure.
  • انتقل إلى خدمات Kubernetes، ومن الجزء الأيسر حدد تكوين نظام المجموعة.
  • ضمن قسم المصادقة والتخويل، تحقق من تحديد خيار مصادقة Microsoft Entra باستخدام Kubernetes RBAC.

Example of AKS Authentication and Authorization page in Azure portal.

إنشاء مجموعات تجريبية في معرف Microsoft Entra

في هذه المقالة، سننشئ دورين للمستخدم لإظهار كيفية تحكم Kubernetes RBAC ومعرف Microsoft Entra في الوصول إلى موارد نظام المجموعة. يتم استخدام المثالين التاليين من الأدوار:

  • مطور التطبيق
    • مستخدم يسمى aksdev وهو جزء من مجموعة appdev .
  • مهندس موثوقية الموقع
    • مستخدم يسمى akssre وهو جزء من مجموعة opssre .

في بيئات الإنتاج، يمكنك استخدام المستخدمين والمجموعات الموجودة داخل مستأجر Microsoft Entra.

  1. أولا، احصل على معرف المورد لنظام مجموعة AKS باستخدام az aks show الأمر . ثم قم بتعيين معرف المورد إلى متغير يسمى AKS_ID بحيث يمكن الرجوع إليه في أوامر أخرى.

    AKS_ID=$(az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query id -o tsv)
    
  2. إنشاء مجموعة المثال الأول في معرف Microsoft Entra لمطوري التطبيقات باستخدام az ad group create الأمر . ينشئ المثال التالي مجموعة تسمى appdev:

    APPDEV_ID=$(az ad group create --display-name appdev --mail-nickname appdev --query id -o tsv)
    
  3. إنشاء تعيين دور Azure لمجموعة appdev باستخدام az role assignment create الأمر . يتيح هذا التعيين لأي عضو في المجموعة استخدام kubectl للتفاعل مع نظام مجموعة AKS عن طريق منحه دور مستخدم نظام مجموعة خدمة Azure Kubernetes.

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

تلميح

إذا تلقيت خطأ مثل Principal 35bfec9328bd4d8d9b54dea6dac57b82 doesn't exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5.، فانتظر بضع ثوان حتى يتم نشر معرف عنصر مجموعة Microsoft Entra من خلال الدليل، ثم حاول الأمر az role assignment create مرة أخرى.

  1. إنشاء مجموعة أمثلة ثانية ل SREs المسماة opssre.

    OPSSRE_ID=$(az ad group create --display-name opssre --mail-nickname opssre --query id -o tsv)
    
  2. إنشاء تعيين دور Azure لمنح أعضاء المجموعة دور مستخدم نظام مجموعة خدمة Azure Kubernetes.

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

إنشاء مستخدمين تجريبيين في معرف Microsoft Entra

الآن بعد أن أصبح لدينا مثالان تم إنشاؤهما في معرف Microsoft Entra لمطوري التطبيقات وSREs، سننشئ مثالين للمستخدمين. لاختبار تكامل Kubernetes RBAC في نهاية المقالة، ستقوم بتسجيل الدخول إلى نظام مجموعة AKS باستخدام هذه الحسابات.

تعيين اسم المستخدم الأساسي وكلمة المرور لمطوري التطبيقات

تعيين اسم المستخدم الأساسي (UPN) وكلمة المرور لمطوري التطبيق. يجب أن يتضمن UPN اسم المجال الذي تم التحقق منه للمستأجر الخاص بك، على سبيل المثال aksdev@contoso.com.

يطالبك الأمر التالي ب UPN ويعينه إلى AAD (دليل Azure النشط)_DEV_UPN بحيث يمكن استخدامه في أمر لاحق:

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

يطالبك الأمر التالي بكلمة المرور ويعينها إلى AAD (دليل Azure النشط)_DEV_PW لاستخدامها في أمر لاحق:

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

إنشاء حسابات المستخدمين

  1. إنشاء حساب المستخدم الأول في معرف Microsoft Entra باستخدام az ad user create الأمر . ينشئ المثال التالي مستخدما باسم العرض AKS Dev وUPN وكلمة المرور الآمنة باستخدام القيم في AAD (دليل Azure النشط)_DEV_UPN AAD (دليل Azure النشط)_DEV_PW:
AKSDEV_ID=$(az ad user create \
  --display-name "AKS Dev" \
  --user-principal-name $AAD_DEV_UPN \
  --password $AAD_DEV_PW \
  --query id -o tsv)
  1. أضف المستخدم إلى مجموعة appdev التي تم إنشاؤها في القسم السابق باستخدام az ad group member add الأمر .
az ad group member add --group appdev --member-id $AKSDEV_ID
  1. قم بتعيين UPN، وكلمة المرور لـ SREs. يجب أن يتضمن UPN اسم المجال الذي تم التحقق منه للمستأجر الخاص بك، على سبيل المثال akssre@contoso.com. يطالبك الأمر التالي ب UPN ويعينه إلى AAD (دليل Azure النشط)_SRE_UPN للاستخدام في أمر لاحق:
echo "Please enter the UPN for SREs: " && read AAD_SRE_UPN
  1. يطالبك الأمر التالي بكلمة المرور ويعينها إلى AAD (دليل Azure النشط)_SRE_PW لاستخدامها في أمر لاحق:
echo "Please enter the secure password for SREs: " && read AAD_SRE_PW
  1. إنشاء حساب مستخدم ثانٍ. ينشئ المثال التالي مستخدما باسم العرض AKS SRE وUPN وكلمة المرور الآمنة باستخدام القيم في AAD (دليل Azure النشط)_SRE_UPN AAD (دليل Azure النشط)_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 id -o tsv)

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

إنشاء موارد نظام مجموعة AKS ل devs التطبيق

لدينا مجموعات Microsoft Entra والمستخدمين وتعيينات أدوار Azure التي تم إنشاؤها. الآن، سنقوم بتكوين نظام مجموعة AKS للسماح لهذه المجموعات المختلفة بالوصول إلى موارد محددة.

  1. احصل على بيانات اعتماد مسؤول نظام المجموعة باستخدام az aks get-credentials الأمر . في أحد الأقسام التالية، تحصل على بيانات اعتماد نظام مجموعة المستخدم العادية لرؤية تدفق مصادقة Microsoft Entra قيد التنفيذ.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin
  1. إنشاء مساحة اسم في نظام مجموعة AKS باستخدام kubectl create namespace الأمر . ينشئ المثال التالي اسم مساحة اسم dev:
kubectl create namespace dev

إشعار

في Kubernetes، تحدد الأدوار الأذونات التي يجب منحها، وتطبق RoleBindingsها على المستخدمين أو المجموعات المطلوبة. يمكن تطبيق هذه التعيينات على مساحة اسم معينة، أو عبر المجموعة بأكملها. لمزيد من المعلومات، راجع استخدام ترخيص Kubernetes RBAC.

إذا كان المستخدم الذي تمنح ربط Kubernetes RBAC له في نفس مستأجر Microsoft Entra، فعين الأذونات استنادا إلى userPrincipalName (UPN). إذا كان المستخدم في مستأجر Microsoft Entra مختلف، استعلم عن خاصية objectId واستخدمها بدلا من ذلك.

  1. إنشاء دور لمساحة اسم التطوير ، والذي يمنح أذونات كاملة لمساحة الاسم. في بيئات الإنتاج، يمكنك تحديد أذونات أكثر دقة لمستخدمين، أو مجموعات مختلفة. قم بإنشاء الملف المسمى role-dev-namespace.yaml والصق بيان التجميع التالي 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: ["*"]
  1. قم بإنشاء الدور باستخدام kubectl apply الأمر وحدد اسم ملف بيان YAML الخاص بك.
kubectl apply -f role-dev-namespace.yaml
  1. احصل على معرف المورد لمجموعة appdev باستخدام az ad group show الأمر . تم تعيين هذه المجموعة كموضوع ارتباط الدور في الخطوة التالية.
az ad group show --group appdev --query id -o tsv
  1. إنشاء RoleBinding لمجموعة appdev لاستخدام الدور الذي تم إنشاؤه مسبقا للوصول إلى مساحة الاسم. قم بإنشاء الملف المسمى rolebinding-dev-namespace.yaml والصق بيان التجميع التالي YAML. في السطر الأخير، استبدل groupObjectId بإخراج معرف كائن المجموعة من الأمر السابق.
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

تلميح

إذا كنت تريد إنشاء RoleBinding لمستخدم واحد، فحدد kind: User واستبدل groupObjectId باسم المستخدم الكياني (UPN) في النموذج أعلاه.

  1. قم بإنشاء RoleBinding باستخدام kubectl apply الأمر وحدد اسم ملف بيان YAML الخاص بك:
kubectl apply -f rolebinding-dev-namespace.yaml

إنشاء موارد مجموعة AKS لـ SREs

الآن، سنكرر الخطوات السابقة لإنشاء مساحة اسم ودور و RoleBinding ل SREs.

  1. إنشاء مساحة اسم ل sre باستخدام kubectl create namespace الأمر .
kubectl create namespace sre
  1. قم بإنشاء الملف المسمى role-sre-namespace.yaml والصق بيان التجميع التالي 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: ["*"]
  1. قم بإنشاء الدور باستخدام kubectl apply الأمر وحدد اسم ملف بيان YAML الخاص بك.
kubectl apply -f role-sre-namespace.yaml
  1. احصل على معرف المورد لمجموعة opssre باستخدام الأمر az ad group show .
az ad group show --group opssre --query id -o tsv
  1. إنشاء RoleBinding لمجموعة opssre لاستخدام الدور الذي تم إنشاؤه مسبقا للوصول إلى مساحة الاسم. قم بإنشاء الملف المسمى rolebinding-sre-namespace.yaml والصق بيان التجميع التالي YAML. في السطر الأخير، استبدل groupObjectId بإخراج معرف كائن المجموعة من الأمر السابق.
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
  1. قم بإنشاء RoleBinding باستخدام kubectl apply الأمر وحدد اسم ملف بيان YAML الخاص بك.
kubectl apply -f rolebinding-sre-namespace.yaml

التفاعل مع موارد نظام المجموعة باستخدام هويات Microsoft Entra

الآن، سنختبر أن الأذونات المتوقعة تعمل عند إنشاء الموارد وإدارتها في مجموعة AKS. في هذه الأمثلة، سنقوم بجدولة وعرض pods في مساحة الاسم المعينة للمستخدم، ومحاولة جدولة وعرض pods خارج مساحة الاسم المعينة.

  1. إعادة تعيين سياق kubeconfig باستخدام az aks get-credentials الأمر . في القسم السابق، قمت بتعيين السياق باستخدام بيانات اعتماد مسؤول المجموعة. يتجاوز المستخدم المسؤول مطالبات تسجيل الدخول إلى Microsoft Entra. بدون المعلمة --admin ، يتم تطبيق سياق المستخدم الذي يتطلب مصادقة جميع الطلبات باستخدام معرف Microsoft Entra.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
  1. جدولة جراب NGINX أساسي باستخدام kubectl run الأمر في مساحة اسم التطوير .
kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
  1. أدخل بيانات الاعتماد لحسابك الخاص appdev@contoso.com الذي تم إنشاؤه في بداية المقالة كمطالبة بتسجيل الدخول. بمجرد تسجيل الدخول بنجاح، يتم تخزين الرمز المميز للحساب مؤقتا للأوامر المستقبلية kubectl . تم جدولة NGINX بنجاح، كما هو موضح في المثال التالي الناتج:
$ 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
  1. kubectl get pods استخدم الأمر لعرض الحجيرات في مساحة اسم التطوير.
kubectl get pods --namespace dev
  1. تأكد من أن حالة جراب NGINX قيد التشغيل. سيبدو الإخراج مشابها للإخراج التالي:
$ kubectl get pods --namespace dev

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

إنشاء وعرض موارد نظام المجموعة خارج مساحة الاسم المعينة

حاول عرض pods خارج مساحة اسم التطوير . kubectl get pods استخدم الأمر مرة أخرى، هذه المرة لمشاهدة --all-namespaces.

kubectl get pods --all-namespaces

لا تحتوي عضوية مجموعة المستخدم على دور Kubernetes الذي يسمح بهذا الإجراء، كما هو موضح في إخراج المثال التالي:

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

بنفس الطريقة، حاول جدولة جراب في مساحة اسم مختلفة، مثل مساحة اسم sre . لا تتوافق عضوية مجموعة المستخدم مع دور Kubernetes و RoleBinding لمنح هذه الأذونات، كما هو موضح في إخراج المثال التالي:

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

اختبر وصول SRE إلى موارد مجموعة AKS

للتأكد من أن عضوية مجموعة Microsoft Entra وKubernetes RBAC تعمل بشكل صحيح بين مستخدمين ومجموعات مختلفة، جرب الأوامر السابقة عند تسجيل الدخول كمستخدم opssre .

  1. إعادة تعيين سياق kubeconfig باستخدام az aks get-credentials الأمر الذي يمسح رمز المصادقة المخزن مؤقتا مسبقا لمستخدم aksdev.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
  1. حاول جدولة pods وعرضها في مساحة اسم sre المعينة. عند المطالبة، قم بتسجيل الدخول باستخدام بيانات الاعتماد الخاصة opssre@contoso.com بك التي تم إنشاؤها في بداية المقالة.
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
kubectl get pods --namespace sre

كما هو موضح في المثال التالي، يمكنك إنشاء وعرض الكبسولات بنجاح:

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

3. 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
  1. حاول عرض أو جدولة pods خارج مساحة اسم SRE المعينة.
kubectl get pods --all-namespaces
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

تفشل هذه kubectl الأوامر، كما هو موضح في إخراج المثال التالي. لا تمنح عضوية مجموعة المستخدم ودور Kubernetes و RoleBindings أذونات لإنشاء الموارد أو إدارتها في مساحات الأسماء الأخرى.

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

تنظيف الموارد

في هذه المقالة، قمت بإنشاء موارد في نظام مجموعة AKS والمستخدمين والمجموعات في معرف Microsoft Entra. لتنظيف كافة الموارد، قم بتشغيل الأوامر التالية:

# 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

الخطوات التالية