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

Container Compute Service:RRSA を使用した Pod レベルの権限設定

最終更新日:Jun 22, 2026

RAM Roles for Service Accounts (RRSA) を使用すると、クラスター内で Pod レベルの OpenAPI 権限隔離を実装できます。これにより、クラウドリソースへのアクセスをきめ細かく制御し、セキュリティリスクを低減できます。このトピックでは、RRSA 機能の使用方法について説明します。

背景情報

OIDC (OpenID Connect) は、OAuth 2.0 上に構築された認証プロトコルです。Alibaba Cloud RAM は、OIDC ベースのロール SSO をサポートしています。Kubernetes クラスター内のアプリケーションは、Security Token Service (STS) からの一時的な認証情報を使用してクラウドリソース API にアクセスします。Container Service for Kubernetes (ACK) は RRSA をサポートしています。マルチテナントシナリオでは、RRSA はクラスター内のアプリケーション Pod 間でクラウドリソースへのアクセスに対して、きめ細かな権限隔離を提供します。ACK では、RRSA を使用して一時的な認証情報の有効期間を制御することもできます。

RRSA は次のように機能します:

  1. サービスアカウントトークンのボリュームプロジェクション機能を使用するアプリケーション Pod をデプロイします。

    説明

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

  2. クラスターは、アプリケーション Pod に対応するサービスアカウントの OIDC トークンファイルを作成し、マウントします。

  3. Pod 内のアプリケーションは、マウントされた OIDC トークンファイルを使用して STS の AssumeRoleWithOIDC API を呼び出し、指定された RAM ロールの一時的な認証情報を取得します。

    説明

    Pod のサービスアカウントが RAM ロールを偽装できるように、RAM ロールの信頼ポリシーを事前に変更する必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。

  4. Pod 内のアプリケーションは、取得した一時的な認証情報を使用してクラウドリソース API にアクセスします。

RRSA の有効化

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

  2. クラスターリスト ページで、対象のクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、Cluster Information を選択します。

  3. クラスターの詳細ページで、Basic Information タブをクリックします。[セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックします。

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

    説明
    • RRSA 機能の有効化には約 2〜3 分かかります。クラスターステータス更新中 のままである場合は、ページの右上隅にある image 更新ボタンをクリックしてリフレッシュしてください。

    • クラスターの状態が 更新中 から 実行中 に変わると、クラスターで RRSA 機能が有効になります。[RRSA OIDC] の横にある 有効 にカーソルを合わせると、OIDC プロバイダーの URL と ARN を表示できます。

クラスターで RRSA 機能を有効にすると、ACS コンソールはバックグラウンドで次の操作を実行します:

  • クラスター専用の OIDC Issuer サービスを自動的に作成します。このサービスは ACS によって管理され、手動でのメンテナンスは不要です。

  • この OIDC Issuer を使用する OIDC ID プロバイダーをアカウントに作成します。OIDC ID プロバイダーの名前は ack-rrsa-<cluster_id> です。ここで、<cluster_id> はご利用のクラスター ID です。

RRSA の使用

RRSA 機能を有効にした後、次の手順に従って、クラスター内のアプリケーションが RRSA を使用して一時的な認証情報を取得し、クラウドリソース API にアクセスできるようにします。

新しい RAM ロールの作成と承認

説明

新しい RAM ロールを作成する代わりに既存の RAM ロールを使用するには、既存の RAM ロールに必要な権限を追加できます。

この例でデプロイされるアプリケーションは、RRSA 機能を使用して指定されたロールを偽装し、現在のアカウント内のクラスターのリストを取得します。使用される主なリソースは次のとおりです:

  • 名前空間:rrsa-demo

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

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

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

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

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

    3. ロール作成 パネルで、Switch to Policy Editor をクリックしてロールを作成します。

    4. 視覚化 タブで、次の表に従ってロール情報を設定し、はい をクリックします。

      パラメーター

      説明

      効果

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

      Principal

      [ID プロバイダー] を選択し、エディット をクリックします。

      [ID プロバイダータイプ] を [OIDC] に設定し、クラスターの OIDC ID プロバイダー (例:ack-rrsa-<cluster_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 と入力します。

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

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

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

    1. demo.yaml という名前のファイルを以下の内容で作成します。

      説明

      サンプルアプリケーションテンプレート内の次のプレースホルダーを置き換えてください。

      • <role_arn>:これをアプリケーションが使用する RAM ロールの ARN に置き換えます。ARN は、RAM コンソールのロールの 基本情報 ページにある [ARN] フィールドから取得できます。

      • <oidc_provider_arn>:これをクラスターの OIDC プロバイダーの ARN に置き換えます。この ARN は、クラスター情報 ページの 基本情報 タブにある [RRSA OIDC] の横の 有効 にカーソルを合わせることで取得できます。

      サンプルコードを展開して表示

      ---
      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: <oidc_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, 43200]、つまり 10 分から 12 時間。
                path: token
    2. 次のコマンドを実行して、テストアプリケーションをデプロイします。

      kubectl apply -f demo.yaml

      アプリケーションがデプロイされると、アプリケーションはマウントされた OIDC トークン、RAM ロールの ARN、および OIDC ID プロバイダーの ARN を使用して、STS の AssumeRoleWithOIDC API を呼び出し、指定された RAM ロールの一時的な認証情報を取得できます。その後、アプリケーションはこの一時的な認証情報を使用してクラウドリソース API にアクセスします。詳細については、「AssumeRoleWithOIDC」をご参照ください。

  4. 次のコマンドを実行して、テストアプリケーションのログを表示します。

    kubectl -n rrsa-demo logs demo

    期待される出力は、ACK クラスターのリストです:

    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 ロールから権限を削除する」をご参照ください。

    約 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 ロールの信頼ポリシーを変更する」をご参照ください。

以下のコードは、RAM ロールの信頼ポリシーに追加する Statement エントリの例です。

説明

サンプル Statement エントリ内の次のプレースホルダーを置き換えてください。

  • <oidc_issuer_url>:これをクラスターの OIDC プロバイダーの URL に置き換えます。URL は、クラスター情報 ページの 基本情報 タブにある [RRSA OIDC] の横の 有効 にカーソルを合わせることで取得できます。

  • <oidc_provider_arn>:これをクラスターの OIDC プロバイダーの ARN に置き換えます。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>"
    ]
  }
}

参考