تمكين حسابات الخدمة المُدارة للمجموعة (GMSA) لعُقد Windows Server على مجموعة Azure Kubernetes Service (AKS)

حسابات الخدمة المدارة للمجموعة (GMSA) هي حساب مجال مدار لخوادم متعددة توفر إدارة تلقائية لكلمات المرور وإدارة مبسطة لاسم الخدمة الأساسي (SPN) والقدرة على تفويض الإدارة إلى المسؤولين الآخرين. باستخدام Azure Kubernetes Service (AKS)، يمكنك تمكين GMSA على عقد Windows Server، والتي تسمح للحاويات التي تعمل على عقد Windows Server بالتكامل مع GMSA وإدارتها.

المتطلبات الأساسية

  • Kubernetes 1.19 أو أكبر. للتحقق من الإصدار، راجع التحقق من وجود ترقيات متوفرة. لترقية الإصدار الخاص بك، راجع ترقية نظام مجموعة AKS.
  • الإصدار 2.35.0 من Azure CLI أو أحدث. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.
  • الهويات المدارة الممكنة على نظام مجموعة AKS.
  • أذونات لإنشاء Azure Key Vault أو تحديثه.
  • أذونات لتكوين GMSA على خدمة مجال Active Directory أو Active Directory محلي.
  • يجب أن يكون لدى وحدة تحكم المجال خدمات ويب Active Directory ممكّنة ويجب أن تكون قابلة للوصول على المنفذ 9389 بواسطة مجموعة AKS.

إشعار

توفر Microsoft أيضا وحدة PowerShell مصممة لهذا الغرض لتكوين gMSA على AKS. لمزيد من المعلومات، راجع gMSA على خدمة Azure Kubernetes.

تكوين GMSA على وحدة تحكم مجال Active Directory

لاستخدام GMSA مع AKS، تحتاج إلى بيانات اعتماد مستخدم مجال قياسية للوصول إلى بيانات اعتماد GMSA المكونة على وحدة التحكم بالمجال. لتكوين GMSA على وحدة التحكم بالمجال، راجع بدء استخدام حسابات الخدمة المدارة للمجموعة. بالنسبة إلى بيانات اعتماد مستخدم المجال القياسي، يمكنك استخدام مستخدم حالي أو إنشاء مستخدم جديد، طالما أن لديه حق الوصول إلى بيانات اعتماد GMSA.

هام

يجب استخدام خدمة مجال Active Directory أو Active Directory محلي. في هذا الوقت، لا يمكنك استخدام معرف Microsoft Entra لتكوين GMSA مع نظام مجموعة AKS.

تخزين بيانات اعتماد مستخدم المجال القياسية في Azure Key Vault

تستخدم مجموعة AKS الخاصة بك بيانات اعتماد مستخدم المجال القياسية للوصول إلى بيانات اعتماد GMSA من وحدة تحكم المجال. لتوفير وصول آمن إلى بيانات الاعتماد هذه لمجموعة AKS، يجب تخزينها في Azure Key Vault.

  1. إذا لم يكن لديك مخزن مفاتيح Azure بالفعل، فبادر بإنشاء مخزن باستخدام az keyvault create الأمر .

    az keyvault create --resource-group myResourceGroup --name myGMSAVault
    
  2. قم بتخزين بيانات اعتماد مستخدم المجال القياسي كبيانات سرية az keyvault secret set في مخزن المفاتيح الخاص بك باستخدام الأمر . يخزن المثال التالي بيانات اعتماد مستخدم المجال مع المفتاح GMSADomainUserCred في مخزن مفاتيح myGMSAVault .

    az keyvault secret set --vault-name myGMSAVault --name "GMSADomainUserCred" --value "$Domain\\$DomainUsername:$DomainUserPassword"
    

    إشعار

    تأكد من استخدام اسم المجال المؤهل بالكامل للمجال.

اختياري: استخدام شبكة ظاهرية مخصصة مع DNS مخصص

تحتاج إلى تكوين وحدة تحكم المجال الخاصة بك من خلال DNS بحيث يمكن الوصول إليها بواسطة نظام مجموعة AKS. يمكنك تكوين شبكتك ونظام أسماء النطاقات خارج مجموعة AKS للسماح لمجموعتك بالوصول إلى وحدة تحكم المجال. بدلا من ذلك، يمكنك استخدام Azure CNI لتكوين شبكة ظاهرية مخصصة مع DNS مخصص على نظام مجموعة AKS لتوفير الوصول إلى وحدة التحكم بالمجال. لمزيد من المعلومات، راجع تكوين شبكة Azure CNI في خدمة Azure Kubernetes (AKS).

