すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:RRSA を使用した、異なる Pod から異なるクラウドサービスへのアクセスの認可

最終更新日:Dec 17, 2025

サービスアカウントの RAM ロール (RRSA) 機能を使用すると、Container Service for Kubernetes (ACK) クラスターにデプロイされたさまざまな Pod に対してアクセス制御を強制できます。これにより、Pod に対するきめ細かい API 権限制御が実現し、セキュリティリスクが軽減されます。このトピックでは、ACK クラスターで RRSA を使用する方法について説明します。

背景情報

Elastic Container Instance は Elastic Compute Service (ECS) インスタンス上で実行されます。ECS インスタンスメタデータには、Alibaba Cloud 内の ECS インスタンスに関する情報が含まれています。実行中のインスタンス内からこのメタデータにアクセスして、インスタンスを設定または管理できます。ACK クラスターにデプロイされたアプリケーションは、ECS インスタンスメタデータを使用して、さまざまな Resource Access Management (RAM) ロールを引き受けるために使用される Security Token Service (STS) トークンを取得できます。これにより、アプリケーションはさまざまなクラウドサービスの API を呼び出すことができます。詳細については、「インスタンスメタデータ」をご参照ください。

image

セキュリティ上の理由から、クラスター内の異なるアプリケーションに対して RAM 権限を制限する必要がある場合、ECS または Elastic Container Instance のメタデータを介してインスタンスロールに関連付けられた STS トークンを取得する機能を無効にするか、インスタンスに関連付けられたロールに RAM ポリシーを割り当てないようにする必要があります。しかし、これらのアプリケーションは依然として、クラウドリソースにアクセスするための STS トークンを安全に取得する方法を必要とします。これらの問題に対処するため、ACK は RAM に基づいて開発された RRSA 機能をリリースしました。

RRSA 機能を使用すると、ACK クラスター内の異なるアプリケーションが異なる RAM ロールを引き受けることを許可できます。アプリケーションは STS トークンを取得し、そのトークンを使用して特定の RAM ロールを引き受け、関連するクラウドサービスにアクセスできます。これにより、最小権限の原則が徹底され、アプリケーションは AccessKey ペアを使用せずに API 操作を呼び出すことができるため、AccessKey ペアの漏洩を防ぐことができます。

image

サービスアカウントの RAM ロール (RRSA) を使用してアクセスの制御を実施する場合、アプリケーションは以下の手順でクラウドリソースにアクセスします。

  1. テナントは、サービスアカウントトークンのボリュームプロジェクション機能が有効になっている Pod をデプロイします。

  2. Container Service for Kubernetes (ACK) クラスターは、サービスアカウントの OpenID Connect (OIDC) トークンファイルを作成し、そのトークンファイルを Pod にマウントします。

  3. Pod 内のアプリケーションは、OIDC トークンファイルを使用して Security Token Service (STS) の AssumeRoleWithOIDC API 操作を呼び出し、RAM ロールを偽装するための STS トークンを取得します。

    説明
    • アプリケーションがこれらの操作を実行できるようにするには、まず OIDC ID プロバイダーを作成し、Pod で使用されるサービスアカウントが指定された RAM ロールを偽装することを許可する必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。

    • OIDC トークンファイル内の OIDC トークンは一時的なトークンです。アプリケーションが OIDC トークンファイルから最新のトークンを読み取るように設定することを推奨します。クラスターは、トークンの有効期限が切れる前に OIDC トークンファイル内のトークンを更新します。

  4. Pod 内のアプリケーションは、STS トークンを使用して指定された RAM ロールを偽装し、関連するクラウドサービスの API を呼び出します。

