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

Container Compute Service:RRSA を使用して、異なるポッドが異なるクラウドサービスにアクセスすることを承認する

最終更新日:Jun 19, 2025

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

背景情報

OpenID Connect (OIDC) は、Open Authorization (OAuth) 2.0 に基づいて開発された認証プロトコルです。Alibaba Cloud Resource Access Management (RAM) は、OIDC ベースのシングルサインオン (SSO) をサポートしています。Kubernetes クラスタにデプロイされたアプリケーションは、アプリケーションポッドがアシュームする RAM ロールに対して生成された Security Token Service (STS) トークンを使用して、クラウドサービスの API 操作を呼び出すことができます。Alibaba Cloud Container Compute Service (ACS) は RRSA 機能をサポートしています。マルチテナントシナリオでは、RRSA 機能を使用して、異なるポッドが異なるクラウドサービスにアクセスすることを承認できます。ACS クラスタで RRSA 機能を使用して、STS トークンの有効期間を制御できます。

image

次の手順は、RRSA を使用してアクセスコントロールを実施する場合に、アプリケーションがクラウドリソースにアクセスする方法を示しています。

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

    説明

    ACS クラスタでは、サービスアカウントトークンボリュームプロジェクション機能がデフォルトで有効になっています。

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

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

    説明

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

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

RRSA を有効にする

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

  2. [クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。クラスタ詳細ページの左側のナビゲーションウィンドウで、[クラスタ情報] をクリックします。

  3. [クラスタ情報] ページで、[基本情報] タブをクリックします。[RRSA を有効にする] をクリックします。

  4. [RRSA を有効にする] メッセージで、[確認] をクリックします。

    説明
    • RRSA を有効にするには、約 2 ~ 3 分かかります。[クラスタステータス] 列に [更新中] が表示され続ける場合は、右上隅にある image をクリックして、ページを手動でリフレッシュします。

    • クラスタステータスが [更新中] から [実行中] に変わると、クラスタで RRSA が有効になります。[RRSA OIDC] の右側にある [有効] にポインタを移動すると、OIDC プロバイダーの URL と ARN が表示されます。

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

  • クラスタ専用の OIDC issuer を自動的に作成します。OIDC issuer は ACS によって管理されます。

  • アカウント内に RAM ロール ID プロバイダーを作成します。ID プロバイダーは、シングルサインオン (SSO) に OIDC issuer を使用します。ID プロバイダー の名前は ack-rrsa-<cluster_id> です。<cluster_id> はクラスタの ID を示します。

RRSA を使用する

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

新しい RAM ロールを使用し、必要な権限を RAM ロールに付与する

説明

既存の RAM ロールを使用する場合は、必要な権限を RAM ロールに付与する 必要があります。

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

  • 名前空間: rrsa-demo

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

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

  1. demo-role-for-rrsa という名前の RAM ロールを作成します。

    1. Alibaba Cloud アカウントを使用して、RAM コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[ID] > [ロール] を選択します。[ロール] ページで、[ロールの作成] をクリックします。

    3. [ロールの作成] パネルで、[エディターに切り替える] をクリックしてロールを作成します。

    4. たとえば、[ビジュアルエディター] を使用する場合は、次の情報に基づいてロールを構成し、[OK] をクリックします。

      構成項目

      説明

      [効果]

      デフォルト値は [許可] です。

      [プリンシパル]

      [ID プロバイダー] を選択し、[編集] をクリックします。

      ID プロバイダーのタイプを [OIDC] に設定し、ack-rrsa-<cluster_id> などのクラスタの ID プロバイダーを選択します。<cluster_id> はクラスタの ID です。

      [操作]

      [sts:assumerole] がデフォルトで選択されています。

      [条件]

      • [oidc:iss]: この条件は、[ID プロバイダー] を選択すると自動的に追加されます。デフォルト値を保持します。

      • [oidc:aud]: この条件は、[ID プロバイダー] を選択すると自動的に追加されます。デフォルト値を保持します。

      • [oidc:sub]: 手動で [条件を追加] する必要があります。

        • [条件キー]: oidc:sub

        • [演算子]: StringEquals

        • [条件値]: フォーマットは system:serviceaccount:<namespace>:<serviceAccountName> です。

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

          • <serviceAccountName>: サービスアカウントの名前を指定します。

          この例では、system:serviceaccount:rrsa-demo:demo-sa と入力します。

      image

    5. 表示されるダイアログボックスに、ロール名 demo-role-for-rrsa を入力し、[OK] をクリックします。

  2. [aliyuncsreadonlyaccess] システムポリシーを作成したロールにアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。

    image

  3. アプリケーションをデプロイします。

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

      説明

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

      • <role_arn> を、アプリケーションで使用される RAM ロールの ARN に置き換えます。RAM コンソール[基本情報] タブで [ARN] を表示できます。

      • <oid_provider_arn> を、クラスターで使用される OIDC プロバイダーの ARN に置き換えます。[クラスター情報] ページの [基本情報] タブで、[RRSA OIDC] の右にある [有効] にポインターを移動できます。

      YAML テンプレートのサンプルを表示

      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: rrsa-demo
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: demo-sa
        namespace: rrsa-demo
      ---
      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  # 単位: 秒。有効な値: 600 (10 分) ~ 43200 (12 時間)。
                path: token
    2. 次のコマンドを実行して、アプリケーションをデプロイします。

      kubectl apply -f demo.yaml

      アプリケーションがデプロイされると、アプリケーションの プログラム は、OIDC トークン、RAM ロールの ARN、および OIDC ID プロバイダーの ARN を使用して、STS AssumeRoleWithOIDC API 操作を呼び出し、RAM ロールのテンポラリ STS トークンを取得できます。その後、そのトークンを使用してクラウドサービスの API を呼び出すことができます。詳細については、「AssumeRoleWithOIDC」をご参照ください。

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

    kubectl -n rrsa-demo logs demo

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

    20**/**/** 08:35:23 ======= [begin] list ACK clusters with RRSA =======
    clusters:
    cluster id: cf***, cluster name: foo*
    cluster id: c8***, cluster name: bar*
    cluster id: c4***, cluster name: foob*
    20**/**/** 08:35:24 ======= [end]   list ACK clusters with RRSA =======
  5. オプション: [aliyuncsreadonlyaccess] システムポリシーを RAM ロールからデタッチします。詳細については、「RAM ロールから権限を削除する」をご参照ください。

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

    kubectl -n rrsa-demo logs demo

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

    20**/**/** 10:09:33 ======= [begin] list ACK clusters with RRSA =======
    20**/**/** 10:09:33 SDKError:
       StatusCode: 403
       Code: StatusForbidden
       Message: code: 403, STSToken policy Forbidden for action cs:DescribeClusters request id: XXXX
       Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClusters","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"XXXX","AuthPrincipalType":"AssumedRoleUser","EncodedDiagnosticMessage":"XXXX","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClusters","requestId":"XXXX","status":403,"statusCode":403}

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

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

Statement 構成の例:

説明

Statement 構成の次のフィールドを変更します。

  • <oidc_issuer_url> を、クラスターで使用されている OIDC プロバイダーの URL に置き換えます。[基本情報] タブの [クラスター情報] ページで、[RRSA OIDC] の右にある [有効] にポインターを移動します。

  • <oidc_provider_arn> を、クラスターで使用されている OIDC プロバイダーの ARN に置き換えます。[基本情報] タブの [クラスター情報] ページで、[RRSA OIDC] の右側の [有効] にポインターを移動します。

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

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

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

関連ドキュメント