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

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

最終更新日:Dec 27, 2024

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

背景情報

Kubernetes クラスターにデプロイされたアプリケーションは、アプリケーションポッドが担う RAM ロールに対して生成された Security Token Service (STS) トークンを使用して、クラウドサービスの API オペレーションを呼び出すことができます。Alibaba Cloud Container Compute Service (ACS) は RRSA 機能をサポートしています。マルチテナントシナリオでは、RRSA 機能を使用して、異なるポッドに異なるクラウドサービスへのアクセスを承認できます。ACS クラスターで RRSA 機能を使用して、STS トークンの有効期間を制御できます。

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. クラスター ページで、管理するクラスターを見つけ、その ID をクリックするか、クラスターの アクション 列の 詳細 をクリックします。

  3. クラスターの詳細ページで、基本情報 タブをクリックします。クラスター情報 セクションで、RRSA OIDCRRSA を有効にする をクリックします。

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

    基本情報 セクションで、クラスターの状態が 更新中 から 実行中 に変わると、クラスターの RRSA 機能が有効になり、OIDC プロバイダーの URL と Alibaba Cloud Resource Name (ARN) が RRSA OIDC の横に表示されます。

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

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

  • アカウント内に OIDC プロバイダーが作成されます。OIDC プロバイダーは OIDC 発行者を使用します。OIDC プロバイダーの名前は acs-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

手順

説明

既存の RAM ロールを使用する場合は、必要な権限を RAM ロールに付与する必要があります。詳細については、既存の RAM ロールを使用し、必要な権限を RAM ロールに付与する を参照してください。

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

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

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

    3. ロールの作成 パネルで、信頼できるエンティティの選択で IdP を選択し、次へ をクリックします。

    4. ロールの設定 ウィザードページで、次のパラメーターを設定し、OK をクリックします。

      次の表に、この例で設定されているパラメーターを示します。

      パラメーター

      説明

      RAM ロールの名前

      RAM ロールの名前。この例では、demo-role-for-rrsa が使用されています。

      注記

      オプション。RAM ロールの説明。

      Idp タイプ

      ID プロバイダー (IdP) のタイプ。OIDC を選択します。

      Idp の選択

      acs-rrsa-<cluster_id>。<cluster_id> はクラスターの ID を示します。

      条件

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

      • oidc:aud: sts.aliyuncs.com を選択します。

      • oidc:sub: 条件演算子を StringEquals に設定し、system:serviceaccount:<namespace>:<serviceAccountName> 形式で値を入力します。

        • <namespace>: アプリケーションの名前空間。

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

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

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

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

    1. demo.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
                path: token
      重要

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

      • <oid_provider_arn> を、クラスターで使用される OIDC プロバイダーの ARN に置き換えます。ARN は、ACS コンソールクラスター情報 ページの 基本情報 タブで取得できます。

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

      • audience パラメーターの値は、sts.aliyuncs.com に設定する必要があります。

      • 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 環境変数で指定されます。アプリケーションで使用される RRSA SDK デモの詳細については、RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK を参照してください。詳細については、AssumeRoleWithOIDC を参照してください。

    2. 次のコマンドを実行して、アプリケーションをデプロイします。

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

    kubectl -n rrsa-demo logs demo

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

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

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

    kubectl -n rrsa-demo logs demo

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

       StatusCode: 403
       Code: StatusForbidden
       Message: code: 403, STSToken policy Forbidden for action cs:DescribeClusters request id: E78A2E2D-***
       Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClusters","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:DescribeClusters","requestId":"E78A2E2D-***","status":403,"statusCode":403}

既存の 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 は、ACS コンソールクラスター情報 ページの 基本情報 タブで取得できます。

  • <oidc_provider_arn> を、クラスターで使用される OIDC プロバイダーの ARN に置き換えます。ARN は、ACS コンソールクラスター情報 ページの 基本情報 タブで取得できます。

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

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

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

一部の Alibaba Cloud SDK では、アプリケーションが RRSA の OIDC トークンを使用して特定のクラウドサービスの API を呼び出すことができます。次の表に、サポートされている SDK のバージョンとデモを示します。

プログラミング言語

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

デモ

Go

Alibaba Cloud Credentials for Go 1.2.6 以降

Go 用 SDK デモ

Java

Alibaba Cloud Credentials for Java 0.2.10 以降

Java 用 SDK デモ

Python 3

Alibaba Cloud Credentials for Python 0.3.1 以降

Python 3 用 SDK デモ

Node.js および TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 以降

Node.js および TypeScript 用 SDK デモ

参考文献