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

Container Service for Kubernetes:異なるポッドが異なるクラウドサービスにアクセスすることを承認するためにRRSAを使用する

最終更新日:Nov 10, 2025

RAM Roles for Service Accounts(RRSA)機能を使用して、Container Service for Kubernetes(ACK)クラスタにデプロイされている異なるポッドに対してアクセス制御を実施できます。 これにより、ポッドに対するきめ細かいAPI権限制御を実現し、セキュリティリスクを軽減します。 このトピックでは、ACKクラスタでRRSAを使用する方法について説明します。

背景情報

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

image

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

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

image

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

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

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

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

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

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

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

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

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

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

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

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

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

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

制限

RRSA機能は、Kubernetes 1.22以降を実行するACKクラスタのみをサポートしています。 RRSA機能をサポートするACKクラスタには、ACK ベーシッククラスタACK Pro マネージドクラスターACK Serverless ベーシッククラスタACK Serverless Pro クラスタ、および ACK Edge Pro クラスタが含まれます。

RRSAを有効にする

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

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

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 を参照してください。

  • クラスタのサービスアカウントトークンボリュームプロジェクションを有効にし、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.2.0
            imagePullPolicy: "Always"
            args:
              - rrsa
              - demo
              - --region=cn-hangzhou
            name: demo
        restartPolicy: OnFailure
    2. 次のコマンドを実行して、アプリケーションをデプロイします。

      kubectl apply -f demo.yaml
  5. 次のコマンドを実行して、ack-pod-identity-webhookが必要な構成をアプリケーション用に作成されたポッドに挿入したかどうかを確認します。

    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
        image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
        imagePullPolicy: Always
        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が次の構成をポッドに挿入したことを示しています。

    カテゴリ

    構成項目

    説明

    環境変数

    ALIBABA_CLOUD_ROLE_ARN

    アシュームされるRAMロールのARN。

    ALIBABA_CLOUD_OIDC_PROVIDER_ARN

    OIDC IdPのARN。

    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. オプション: AliyunCSReadOnlyAccessシステムポリシーをRAMロールからデタッチします。 詳細については、「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.0.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ロールの信頼ポリシーを変更する必要があります。 これにより、アプリケーションはサービスアカウントを使用して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:OIDC RoleArn を使用する」をご参照ください。

Go用SDKのデモ

Java

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

Java用SDKのデモ

Python 3

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

Python 3用SDKのデモ

Node.jsとTypeScript

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

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

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

クラウド プロダクト

SDK

デモ

Object Storage Service (OSS)

OSS Go SDK

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

Go用SDKのデモ

OSS Java SDK

詳細については、「アクセス資格情報を設定する」をご参照ください。

Java用SDKのデモ

OSS Python SDK

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

Python用SDKのデモ

Simple Log Service

Simple Log Service Java 用 SDK

詳細については、「Simple Log Service SDK for Java の使用を開始する」をご参照ください。

Java用SDKのデモ

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 機能を使用するポッドを再作成する必要があります。

{
 "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 ロールを使用し、RAM ロールに必要な権限を付与する」をご参照ください。

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

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

展開して構成の詳細を表示

CLI

構成方法

Alibaba Cloud CLI

RRSA の OIDC トークン認証をサポートするには、~/.aliyun/config.json ファイルの mode パラメーターを 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

RRSAのOIDCトークン認証をサポートするために、Simple Log Service CLIの構成ファイルを変更することはできません。 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の例

参考資料

\