RRSA を使用してアクセス制御を強制する場合、アプリケーションがクラウドリソースにアクセスする手順は次のとおりです。

  1. テナントは、ServiceAccount トークンボリュームプロジェクション機能が有効になっている Pod をデプロイします。

  2. ACK クラスターは、サービスアカウントの OpenID Connect (OIDC) トークンファイルを作成し、そのトークンファイルを Pod にマウントします。

  3. Pod 内のアプリケーションは、OIDC トークンファイルを使用して STS の AssumeRoleWithOIDC API 操作を呼び出し、RAM ロールを引き受けるために使用される STS トークンを取得します。

    説明
    • アプリケーションがこれらの操作を実行できるようにするには、まず OIDC ID プロバイダーを作成し、Pod で使用されるサービスアカウントが指定された RAM ロールを偽装できるようにする必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。

    • OIDC トークンファイル内の OIDC トークンは一時的なトークンです。アプリケーションが OIDC トークンファイルから最新のトークンを読み取るように設定することを推奨します。クラスターは、トークンの有効期限が切れる前に OIDC トークンファイル内のトークンを更新します。

  4. Pod 内のアプリケーションは、STS トークンを使用して指定された RAM ロールを引き受け、関連するクラウドサービスの API を呼び出します。

制限事項

RRSA 機能は、Kubernetes 1.22 以降を実行する ACK クラスターのみをサポートします。RRSA 機能をサポートする ACK クラスターには、ACK Basic クラスターACK Pro クラスターACK Serverless Basic クラスターACK Serverless Pro クラスター、およびACK Edge Pro クラスターが含まれます。

RRSA の有効化

既存のクラスターがない場合は、ACK マネージドクラスターまたはACK Edge クラスターを作成するときに RRSA を有効にします。それ以外の場合は、クラスター詳細ページの セキュリティと監査 セクションで有効にします。

ACK Serverless クラスターの場合、この機能は作成後にクラスター詳細ページの セキュリティと監査 セクションから有効にする必要があります。
重要

RRSA 機能を有効にすると、新しく作成されるすべての ServiceAccount トークンの最大有効期間は 12 時間に制限されます。

クラスター作成時の有効化

ACK マネージドクラスターまたはACK Edge クラスターを作成する際、クラスター設定 ステップの 詳細オプション (任意) セクションで、RRSA OIDC の横にある 有効化 をクリックします。

image

クラスター作成後の有効化

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。

  2. クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。

  3. 基本情報 タブの セキュリティと監査 セクションで、RRSA OIDC の横にある 有効化 をクリックします。image

  4. RRSA の有効化 ダイアログボックスで、確認 をクリックします。

    基本情報 セクションで、クラスターのステータスが 更新中 から 実行中 に変わると、クラスターの RRSA 機能が有効になります。

URL と ARN 情報の取得

クラスターで RRSA 機能を有効にした後、基本情報 タブの セキュリティと監査 セクションに移動します。RRSA OIDC の横にある 有効 ラベルにマウスを合わせると、OIDC プロバイダーの URL と Alibaba Cloud リソース名 (ARN) が表示されます。image

RRSA が有効になると、ACK はバックグラウンドで次の操作を実行します。

  • クラスター専用の OIDC 発行者を自動的に作成します。OIDC 発行者は ACK によって管理されます。詳細については、「OIDC Issuer」をご参照ください。

  • クラスターの ServiceAccount トークンボリュームプロジェクションを有効にし、OIDC 発行者の設定をクラスターの既存の service-account-issuer パラメーターの値とマージします。詳細については、「ServiceAccount トークンボリュームプロジェクションの使用」をご参照ください。

  • アカウント内に RAM ロール ID プロバイダーを作成します。ID プロバイダーは、シングルサインオン (SSO) に OIDC 発行者を使用します。ID プロバイダーの名前は ack-rrsa-<cluster_id> です。<cluster_id> はクラスターの ID を示します。詳細については、「OIDC IdP の管理」をご参照ください。

RRSA の操作

クラスターで RRSA を有効にした後、次の手順を実行して、クラスター内のアプリケーションが RRSA を介して STS トークンを取得できるようにします。STS トークンは、特定のクラウドサービスの API を呼び出すために使用されます。

この例では、アプリケーションを作成し、クラスターで RRSA を有効にして、アプリケーションが次の操作を実行できるようにします:指定された RAM ロールを引き受け、API 操作を呼び出して現在の Alibaba Cloud アカウントに属するクラスターをクエリする。

設定例

  • 名前空間:rrsa-demo

  • サービスアカウント:demo-sa

  • RAM ロール:demo-role-for-rrsa

