AKS 構造化認証を使用して外部 ID プロバイダーを構成する (プレビュー)

この記事では、構造化認証を使用してAzure Kubernetes Service (AKS)コントロール プレーン認証用に GitHub および Google ID 外部 ID プロバイダーを構成する方法について説明します。 JSON Web トークン (JWT) 認証子を作成し、要求の検証とマッピングを構成し、認証フローをテストする方法について説明します。

Important

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は運用環境での使用を目的としていません。 詳細については、次のサポート記事を参照してください。

[前提条件]

  • 外部 ID プロバイダーを使用した AKS への認証の 概念の概要 を確認します。
  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLIinstallします。 Windowsまたは macOS で実行している場合は、Docker コンテナーでAzure CLIを実行することを検討してください。 詳細については、「 Docker コンテナーでAzure CLIを実行する方法を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI を使用して Azure に認証するを参照してください。

    • メッセージが表示されたら、最初に使用するときにAzure CLI拡張機能をインストールします。 拡張機能の詳細については、「Azure CLIを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事では、バージョン 2.77.0 以降のAzure CLIが必要です。 Azure Cloud Shellを使用している場合は、最新バージョンが既にインストールされています。 ローカル コンピューターにAzure CLIをインストールまたは更新するには、「Azure CLIを参照してください。

  • 構造化認証機能を使用するには、aks-preview Azure CLI 拡張機能バージョン 18.0.0b41 以降をインストールする必要があります。

    • まだ aks-preview 拡張機能をインストールしていない場合は、az extension add コマンドを使用してインストールします。

      az extension add --name aks-preview
      
    • 既に aks-preview 拡張機能をインストールしている場合は、az extension update コマンドを使用して最新バージョンであることを確認するために更新します。

      az extension update --name aks-preview
      
    • aks-preview コマンドを使用して、必要なバージョンのaz extension show拡張機能があることを確認します。

      az extension show --name aks-preview --query version
      
  • Kubernetes バージョン 1.30 以降を実行している AKS クラスター。 AKS クラスターを作成するには、「 Azure CLIを参照してください。

  • kubectl Kubernetes クラスターと対話するためのコマンド ライン ツール。 Azure Cloud Shellを使用する場合、kubectl は既にインストールされています。 kubectl コマンドを使用して、az aks install-cliをローカルにインストールできます。

    az aks install-cli
    
  • OpenID Connect (OIDC) をサポートする外部 ID プロバイダー。

  • クラスター ノードから ID プロバイダーへのネットワーク接続。

  • kubelogin プラグインを使用する場合は、kubelogin セットアップ ガイドの手順に従ってインストールします。

環境変数の設定

  • リソース グループとクラスター名に次の環境変数を設定します。

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

JWTAuthenticatorPreview機能を登録する

  1. JWTAuthenticatorPreview コマンドを使用して、az feature register機能を登録します。

    az feature register --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  2. az feature show コマンドを使用して、機能の登録状態を確認します。

    az feature show --name JWTAuthenticatorPreview --namespace Microsoft.ContainerService
    
  3. 状態にRegisteredが表示されたら、Microsoft.ContainerService コマンドを使用して、az provider registerのリソース プロバイダーの登録を更新します。

    az provider register --namespace Microsoft.ContainerService
    

GitHub Actions の OIDC 認証を設定する

  1. GitHub Actions ワークフローに必要なアクセス許可があることを確認します。

  2. ワークフロー ファイルの id-token: write アクセス許可を構成します。 例えば次が挙げられます。

    permissions:
      id-token: write
      contents: read
    
  3. OIDC トークン アクセス用の適切なリポジトリと組織の設定を設定します。 トークンを使用するための リポジトリ OIDC 設定 と組織のセキュリティ ポリシーを構成します。

Google Identity OAuth 2.0 認証を設定する

  1. Google Cloud コンソールに移動します。
  2. プロジェクトを作成または選択します
  3. OAuth 2.0 資格情報を作成します
  4. 後で使用するために、クライアント ID とクライアント シークレットをメモします。

GITHUB ACTIONS OIDC の JWT 認証子構成を作成する

  • 次の構成で jwt-config.json という名前のファイルを作成します。

    {
      "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'"
          }
      ]
    }
    

Google ID の JWT 認証子構成を作成する

  • 次の構成で jwt-config.json という名前のファイルを作成します。

    {
        "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'"
            }
        ]
    }
    

JWT 認証子の構成要素

JWT 認証子の構成には、 issuerclaimValidationRulesclaimMappingsuserValidationRulesの主要な要素が含まれています。 各要素は、AKS が外部 ID プロバイダーからの JWT トークンを検証および処理する方法を定義する特定の目的を果たします。

発行者の構成

次の表では、 issuer 構成の主要な要素について説明します。

発行者設定要素 説明
url JWT の iss 要求と一致する必要がある OIDC 発行者 URL。
audiences JWT を発行する必要がある対象ユーザーの一覧 ( aud 要求に対してチェックされます)。

