Konfigurowanie zewnętrznych dostawców tożsamości przy użyciu strukturalnego uwierzytelniania AKS (wersja zapoznawcza)

W tym artykule pokazano, jak skonfigurować zewnętrznych dostawców tożsamości GitHub i Google Identity dla potrzeby uwierzytelniania płaszczyzny sterowania usługi Azure Kubernetes Service (AKS) przy użyciu uwierzytelniania zorganizowanego. Dowiesz się, jak utworzyć uwierzytelnianie tokenu internetowego JSON (JWT), skonfigurować walidację i mapowanie oświadczeń oraz przetestować przepływ uwierzytelniania.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi i wymagają zapisania się. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów, świadczoną w miarę możliwości. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Wymagania wstępne

  • Zapoznaj się z omówieniem koncepcyjnym uwierzytelniania w usłudze AKS przy użyciu zewnętrznego dostawcy tożsamości.
  • Ten artykuł wymaga wersji 2.77.0 lub nowszej Azure CLI. Jeśli używasz Azure Cloud Shell, najnowsza wersja jest już tam zainstalowana. Aby zainstalować lub zaktualizować Azure CLI na komputerze lokalnym, zobacz Instaluj Azure CLI.

  • Aby korzystać z funkcji uwierzytelniania ustrukturyzowanego, należy zainstalować rozszerzenie aks-preview Azure CLI w wersji 18.0.0b41 lub nowszej.

    • Jeśli nie masz aks-preview jeszcze rozszerzenia, zainstaluj je przy użyciu az extension add polecenia .

      az extension add --name aks-preview
      
    • Jeśli masz już rozszerzenie aks-preview, zaktualizuj je, aby upewnić się, że masz najnowszą wersję z użyciem polecenia az extension update.

      az extension update --name aks-preview
      
    • Sprawdź, czy masz wymaganą wersję aks-preview rozszerzenia przy użyciu az extension show polecenia .

      az extension show --name aks-preview --query version
      
  • Klaster usługi AKS z uruchomioną platformą Kubernetes w wersji 1.30 lub nowszej. Aby utworzyć klaster usługi AKS, zobacz Wdrażanie klastra usługi Azure Kubernetes (AKS) przy użyciu interfejsu wiersza polecenia Azure CLI.

  • kubectl Narzędzie wiersza polecenia umożliwiające interakcję z klastrem Kubernetes. kubectl jest już zainstalowany, jeśli używasz Azure Cloud Shell. Można zainstalować kubectl lokalnie za pomocą polecenia az aks install-cli.

    az aks install-cli
    
  • Zewnętrzny dostawca tożsamości obsługujący openID Connect (OIDC).

  • Łączność sieciowa z węzłów klastra do dostawcy tożsamości.

  • Jeśli planujesz używać wtyczki, zainstaluj ją, postępując zgodnie z instrukcjami w przewodniku kubeloginkonfiguracji narzędzia kubelogin.

Ustawianie zmiennych środowiskowych

  • Ustaw następujące zmienne środowiskowe dla grupy zasobów i nazwy klastra:

    export RESOURCE_GROUP="<your-resource-group-name>"
    export CLUSTER_NAME="<your-cluster-name>"
    

Zarejestruj funkcję JWTAuthenticatorPreview

  1. Zarejestruj funkcję JWTAuthenticatorPreview przy użyciu polecenia az feature register.

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. Sprawdź stan rejestracji funkcji przy użyciu az feature show polecenia .

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. Gdy Registered pokaże stan, odśwież rejestrację dostawcy zasobów dla Microsoft.ContainerService, używając polecenia az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Konfiguracja uwierzytelniania OIDC dla GitHub Actions

  1. Upewnij się, że przepływy pracy GitHub Actions mają niezbędne uprawnienia.

  2. id-token: write Skonfiguruj uprawnienie w plikach przepływu pracy. Przykład:

    permissions:
      id-token: write
      contents: read
    
  3. Skonfiguruj odpowiednie repozytorium i ustawienia organizacji na potrzeby dostępu do tokenów OIDC. Skonfiguruj ustawienia OIDC repozytorium i zasady zabezpieczeń organizacji w zakresie użycia tokenów.