手順

使用示例流程

  1. ack-pod-identity-webhook コンポーネントをインストールします。

    1. クラスター ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、操作 > アドオン を選択します。

    2. アドオン ページで、セキュリティ タブをクリックし、ack-pod-identity-webhook を見つけて、カードの右下部分にある インストール をクリックします。

    3. 表示されるメッセージで情報を確認し、OK をクリックします。

  2. demo-role-for-rrsa という名前の RAM ロールを作成します。次の表にパラメーターを示します。詳細な手順については、「OIDC IdP の RAM ロールを作成する」をご参照ください。

    パラメーター

    説明

    ID プロバイダータイプ

    OIDC を選択します。

    ID プロバイダー

    IdP を選択します。IdP は ack-rrsa-<cluster_id> の形式で命名されます。<cluster_id> はクラスターの ID を示します。

    条件

    • oidc:iss:デフォルト値を使用します。

    • oidc:aud:デフォルト値を使用します。

    • oidc:sub:この条件を手動で追加します。

      • キーoidc:sub を選択します。

      • 演算子StringEquals を選択します。

      • system:serviceaccount:<namespace>:<serviceAccountName> を入力します。

        • <namespace>:アプリケーションの名前空間を指定します。

        • <serviceAccountName>:サービスアカウントの名前を指定します。この例では、system:serviceaccount:rrsa-demo:demo-sa を入力します。

    RAM ロール名

    値を demo-role-for-rrsa に設定します。

  3. ステップ 2 で作成した RAM ロールに AliyunCSReadOnlyAccess ポリシーをアタッチして、アプリケーションに必要な権限を付与します。詳細については、「RAM ロールに権限を付与する」をご参照ください。

  4. アプリケーションをデプロイします。SDK デモの詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。

    1. 次の要件に基づいて demo.yaml という名前のファイルを作成します。

      以下の YAML テンプレート例では、pod-identity.alibabacloud.com/injection: 'on' ラベルが名前空間に追加され、pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa アノテーションがサービスアカウントに追加され、ack-pod-identity-webhook の自動インジェクション機能が有効になります。ack-pod-identity-webhook の設定方法の詳細については、「ack-pod-identity-webhook」をご参照ください。

      サンプルコードの表示

      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: rrsa-demo
        labels:
          pod-identity.alibabacloud.com/injection: 'on'
      
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: demo-sa
        namespace: rrsa-demo
        annotations:
          pod-identity.alibabacloud.com/role-name: demo-role-for-rrsa
      
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: demo
        namespace: rrsa-demo
      spec:
        serviceAccountName: demo-sa
        containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
            args:
              - rrsa
              - demo
            name: demo
        restartPolicy: OnFailure
    2. 次のコマンドを実行してアプリケーションをデプロイします。

      kubectl apply -f demo.yaml
  5. 次のコマンドを実行して、ack-pod-identity-webhook がアプリケーション用に作成された Pod に必要な設定をインジェクトしたかどうかを確認します。

    kubectl -n rrsa-demo get pod demo -o yaml

    期待される出力

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: rrsa-demo
    spec:
      containers:
      - args:
        - rrsa
        - demo
        env:
        - name: ALIBABA_CLOUD_ROLE_ARN
          value: acs:ram::1***:role/demo-role-for-rrsa
        - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
          value: acs:ram::1***:oidc-provider/ack-rrsa-c***
        - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
          value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
        - name: ALIBABA_CLOUD_STS_ENDPOINT
          value: sts-vpc.cn-hangzhou.aliyuncs.com
        - name: ALIBABA_CLOUD_STS_REGION
          value: cn-hangzhou
        - name: ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED
          value: "true"
        image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
        name: demo
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-4bwdg
          readOnly: true
        - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
          name: rrsa-oidc-token
          readOnly: true
      restartPolicy: OnFailure
      serviceAccount: demo-sa
      serviceAccountName: demo-sa
      volumes:
      - name: kube-api-access-4bwdg
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              expirationSeconds: 3607
              path: token
          - configMap:
              items:
              - key: ca.crt
                path: ca.crt
              name: kube-root-ca.crt
          - downwardAPI:
              items:
              - fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
                path: namespace
      - name: rrsa-oidc-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.aliyuncs.com
              expirationSeconds: 3600
              path: token

    この出力は、ack-pod-identity-webhook が Pod に次の設定をインジェクトしたことを示しています。

    カテゴリ

    設定項目

    説明

    環境変数

    ALIBABA_CLOUD_ROLE_ARN

    引き受ける RAM ロールの ARN。

    ALIBABA_CLOUD_OIDC_PROVIDER_ARN

    OIDC IdP の ARN。

    ALIBABA_CLOUD_STS_ENDPOINT

    現在のリージョンにおける STS の VPC エンドポイント。

    ALIBABA_CLOUD_STS_REGION

    STS のリージョン ID。

    ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED

    プライベート VPC エンドポイント経由での STS へのアクセスを有効または無効にするフラグ。VPC エンドポイントを使用するには true に設定します。

    ALIBABA_CLOUD_OIDC_TOKEN_FILE

    OIDC トークンファイルのパス。

    VolumeMount

    rrsa-oidc-token

    OIDC トークンをマウントするための設定。

    Volume

    rrsa-oidc-token

    OIDC トークンをマウントするための設定。

  6. 次のコマンドを実行して、アプリケーションのログを出力します。

    kubectl -n rrsa-demo logs demo

    出力にクラスターのリストが表示されます:

    cluster id: cf***, cluster name: foo*
    cluster id: c8***, cluster name: bar*
    cluster id: c4***, cluster name: foob*
  7. (任意) RAM ロールから AliyunCSReadOnlyAccess システムポリシーをデタッチします。詳細については、「RAM ロールから権限を削除する」をご参照ください。

    30 秒待ってから、次のコマンドを再度実行してアプリケーションのログを出力します。

    kubectl -n rrsa-demo logs demo

    次のエラーメッセージは、アプリケーションに必要な権限がないことを示しています:

       StatusCode: 403
       Code: StatusForbidden
       Message: code: 403, STSToken policy Forbidden for action cs:DescribeClustersForRegion request id: E78A2E2D-***
       Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClustersForRegion","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"11***","AuthPrincipalType":"AssumedRoleUser","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClustersForRegion","requestId":"E78A2E2D-***","status":403,"statusCode":403}