要求の検証規則の構成

次の表では、 claimValidationRules 構成の主要な要素について説明します。

要求の検証規則要素 説明
expression JWT 要求に適用する検証ロジックを定義する CEL 式。 トークンを受け入れるには、式が true と評価される必要があります。
message 検証規則が失敗したときに返されるエラー メッセージ。

クレームマッピングの構成

次の表では、 claimMappings 構成の主要な要素について説明します。

要求マッピング要素 説明
username JWT 要求から Kubernetes ユーザー名を構築する方法を定義する CEL 式。 他の認証方法との競合を防ぐために、 aks:jwt: プレフィックスを含める必要があります
groups JWT 要求から Kubernetes グループ メンバーシップを構築する方法を定義する CEL 式。 他の認証方法との競合を防ぐために、 aks:jwt: プレフィックスを含める必要があります
uid ユーザーの一意識別子を定義するオプションの CEL 式。
extra CEL 式によって定義された追加のユーザー属性の省略可能なマップ。

ユーザー検証規則の構成

次の表では、 userValidationRules 構成の主要な要素について説明します。

ユーザー検証規則要素 説明
expression 最終的なマップされたユーザー情報に適用する追加の検証ロジックを定義する CEL 式。 ユーザーが受け入れられるには、式が true に評価される必要があります。
message ユーザー検証規則が失敗したときに返されるエラー メッセージ。

JWT 認証システムを作成する

  • az aks jwtauthenticator add コマンドを使用して、JWT 認証子を AKS クラスターに追加します。

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

JWT 認証子の管理

すべての JWT 認証子を一覧表示する

  • az aks jwtauthenticator list コマンドを使用して、クラスター上のすべての JWT 認証子を一覧表示します。

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

特定の JWT 認証子の詳細を取得する

  • az aks jwtauthenticator show コマンドを使用して、特定の JWT 認証子の詳細を取得します。

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

認証用GitHub Actions OIDC を設定する

  1. GitHub リポジトリに次の必須リポジトリ シークレットの環境変数を作成し、設定します。

    • AKS_SERVER_URL: AKS クラスターの API サーバー URL。
    • AKS_CA_DATA: AKS クラスターの Base64 でエンコードされた証明機関データ。
  2. OIDC トークンを取得し、それを使用して AKS クラスターで認証するワークフローを作成します。 次のワークフロー例では、クラスターで実行されているすべてのポッドを取得します。

    my-api対象ユーザーの値は、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
    

JWT 認証システム構成のクラスター情報を取得する

  1. az aks show コマンドを使用して、クラスターの API サーバー URL を取得します。

    az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "fqdn" -o tsv | \
      awk '{print "https://" $0 ":443"}'
    
  2. az aks get-credentials コマンドを使用して、クラスターの base64 でエンコードされた証明機関データを取得します。

    # 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}'
    

認証用に Google Identity OAuth 2.0 を設定する

Google ID 認証は、 kubelogin プラグインを使用するか、静的トークンを直接使用して設定できます。

  • kubeconfig ファイルに新しいユーザー コンテキストを追加します。 例えば次が挙げられます。

    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
    

認証をテストする

  1. メイン ブランチにプッシュするか、リポジトリの [アクション] タブから手動でトリガーして、ワークフローをトリガーします。

  2. [アクション] タブでワークフローの実行を監視し、認証が機能していることを確認します。

    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
    

    このエラーは、認証が成功したが承認されていないことを示します。

  • kubectl get nodes フラグを指定して --user コマンドを使用して認証をテストし、Google ID 認証用に作成したユーザー コンテキストを指定します。 例えば次が挙げられます。

    kubectl get nodes --user external-user
    

    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
    

    このエラーは、認証が成功したが承認されていないことを示します。

Kubernetes Role-Based Access Control (RBAC) の構成

外部ユーザーに適切な RBAC バインドを作成し、クラスター管理者の資格情報を使用してこれらの構成を適用します。

  1. rbac-config.yamlという名前のファイルを作成して、外部ユーザーの RBAC バインドを構成します。 例えば次が挙げられます。

    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. kubectl apply コマンドを使用して RBAC 構成を適用します。

    kubectl apply -f rbac-config.yaml
    
  1. rbac-config.yamlという名前のファイルを作成して、外部ユーザーの RBAC バインドを構成します。 例えば次が挙げられます。

    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. kubectl apply コマンドを使用して RBAC 構成を適用します。

    kubectl apply -f rbac-config.yaml
    

RBAC を使用してアクセスを確認する

  • RBAC アクセス許可に従って外部ユーザーがリソースにアクセスできることを確認するために、kubectl get nodesおよびkubectl get podsコマンドを--userフラグとともに使用してください。 例えば次が挙げられます。

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

JWT 認証システムを削除する

  • JWT 認証システムが不要になったら、 az aks jwtauthenticator delete コマンドを使用して AKS クラスターから削除します。

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