Skonfiguruj uwierzytelnianie Google Identity OAuth 2.0

  1. Przejdź do konsoli Google Cloud Console.
  2. Utwórz lub wybierz projekt.
  3. Utwórz poświadczenia protokołu OAuth 2.0.
  4. Zanotuj identyfikator klienta i klucz tajny klienta do późniejszego użycia.

Utwórz konfigurację uwierzytelniania JWT dla GitHub Actions OIDC

  • Utwórz plik o nazwie jwt-config.json z następującą konfiguracją:

    {
      "issuer": {
          "url": "https://token.actions.githubusercontent.com",
          "audiences": [
              "my-api"
          ]
      },
      "claimValidationRules": [
          {
              "expression": "has(claims.sub)",
              "message": "must have sub claim"
          }
      ],
      "claimMappings": {
          "username": {
              "expression": "'aks:jwt:github:' + claims.sub"
          }
      },
      "userValidationRules": [
          {
              "expression": "has(user.username)",
              "message": "must have username"
          },
          {
              "expression": "!user.username.startsWith('aks:jwt:github:system')",
              "message": "username must not start with 'aks:jwt:github:system'"
          }
      ]
    }
    

Utwórz konfigurację uwierzytelniania JWT dla tożsamości Google

  • Utwórz plik o nazwie jwt-config.json z następującą konfiguracją:

    {
        "issuer": {
            "url": "https://accounts.google.com",
            "audiences": [
                "your-client-id.apps.googleusercontent.com"
            ]
        },
        "claimValidationRules": [
            {
                "expression": "has(claims.sub)",
                "message": "must have sub claim"
            }
        ],
        "claimMappings": {
            "username": {
                "expression": "'aks:jwt:google:' + claims.sub"
            },
            "groups": {
                "expression": "has(claims.groups) ? claims.groups.split(',').map(g, 'aks:jwt:' + g) : []"
            }
        },
        "userValidationRules": [
            {
                "expression": "has(user.username)",
                "message": "must have username"
            },
            {
                "expression": "!user.username.startsWith('aks:jwt:google:system')",
                "message": "username must not start with 'aks:jwt:google:system'"
            }
        ]
    }
    

Elementy konfiguracji uwierzytelniającego JWT

Konfiguracja uwierzytelniacza JWT obejmuje następujące kluczowe elementy: issuer, claimValidationRules, claimMappings, i userValidationRules. Każdy element służy określonemu celowi w definiowaniu sposobu, w jaki usługa AKS weryfikuje i przetwarza tokeny JWT od zewnętrznego dostawcy tożsamości.

Konfiguracja wydawcy

W poniższej tabeli opisano kluczowe elementy issuer konfiguracji:

Element konfiguracji wystawcy Opis
url Adres URL wystawcy OIDC, który musi być zgodny z oświadczeniem iss w JWT.
audiences Lista odbiorców, dla których muszą być wystawiane JWTs (sprawdzane pod kątem aud oświadczenia).

Konfiguracja reguł weryfikacji oświadczeń

W poniższej tabeli opisano kluczowe elementy claimValidationRules konfiguracji:

Element reguły weryfikacji oświadczeń Opis
expression Wyrażenie CEL, które definiuje logikę walidacji, która ma być stosowana do oświadczeń JWT. Wyrażenie musi mieć wartość true, aby token został zaakceptowany.
message Komunikat o błędzie zwrócony, gdy reguła sprawdzania poprawności nie powiedzie się.

Konfiguracja mapowania roszczeń

W poniższej tabeli opisano kluczowe elementy claimMappings konfiguracji:

Element mapowania roszczeń Opis
username Wyrażenie CEL definiujące sposób konstruowania nazwy użytkownika Kubernetes z oświadczeń JWT. Musi zawierać aks:jwt: prefiks, aby zapobiec konfliktom z innymi metodami uwierzytelniania.
groups Wyrażenie CEL definiujące sposób konstruowania członkostwa w grupach systemu Kubernetes z oświadczeń JWT. Musi zawierać aks:jwt: prefiks, aby zapobiec konfliktom z innymi metodami uwierzytelniania.
uid Opcjonalne wyrażenie CEL, które definiuje unikatowy identyfikator użytkownika.
extra Opcjonalna mapa dodatkowych atrybutów użytkownika zdefiniowanych przez wyrażenia CEL.