アプリケーションテンプレートを手動で変更して RRSA を有効にする

アプリケーションテンプレートで必要な OIDC トークンファイルを手動で環境変数として指定できます。これにより、ack-pod-identity-webhook をインストールせずに RRSA を有効にできます。

次のテンプレートに例を示します。

サンプルコード

apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: rrsa-demo
spec:
  containers:
  - args:
    - rrsa
    - demo
    env:
    - name: ALIBABA_CLOUD_ROLE_ARN
      value: <role_arn>
    - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
      value: <oid_provider_arn>
    - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
      value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
    image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.0
    imagePullPolicy: Always
    name: demo
    volumeMounts:
    - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
      name: rrsa-oidc-token
      readOnly: true
  restartPolicy: OnFailure
  serviceAccount: demo-sa
  serviceAccountName: demo-sa
  volumes:
  - name: rrsa-oidc-token
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          audience: sts.aliyuncs.com
          expirationSeconds: 3600
          path: token
重要

上記のテンプレートで次のフィールドを変更します。

  • <oid_provider_arn> を、クラスターが使用する OIDC プロバイダーの ARN に置き換えます。ARN の取得方法の詳細については、「URL と ARN 情報の取得」をご参照ください。

  • <role_arn> を、アプリケーションが使用する RAM ロールの ARN に置き換えます。ARN は RAM コンソールロール ページで取得できます。

  • audience パラメーターを sts.aliyuncs.com に設定します。この値は、RRSA 機能が有効になったときに自動的に作成される OIDC IdP で設定されたクライアントの ID です。SDK が STS の AssumeRoleWithOIDC 操作を呼び出すために使用するドメイン名ではありません。SDK を使用する際に、適切な STS ドメイン名を指定できます。

  • expirationSeconds を 600 から 43200 までの値に設定します。単位は秒です。43200 より大きい値を指定した場合でも、OIDC トークンの有効期間は 43,200 秒 (12 時間) になります。