اختياري: تكوين أكثر من خادم DNS واحد

إذا كنت ترغب في تكوين أكثر من خادم DNS واحد ل Windows GMSA في نظام مجموعة AKS، فلا تحدد --gmsa-dns-serverأو v--gmsa-root-domain-name. بدلا من ذلك، يمكنك إضافة عدة خوادم DNS في VNet عن طريق تحديد DNS مخصص وإضافة خوادم DNS.

اختياري: استخدم هوية kubelet الخاصة بك لمجموعتك

لتوفير وصول مجموعة AKS إلى خزينة المفاتيح، تحتاج هوية مجموعة kubelet إلى الوصول إلى خزينة المفاتيح الخاصة بك. عند إنشاء نظام مجموعة مع تمكين الهوية المدارة، يتم إنشاء هوية kubelet تلقائيا بشكل افتراضي.

يمكنك إما منح حق الوصول إلى مخزن المفاتيح الخاص بك للهوية بعد إنشاء نظام المجموعة أو إنشاء هويتك الخاصة لاستخدامها قبل إنشاء نظام المجموعة باستخدام الخطوات التالية:

  1. إنشاء هوية kubelet باستخدام az identity create الأمر .

    az identity create --name myIdentity --resource-group myResourceGroup
    
  2. احصل على معرف الهوية باستخدام az identity list الأمر وقم بتعيينه إلى متغير يسمى MANAGED_ID.

    MANAGED_ID=$(az identity list --query "[].id" -o tsv)
    
  3. امنح الوصول إلى الهوية إلى مخزن المفاتيح الخاص بك باستخدام az keyvault set-policy الأمر .

    az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
    

تمكين GMSA على نظام مجموعة AKS جديد

  1. إنشاء بيانات اعتماد المسؤول لاستخدامها أثناء إنشاء نظام المجموعة. تطالبك الأوامر التالية باسم مستخدم وتعيينه إلى WINDOWS_USERNAME للاستخدام في أمر لاحق.

    echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME 
    
  2. إنشاء نظام مجموعة AKS باستخدام az aks create الأمر مع المعلمات التالية:

    • --enable-windows-gmsa: تمكين GMSA للمجموعة.
    • --gmsa-dns-server: عنوان IP لخادم DNS.
    • --gmsa-root-domain-name: اسم المجال الجذر لخادم DNS.
    DNS_SERVER=<IP address of DNS server>
    ROOT_DOMAIN_NAME="contoso.com"
    
    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --vm-set-type VirtualMachineScaleSets \
        --network-plugin azure \
        --load-balancer-sku standard \
        --windows-admin-username $WINDOWS_USERNAME \
        --enable-windows-gmsa \
        --gmsa-dns-server $DNS_SERVER \
        --gmsa-root-domain-name $ROOT_DOMAIN_NAME \
        --generate-ssh-keys
    

    إشعار

    • إذا كنت تستخدم شبكة ظاهرية مخصصة، فأنت بحاجة إلى تحديد معرف الشبكة الظاهرية باستخدام المعلمة vnet-subnet-id ، وقد تحتاج أيضا إلى إضافة docker-bridge-addressdns-service-ipالمعلمات و و service-cidr اعتمادا على التكوين الخاص بك.

    • إذا قمت بإنشاء هويتك الخاصة لهوية kubelet، فاستخدم المعلمة assign-kubelet-identity لتحديد هويتك.

    • عند تحديد --gmsa-dns-server المعلمتين و --gmsa-root-domain-name ، تتم إضافة قاعدة إعادة توجيه DNS إلى kube-system/coredns ConfigMap. تقوم هذه القاعدة بإعادة توجيه طلبات DNS من $ROOT_DOMAIN_NAME pods إلى $DNS_SERVER.

      $ROOT_DOMAIN_NAME:53 {
          errors
          cache 30
          log
          forward . $DNS_SERVER
      }
      
  3. أضف تجمع عقدة Windows Server باستخدام az aks nodepool add الأمر .

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --os-type Windows \
        --name npwin \
        --node-count 1
    

تمكين GMSA على نظام المجموعة الحالي

  • تمكين GMSA على نظام مجموعة موجود مع عقد Windows Server والهويات المدارة الممكنة az aks update باستخدام الأمر .

    az aks update \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --enable-windows-gmsa \
        --gmsa-dns-server $DNS_SERVER \
        --gmsa-root-domain-name $ROOT_DOMAIN_NAME
    

منح حق الوصول إلى خزنة المفاتيح الخاصة بك لهوية kubelet

إشعار