Konfiguracja reguł walidacji użytkownika

W poniższej tabeli opisano kluczowe elementy userValidationRules konfiguracji:

Element reguły weryfikacji użytkownika Opis
expression Wyrażenie CEL definiujące dodatkową logikę walidacji, która ma być stosowana do końcowych mapowanych informacji o użytkowniku. Wyrażenie musi mieć wartość true, aby użytkownik został zaakceptowany.
message Komunikat o błędzie zwracany, gdy reguła walidacji użytkownika nie zostanie spełniona.

Utwórz uwierzytelniacz JWT

  • Dodaj uwierzytelniacz JWT do klastra AKS przy użyciu polecenia az aks jwtauthenticator add.

    az aks jwtauthenticator add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth \
        --config-file jwt-config.json
    

Zarządzanie wystawcami uwierzytelnień JWT

Wyświetlanie listy wszystkich wystawców uwierzytelnień JWT

  • Wyświetl listę wszystkich autentykatorów JWT w twoim klastrze za pomocą polecenia az aks jwtauthenticator list.

    az aks jwtauthenticator list \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME
    

Uzyskaj szczegóły dla określonego uwierzytelniającego JWT

  • Uzyskaj szczegółowe informacje dotyczące określonego modułu az aks jwtauthenticator show uwierzytelniania JWT przy użyciu polecenia .

    az aks jwtauthenticator show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth
    

Konfigurowanie GitHub Actions OIDC na potrzeby uwierzytelniania

  1. Utwórz zmienne środowiskowe i ustaw następujące wymagane wpisy tajne w repozytorium GitHub:

    • AKS_SERVER_URL: adres URL interfejsu API serwera klastra AKS.
    • AKS_CA_DATA: dane autoryzacji certyfikatu zakodowane w formacie Base64 dla klastra usługi AKS.
  2. Utwórz przepływ pracy, który uzyskuje token OIDC i używa go do uwierzytelniania w klastrze AKS. Poniższy przykładowy przepływ pracy pobiera wszystkie zasobniki uruchomione w klastrze:

    Uwaga / Notatka

    Wartość my-api odbiorcy powinna odpowiadać odbiorcom skonfigurowanym w konfiguracji uwierzytelniacza JWT.

    name: AKS Access with GitHub OIDC
    on:
      workflow_dispatch:
      push:
        branches: [main]
    
    permissions:
      id-token: write
      contents: read
    
    jobs:
      aks-access:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v4
    
          - name: Install kubectl
            uses: azure/setup-kubectl@v3
            with:
              version: 'latest'
    
          - name: Get GitHub OIDC token
            id: get_token
            run: |
              TOKEN=$(curl -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
                "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=my-api" | \
                jq -r '.value')
              echo "::add-mask::$TOKEN"
              echo "oidc_token=$TOKEN" >> $GITHUB_OUTPUT
    
          - name: Create kubeconfig with OIDC token
            run: |
              cat <<EOF > kubeconfig
              apiVersion: v1
              kind: Config
              clusters:
              - cluster:
                  certificate-authority-data: ${{ secrets.AKS_CA_DATA }}
                  server: ${{ secrets.AKS_SERVER_URL }}
                name: aks-cluster
              contexts:
              - context:
                  cluster: aks-cluster
                  user: github-oidc-user
                name: aks-context
              current-context: aks-context
              users:
              - name: github-oidc-user
                user:
                  token: ${{ steps.get_token.outputs.oidc_token }}
              EOF
    
          - name: List all pods in the cluster
            run: |
              export KUBECONFIG=./kubeconfig
              kubectl get pods --all-namespaces
    

Pobierz informacje o klastrze dla konfiguracji uwierzytelniacza JWT

  1. Uzyskaj adres URL serwera API dla klastra, korzystając z polecenia az aks show.

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. Pobierz dane urzędu certyfikacji zakodowane w formacie base64 dla klastra az aks get-credentials przy użyciu polecenia .

    # Get CA data (base64 encoded)
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --file - --format exec | \
      grep certificate-authority-data | awk '{print $2}'
    

Konfigurowanie usługi Google Identity OAuth 2.0 na potrzeby uwierzytelniania