変更したテンプレートに基づいてアプリケーションを再デプロイすると、アプリケーションはテンプレートで指定した OIDC トークンファイル、RAM ロール ARN、および OIDC プロバイダー ARN を使用して、STS の AssumeRoleWithOIDC 操作を呼び出し、特定の RAM ロールを引き受けるための STS トークンを取得できます。これにより、アプリケーションはさまざまなクラウドサービスの API 操作を呼び出すことができます。OIDC トークンファイルは ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数で、RAM ロール ARN は ALIBABA_CLOUD_ROLE_ARN 環境変数で、OIDC プロバイダー ARN は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数で指定されます。アプリケーションは、ファイルを使用する際に OIDC トークンファイルから最新の OIDC トークンを読み取ります。SDK デモの詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。詳細については、「AssumeRoleWithOIDC」をご参照ください。

既存の RAM ロールを使用し、必要な権限を付与する

アプリケーションに既存の RAM ロールを使用させたい場合は、次のテンプレートに基づいて RAM ロールの信頼ポリシーを変更する必要があります。これにより、アプリケーションはサービスアカウントを使用して RAM ロールを引き受け、STS トークンを取得できます。詳細については、「RAM ロールの信頼ポリシーを編集する」をご参照ください。

Statement 設定の例:

{
  "Action": "sts:AssumeRole",
  "Condition": {
    "StringEquals": {
      "oidc:aud": "sts.aliyuncs.com",
      "oidc:iss": "<oidc_issuer_url>",
      "oidc:sub": "system:serviceaccount:<namespace>:<service_account>"
    }
  },
  "Effect": "Allow",
  "Principal": {
    "Federated": [
      "<oidc_provider_arn>"
    ]
  }
}
重要

Statement 設定で次のフィールドを変更します。

  • <oidc_issuer_url> を、クラスターが使用する OIDC プロバイダーの URL に置き換えます。URL の取得方法の詳細については、「URL と ARN 情報の取得」をご参照ください。

  • <oidc_provider_arn> を、クラスターが使用する OIDC プロバイダーの ARN に置き換えます。ARN の取得方法の詳細については、「URL と ARN 情報の取得」をご参照ください。

  • <namespace> を、アプリケーションの名前空間に置き換えます。

  • <service_account> を、アプリケーションが使用するサービスアカウントに置き換えます。

ack-ram-tool ツールを使用して、信頼ポリシーの変更を自動化することもできます。コマンド例:

ack-ram-tool rrsa associate-role --cluster-id <cluster_id> \
    --namespace <namespace> --service-account <service_account> \
    --role-name <role_name> --create-role-if-not-exist

RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ

SDK デモ

Alibaba Cloud SDK V2.0 は、RRSA の OIDC トークン認証をサポートしています。デフォルトでは、STS トークン認証をサポートし、Alibaba Cloud SDK V2.0 に基づいて開発されたすべてのクラウドサービス SDK は、RRSA OIDC トークン認証をサポートしています。次の表に、サポートされている SDK のバージョンとデモを示します。

プログラミング言語

サポートされている SDK バージョン

デモ

Go

Alibaba Cloud Credentials for Go 1.2.6 以降。詳細については、「方法 6:OIDCRoleArn の使用」をご参照ください。

SDK for Go のデモ

Java

Alibaba Cloud Credentials for Java 0.2.10 以降。詳細については、「方法 6:OIDCRoleArn」をご参照ください。

SDK for Java のデモ

Python 3

Alibaba Cloud Credentials for Python 0.3.1 以降。詳細については、「方法 6:OIDCRoleArn」をご参照ください。

SDK for Python 3 のデモ

Node.js と TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 以降。詳細については、「方法 6:OIDC IdP の RAM ロールを使用する」をご参照ください。

SDK for Node.js と SDK for TypeScript のデモ

一部のクラウドサービス SDK では、API 操作を呼び出す際に、上記の方法を参照して RRSA の OIDC トークンを認証に使用できます。次の表に SDK のデモを示します。

クラウドプロダクト

SDK

デモ