تخطي هذه الخطوة إذا قمت بتوفير هويتك الخاصة لهوية kubelet.

  • امنح حق الوصول إلى مخزن المفاتيح الخاص بك لهوية kubelet باستخدام az keyvault set-policy الأمر .

    MANAGED_ID=$(az aks show -g myResourceGroup -n myAKSCluster --query "identityProfile.kubeletidentity.objectId" -o tsv)
    az keyvault set-policy --name "myGMSAVault" --object-id $MANAGED_ID --secret-permissions get
    

تثبيت مواصفات أرصدة GMSA

  1. قم بتكوين kubectl للاتصال بنظام مجموعة Kubernetes باستخدام أمر az aks get-credentials.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. أنشئ YAML جديدا باسم gmsa-spec.yaml والصق في YAML التالي. تأكد من استبدال العناصر النائبة بقيمك الخاصة.

    apiVersion: windows.k8s.io/v1
    kind: GMSACredentialSpec
    metadata:
      name: aks-gmsa-spec  # This name can be changed, but it will be used as a reference in the pod spec
    credspec:
      ActiveDirectoryConfig:
        GroupManagedServiceAccounts:
        - Name: $GMSA_ACCOUNT_USERNAME
          Scope: $NETBIOS_DOMAIN_NAME
        - Name: $GMSA_ACCOUNT_USERNAME
          Scope: $DNS_DOMAIN_NAME
        HostAccountConfig:
          PluginGUID: '{CCC2A336-D7F3-4818-A213-272B7924213E}'
          PortableCcgVersion: "1"
          PluginInput: "ObjectId=$MANAGED_ID;SecretUri=$SECRET_URI"  # SECRET_URI takes the form https://$akvName.vault.azure.net/secrets/$akvSecretName
      CmsPlugins:
     - ActiveDirectory
      DomainJoinConfig:
        DnsName: $DNS_DOMAIN_NAME
        DnsTreeName: $DNS_ROOT_DOMAIN_NAME
        Guid:  $AD_DOMAIN_OBJECT_GUID
        MachineAccountName: $GMSA_ACCOUNT_USERNAME
        NetBiosName: $NETBIOS_DOMAIN_NAME
        Sid: $GMSA_SID
    

إشعار

قامت AKS بترقية apiVersion من GMSACredentialSpec windows.k8s.io/v1alpha1 إلى windows.k8s.io/v1 في الإصدار v20230903.

  1. أنشئ YAML جديدا باسم gmsa-role.yaml والصقه في YAML التالي.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: aks-gmsa-role
    rules:
    - apiGroups: ["windows.k8s.io"]
      resources: ["gmsacredentialspecs"]
      verbs: ["use"]
      resourceNames: ["aks-gmsa-spec"]
    
  2. أنشئ YAML جديدا باسم gmsa-role-binding.yaml والصقه في YAML التالي.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: allow-default-svc-account-read-on-aks-gmsa-spec
      namespace: default
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: default
    roleRef:
      kind: ClusterRole
      name: aks-gmsa-role
      apiGroup: rbac.authorization.k8s.io
    
  3. قم بتطبيق التغييرات من gmsa-spec.yaml و gmsa-role.yaml و gmsa-role-binding.yaml باستخدام kubectl apply الأمر .

    kubectl apply -f gmsa-spec.yaml
    kubectl apply -f gmsa-role.yaml
    kubectl apply -f gmsa-role-binding.yaml
    