Uwierzytelnianie tożsamości Google można skonfigurować przy użyciu kubelogin wtyczki lub bezpośrednio przy użyciu tokenu statycznego.

  • Dodaj nowy kontekst użytkownika do pliku kubeconfig. Przykład:

    users:
    - name: external-user
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1beta1
          command: kubectl
          args:
          - oidc-login
          - get-token
          - --oidc-issuer-url=https://accounts.google.com
          - --oidc-client-id=your-client-id.apps.googleusercontent.com
          - --oidc-client-secret=your-client-secret
    

Testowanie uwierzytelniania

  1. Wyzwól przepływ pracy przez wypchnięcie do gałęzi głównej lub ręczne wyzwolenie go z karty Akcje w repozytorium.

  2. Monitoruj wykonywanie przepływu pracy na karcie Akcje, aby sprawdzić, czy uwierzytelnianie działa.

    Oczekiwane rezultaty pierwszej konfiguracji przed ustawieniem Role-Based Access Control (RBAC):

    Error from server (Forbidden): nodes is forbidden: User "aks:jwt:github:your-sub" cannot list resource "nodes" in API group "" at the cluster scope
    

    Ten błąd wskazuje na pomyślne uwierzytelnienie, ale brak autoryzacji.

  • Przetestuj uwierzytelnianie przy użyciu polecenia kubectl get nodes z flagą --user, aby określić kontekst użytkownika utworzony na potrzeby uwierzytelniania Google Identity. Przykład:

    kubectl get nodes --user external-user
    

    Oczekiwane rezultaty pierwszej konfiguracji przed ustawieniem Role-Based Access Control (RBAC):

    Error from server (Forbidden): nodes is forbidden: User "aks:jwt:google:your-subject" cannot list resource "nodes" in API group "" at the cluster scope
    

    Ten błąd wskazuje na pomyślne uwierzytelnienie, ale brak autoryzacji.

Konfiguracja kontroli dostępu na podstawie roli (RBAC) w Kubernetes

Utwórz odpowiednie powiązania RBAC dla użytkowników zewnętrznych i użyj poświadczeń administratora klastra, aby zastosować te konfiguracje.

  1. Utwórz plik o nazwie rbac-config.yaml w celu skonfigurowania powiązań RBAC dla użytkowników zewnętrznych. Przykład:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: external-user-role
    rules:
    - apiGroups: [""]
      resources: ["pods", "services", "nodes"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments", "replicasets"]
      verbs: ["get", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: external-user-binding
    subjects:
    - kind: User
      # This matches the username expression in claim mappings for GitHub; example of GitHub subject is "repo:<organization-name>/<repository-name>:ref:refs/heads/main"
      name: aks:jwt:github:your-github-sub
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: external-user-role
      apiGroup: rbac.authorization.k8s.io
    
  2. Zastosuj konfigurację RBAC, używając polecenia kubectl apply.

    kubectl apply -f rbac-config.yaml
    
  1. Utwórz plik o nazwie rbac-config.yaml w celu skonfigurowania powiązań RBAC dla użytkowników zewnętrznych. Przykład:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: external-user-role
    rules:
    - apiGroups: [""]
      resources: ["pods", "services", "nodes"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments", "replicasets"]
      verbs: ["get", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: external-user-binding
    subjects:
    - kind: User
      # This matches the username expression in claim mappings for Google
      name: aks:jwt:google:your-subject-claim
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: external-user-role
      apiGroup: rbac.authorization.k8s.io
    
  2. Zastosuj konfigurację RBAC, używając polecenia kubectl apply.

    kubectl apply -f rbac-config.yaml
    

Weryfikowanie dostępu za pomocą kontroli dostępu opartej na rolach

  • Sprawdź, czy użytkownik zewnętrzny może teraz uzyskiwać dostęp do zasobów zgodnie z uprawnieniami RBAC skonfigurowanymi za pomocą poleceń kubectl get nodes i kubectl get pods oraz flagi --user. Przykład:

    kubectl get nodes --user external-user
    kubectl get pods --user external-user
    

Usuń autentykator JWT

  • Jeśli nie potrzebujesz już uwierzytelniania JWT, usuń go z klastra usługi AKS przy użyciu polecenia az aks jwtauthenticator delete.

    az aks jwtauthenticator delete \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $CLUSTER_NAME \
        --name external-auth