Object Storage Service (OSS)

OSS GO SDK

詳細については、「方法 5:OIDCRoleARN の使用」をご参照ください。

SDK for Go のデモ

OSS Java SDK

詳細については、「アクセス認証情報の設定」をご参照ください。

SDK for Java のデモ

OSS Python SDK

詳細については、「OIDC IdP のロールを使用する」をご参照ください。

SDK for Python のデモ

Simple Log Service

Simple Log Service SDK for Java

詳細については、「Simple Log Service SDK for Java の概要」をご参照ください。

SDK for Java のデモ

SDK エラーの解決策

次の表に、さまざまなエラーの解決策を示します。

エラーメッセージ

考えられる原因

解決策

{
 "Code": "AuthenticationFail.OIDCToken.Expired",
 "Message": "This JsonWebToken is expired."
}

アプリケーションが使用している OIDC トークンの有効期限が切れています。

OIDC トークンファイルは ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数で指定されています。ファイルを使用するたびに最新の OIDC トークンを読み取る必要があります。アプリケーションを手動で設定してトークンを取得するのではなく、Alibaba Cloud SDK を使用して OIDC トークンを取得することを推奨します。詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。

{
 "Code": "Throttling.User",
 "Message": "Request was denied due to user flow control."
}

アプリケーションが頻繁に OIDC トークンを取得しているため、操作がスロットリングされています。

OIDC トークンを取得する API 操作を頻繁に呼び出さないでください。現在の OIDC トークンの有効期限が切れる前に新しい OIDC トークンを取得する必要はありません。アプリケーションを手動で設定してトークンを取得するのではなく、Alibaba Cloud SDK を使用して OIDC トークンを取得することを推奨します。詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。

{
 "Code": "AuthenticationFail.OIDCToken.AudienceNotMatch",
 "Message": "Invalid audience."
}

アプリケーションテンプレートの audience パラメーターが sts.aliyuncs.com に設定されていません。

audience パラメーターが sts.aliyuncs.com に設定されるように、アプリケーションテンプレートを変更する必要があります。

{
 "Code": "AuthenticationFail.OIDCToken.IssuerConfigurationBroken",
 "Message": "Get public keys from OIDC Provider failed, the issuer is https://kubernetes.default.svc."
}
{
 "Code": "AuthenticationFail.OIDCToken.IssuerNotMatch",
 "Message": "The issuer in the OIDC Token doesn't match the OIDC Provider registered."
}
{
 "Code": "AuthenticationFail.NoPermission",
 "Message": "No such OIDC Provider registered."
}

クラスターで RRSA 機能が無効になっています。

アプリケーションが存在するクラスターで RRSA 機能を有効にする必要があります。詳細については、「RRSA 機能の有効化」をご参照ください。RRSA 機能を有効にした後、RRSA 機能を使用する Pod を再作成する必要があります。

{
 "Code": "EntityNotExist.Role",
 "Message": "The role not exists: acs:ram::19981***:role/***. "
}

アプリケーションが引き受ける RAM ロールが存在しません。

必要な RAM ロールを作成する必要があります。詳細については、「OIDC IdP の RAM ロールを作成する」および「」をご参照ください。

{
  "Code": "AuthenticationFail.NoPermission",
  "Message": "There is no permission"
}

アプリケーションが引き受ける RAM ロールに必要な信頼ポリシーが設定されていません。

アプリケーションが RAM ロールを引き受けられるように、RAM ロールの信頼ポリシーを変更する必要があります。詳細については、「既存の RAM ロールを使用し、必要な権限を付与する」をご参照ください。

一般的に使用される CLI で RRSA の OIDC トークン認証をサポートする

ack-ram-tool を使用して、Pod 内で一般的に使用される CLI (Alibaba Cloud CLI、ossutil 2.0、Terraform など) で RRSA の OIDC トークン認証をサポートできます。次の表に、設定と例を示します。

設定詳細の展開

CLI

設定方法

Alibaba Cloud CLI

~/.aliyun/config.json ファイルの mode パラメーターを OIDC に設定して、RRSA の OIDC トークン認証をサポートします。詳細については、「認証情報の種類」をご参照ください。