التحقق من تثبيت GMSA

  1. أنشئ YAML جديدا باسم gmsa-demo.yaml والصقه في YAML التالي.

    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      labels:
       app: gmsa-demo
      name: gmsa-demo
      namespace: default
    data:
      run.ps1: |
       $ErrorActionPreference = "Stop"
    
       Write-Output "Configuring IIS with authentication."
    
       # Add required Windows features, since they are not installed by default.
       Install-WindowsFeature "Web-Windows-Auth", "Web-Asp-Net45"
    
       # Create simple ASP.NET page.
       New-Item -Force -ItemType Directory -Path 'C:\inetpub\wwwroot\app'
       Set-Content -Path 'C:\inetpub\wwwroot\app\default.aspx' -Value 'Authenticated as <B><%=User.Identity.Name%></B>, Type of Authentication: <B><%=User.Identity.AuthenticationType%></B>'
    
       # Configure IIS with authentication.
       Import-Module IISAdministration
       Start-IISCommitDelay
       (Get-IISConfigSection -SectionPath 'system.webServer/security/authentication/windowsAuthentication').Attributes['enabled'].value = $true
       (Get-IISConfigSection -SectionPath 'system.webServer/security/authentication/anonymousAuthentication').Attributes['enabled'].value = $false
       (Get-IISServerManager).Sites[0].Applications[0].VirtualDirectories[0].PhysicalPath = 'C:\inetpub\wwwroot\app'
       Stop-IISCommitDelay
    
       Write-Output "IIS with authentication is ready."
    
       C:\ServiceMonitor.exe w3svc
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: gmsa-demo
      name: gmsa-demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: gmsa-demo
      template:
        metadata:
          labels:
            app: gmsa-demo
        spec:
          securityContext:
            windowsOptions:
              gmsaCredentialSpecName: aks-gmsa-spec
          containers:
          - name: iis
            image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
            imagePullPolicy: IfNotPresent
            command:
             - powershell
            args:
              - -File
              - /gmsa-demo/run.ps1
            volumeMounts:
              - name: gmsa-demo
                mountPath: /gmsa-demo
          volumes:
          - configMap:
              defaultMode: 420
              name: gmsa-demo
            name: gmsa-demo
          nodeSelector:
            kubernetes.io/os: windows
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: gmsa-demo
      name: gmsa-demo
      namespace: default
    spec:
      ports:
      - port: 80
        targetPort: 80
      selector:
        app: gmsa-demo
      type: LoadBalancer
    
  2. تطبيق التغييرات من gmsa-demo.yaml باستخدام kubectl apply الأمر .

    kubectl apply -f gmsa-demo.yaml
    
  3. احصل على عنوان IP الخاص بنموذج التطبيق باستخدام kubectl get service الأمر .

    kubectl get service gmsa-demo --watch
    

    في البداية، EXTERNAL-IP يظهر للخدمة gmsa-demo على أنه معلق:

    NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    gmsa-demo          LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s
    
  4. EXTERNAL-IP عندما يتغير العنوان من معلق إلى عنوان IP عام فعلي، استخدم CTRL-C لإيقاف kubectl عملية المراقبة.

    يوضح المثال التالي إخراج لعنوان IP عام صالحاً تم تعيينه للخدمة:

    gmsa-demo  LoadBalancer   10.0.37.27   EXTERNAL-IP   80:30572/TCP   2m
    
  5. افتح مستعرض ويب إلى عنوان IP الخارجي للخدمة gmsa-demo .

  6. قم بالمصادقة باستخدام $NETBIOS_DOMAIN_NAME\$AD_USERNAME و كلمة المرور وتأكد من أنك ترى Authenticated as $NETBIOS_DOMAIN_NAME\$AD_USERNAME, Type of Authentication: Negotiate.

تعطيل GMSA على نظام مجموعة موجود

  • تعطيل GMSA على نظام مجموعة موجود مع عقد Windows Server باستخدام az aks update الأمر .

    az aks update \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --disable-windows-gmsa 
    

إشعار

يمكنك إعادة تمكين GMSA على مجموعة موجودة باستخدام الأمر az aks update .

استكشاف الأخطاء وإصلاحها

لا يتم طلب المصادقة عند تحميل الصفحة

إذا تم تحميل الصفحة، ولكن لم تتم مطالبتك بالمصادقة، فاستخدم kubectl logs POD_NAME الأمر لعرض سجلات الجراب والتحقق من أنك ترى IIS مع المصادقة جاهزا.

إشعار

لن تعرض حاويات Windows السجلات على kubectl بشكل افتراضي. لتمكين حاويات Windows من إظهار السجلات، تحتاج إلى تضمين أداة "مراقبة السجل" على صورة Windows. لمزيد من المعلومات، راجع أدوات حاوية Windows.

انتهت مهلة الاتصال عند محاولة تحميل الصفحة

إذا تلقيت مهلة اتصال عند محاولة تحميل الصفحة، فتحقق من تشغيل نموذج التطبيق باستخدام kubectl get pods --watch الأمر . أحيانًا يكون عنوان IP الخارجي لنموذج التطبيق متاحًا قبل تشغيل نموذج حاوية التطبيق.

فشل بدء تشغيل الجراب ويظهر خطأ winapi في أحداث pod

إذا لم يبدأ تشغيل الكبسولة kubectl get pods --watch بعد تشغيل الأمر والانتظار عدة دقائق، فاستخدم kubectl describe pod POD_NAME الأمر . إذا رأيت خطأ winapi في أحداث pod، فمن المحتمل أن يكون خطأ في تكوين مواصفات GMSA cred. تحقق من صحة كافة قيم الاستبدال في gmsa-spec.yaml وأعد تشغيل kubectl apply -f gmsa-spec.yaml ثم أعد نشر نموذج التطبيق.

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

لمزيد من المعلومات، راجع اعتبارات حاويات Windows مع خدمة Azure Kubernetes (AKS).