説明
  • この機能は Alibaba Cloud CLI v3.0.206 以降でのみサポートされます。

  • region_id の値を目的のリージョンに設定します。

{
  "current": "rrsa",
  "profiles": [
    {
      "name": "rrsa",
      "mode": "OIDC",
      "region_id": "cn-hangzhou",
      "ram_session_name": "test-rrsa"
    }
  ],
  "meta_path": ""
}
$ aliyun sts GetCallerIdentity
{
    "AccountId": "11380***",
    "Arn": "acs:ram::1138***:assumed-role/test-rrsa-***/test-rrsa",
    "IdentityType": "AssumedRoleUser",
    "PrincipalId": "33300***:test-rrsa",
    "RequestId": "20F78881-F47E-5771-90D6-***",
    "RoleId": "33300***"
}

設定ファイルを作成せずに、Alibaba Cloud CLI で関連コマンドを直接実行することもできます。

説明

この機能は Alibaba Cloud CLI v3.0.206 以降でのみサポートされます。

$ aliyun sts GetCallerIdentity --region cn-hangzhou --role-session-name=test-rrsa
{
	"AccountId": "11380***",
	"Arn": "acs:ram::1138***:assumed-role/test-rrsa-***/test-rrsa",
	"IdentityType": "AssumedRoleUser",
	"PrincipalId": "33300***:test-rrsa",
	"RequestId": "20F78881-F47E-5771-90D6-***",
	"RoleId": "33300***"
}

ossutil コマンドラインインターフェイス 2.0

RRSA OIDC トークンを使用するには、~/.ossutilconfig 設定ファイルの mode オプションを oidcRoleArn に設定します。詳細については、「設定例」をご参照ください。

説明
  • この機能は ossutil V2.1.0 以降でのみサポートされます。

  • 設定ファイルのデフォルトの region 値を実際のリージョンに置き換えます。

cat <<EOF > ~/.ossutilconfig
[default]
mode = oidcRoleArn
OIDCProviderArn = "${ALIBABA_CLOUD_OIDC_PROVIDER_ARN}"
OIDCTokenFilePath = "${ALIBABA_CLOUD_OIDC_TOKEN_FILE}"
roleArn = "${ALIBABA_CLOUD_ROLE_ARN}"
roleSessionName = test-rrsa
region = cn-hangzhou
EOF
$ ossutil api describe-regions
<RegionInfoList>
  <RegionInfo>
    <Region>oss-us-west-1</Region>
    <InternetEndpoint>oss-us-west-1.aliyuncs.com</InternetEndpoint>
    <InternalEndpoint>oss-us-west-1-internal.aliyuncs.com</InternalEndpoint>
    <AccelerateEndpoint>oss-accelerate.aliyuncs.com</AccelerateEndpoint>
  </RegionInfo>
  ...
</RegionInfoList>

Simple Log Service CLI

Simple Log Service CLI の設定ファイルを変更して RRSA の OIDC トークン認証をサポートすることはできません。Simple Log Service CLI で ack-ram-tool export-credentials -f environment-variables -- aliyunlog コマンドを実行する必要があります。

$ ack-ram-tool export-credentials -f environment-variables -- aliyunlog log list_project --region-endpoint=cn-hangzhou.log.aliyuncs.com

{"count": 1, "projects": [
{"createTime": "1676282996", "description": "k8s log project, ***",
 "lastModifyTime": "1676282996", "owner": "", "projectName": "k8s-log-c0edc***", 
 "region": "cn-hangzhou", "resourceGroupId": "rg-***", "status": "Normal"}],
  "total": 24}

Terraform

設定ファイルで assume_role_with_oidc パラメーターを設定して、RRSA の OIDC トークン認証をサポートできます。

説明
  • このパラメーターは Alibaba Cloud Provider V1.222.0 以降でのみサポートされます。

  • 設定ファイルの region パラメーターを目的のリージョンに設定します。

provider "alicloud" {
  assume_role_with_oidc {
    role_session_name = "terraform-with-rrsa-auth-example"
  }
  region = "cn-hangzhou"
}

Terraform の例

関連ドキュメント

\