サービスアカウントの 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 を呼び出すことができます。詳細については、「インスタンスメタデータ」をご参照ください。
セキュリティ上の理由から、クラスター内の異なるアプリケーションに対して RAM 権限を制限する必要がある場合、ECS または Elastic Container Instance のメタデータを介してインスタンスロールに関連付けられた STS トークンを取得する機能を無効にするか、インスタンスに関連付けられたロールに RAM ポリシーを割り当てないようにする必要があります。しかし、これらのアプリケーションは依然として、クラウドリソースにアクセスするための STS トークンを安全に取得する方法を必要とします。これらの問題に対処するため、ACK は RAM に基づいて開発された RRSA 機能をリリースしました。
RRSA 機能を使用すると、ACK クラスター内の異なるアプリケーションが異なる RAM ロールを引き受けることを許可できます。アプリケーションは STS トークンを取得し、そのトークンを使用して特定の RAM ロールを引き受け、関連するクラウドサービスにアクセスできます。これにより、最小権限の原則が徹底され、アプリケーションは AccessKey ペアを使用せずに API 操作を呼び出すことができるため、AccessKey ペアの漏洩を防ぐことができます。
サービスアカウントの RAM ロール (RRSA) を使用してアクセスの制御を実施する場合、アプリケーションは以下の手順でクラウドリソースにアクセスします。
テナントは、サービスアカウントトークンのボリュームプロジェクション機能が有効になっている Pod をデプロイします。
Container Service for Kubernetes (ACK) クラスターは、サービスアカウントの OpenID Connect (OIDC) トークンファイルを作成し、そのトークンファイルを Pod にマウントします。
Pod 内のアプリケーションは、OIDC トークンファイルを使用して Security Token Service (STS) の AssumeRoleWithOIDC API 操作を呼び出し、RAM ロールを偽装するための STS トークンを取得します。
説明アプリケーションがこれらの操作を実行できるようにするには、まず OIDC ID プロバイダーを作成し、Pod で使用されるサービスアカウントが指定された RAM ロールを偽装することを許可する必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。
OIDC トークンファイル内の OIDC トークンは一時的なトークンです。アプリケーションが OIDC トークンファイルから最新のトークンを読み取るように設定することを推奨します。クラスターは、トークンの有効期限が切れる前に OIDC トークンファイル内のトークンを更新します。
Pod 内のアプリケーションは、STS トークンを使用して指定された RAM ロールを偽装し、関連するクラウドサービスの API を呼び出します。
RRSA を使用してアクセス制御を強制する場合、アプリケーションがクラウドリソースにアクセスする手順は次のとおりです。
テナントは、ServiceAccount トークンボリュームプロジェクション機能が有効になっている Pod をデプロイします。
ACK クラスターは、サービスアカウントの OpenID Connect (OIDC) トークンファイルを作成し、そのトークンファイルを Pod にマウントします。
Pod 内のアプリケーションは、OIDC トークンファイルを使用して STS の AssumeRoleWithOIDC API 操作を呼び出し、RAM ロールを引き受けるために使用される STS トークンを取得します。
説明アプリケーションがこれらの操作を実行できるようにするには、まず OIDC ID プロバイダーを作成し、Pod で使用されるサービスアカウントが指定された RAM ロールを偽装できるようにする必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。
OIDC トークンファイル内の OIDC トークンは一時的なトークンです。アプリケーションが OIDC トークンファイルから最新のトークンを読み取るように設定することを推奨します。クラスターは、トークンの有効期限が切れる前に OIDC トークンファイル内のトークンを更新します。
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 の横にある 有効化 をクリックします。

クラスター作成後の有効化
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。
基本情報 タブの セキュリティと監査 セクションで、RRSA OIDC の横にある 有効化 をクリックします。

RRSA の有効化 ダイアログボックスで、確認 をクリックします。
基本情報 セクションで、クラスターのステータスが 更新中 から 実行中 に変わると、クラスターの RRSA 機能が有効になります。
URL と ARN 情報の取得
クラスターで RRSA 機能を有効にした後、基本情報 タブの セキュリティと監査 セクションに移動します。RRSA OIDC の横にある 有効 ラベルにマウスを合わせると、OIDC プロバイダーの URL と Alibaba Cloud リソース名 (ARN) が表示されます。
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
手順

ack-pod-identity-webhook コンポーネントをインストールせずに RRSA を有効にしたい場合は、アプリケーションテンプレートで必要な OIDC トークンファイルを手動で環境変数として指定できます。詳細については、「アプリケーションテンプレートを手動で変更して RRSA を有効にする」をご参照ください。
既存の RAM ロールを使用したい場合は、その RAM ロールに必要な権限を付与する必要があります。詳細については、「既存の RAM ロールを使用し、必要な権限を付与する」をご参照ください。
ack-pod-identity-webhook コンポーネントをインストールします。
クラスター ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、操作 > アドオン を選択します。
アドオン ページで、セキュリティ タブをクリックし、ack-pod-identity-webhook を見つけて、カードの右下部分にある インストール をクリックします。
表示されるメッセージで情報を確認し、OK をクリックします。
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 に設定します。
ステップ 2 で作成した RAM ロールに AliyunCSReadOnlyAccess ポリシーをアタッチして、アプリケーションに必要な権限を付与します。詳細については、「RAM ロールに権限を付与する」をご参照ください。
アプリケーションをデプロイします。SDK デモの詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。
次の要件に基づいて 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」をご参照ください。次のコマンドを実行してアプリケーションをデプロイします。
kubectl apply -f demo.yaml
次のコマンドを実行して、ack-pod-identity-webhook がアプリケーション用に作成された Pod に必要な設定をインジェクトしたかどうかを確認します。
kubectl -n rrsa-demo get pod demo -o yamlこの出力は、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 トークンをマウントするための設定。
次のコマンドを実行して、アプリケーションのログを出力します。
kubectl -n rrsa-demo logs demo出力にクラスターのリストが表示されます:
cluster id: cf***, cluster name: foo* cluster id: c8***, cluster name: bar* cluster id: c4***, cluster name: foob*(任意) 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 を有効にできます。
次のテンプレートに例を示します。
上記のテンプレートで次のフィールドを変更します。
<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-existRRSA の 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 の使用」をご参照ください。 | |
Java | Alibaba Cloud Credentials for Java 0.2.10 以降。詳細については、「方法 6:OIDCRoleArn」をご参照ください。 | |
Python 3 | Alibaba Cloud Credentials for Python 0.3.1 以降。詳細については、「方法 6:OIDCRoleArn」をご参照ください。 | |
Node.js と TypeScript | Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6 以降。詳細については、「方法 6:OIDC IdP の RAM ロールを使用する」をご参照ください。 |
一部のクラウドサービス SDK では、API 操作を呼び出す際に、上記の方法を参照して RRSA の OIDC トークンを認証に使用できます。次の表に SDK のデモを示します。
クラウドプロダクト | SDK | デモ |
Object Storage Service (OSS) | 詳細については、「方法 5:OIDCRoleARN の使用」をご参照ください。 | |
詳細については、「アクセス認証情報の設定」をご参照ください。 | ||
詳細については、「OIDC IdP のロールを使用する」をご参照ください。 | ||
Simple Log Service | Simple Log Service SDK for Java 詳細については、「Simple Log Service SDK for Java の概要」をご参照ください。 |
SDK エラーの解決策
次の表に、さまざまなエラーの解決策を示します。
エラーメッセージ | 考えられる原因 | 解決策 |
| アプリケーションが使用している OIDC トークンの有効期限が切れています。 | OIDC トークンファイルは |
| アプリケーションが頻繁に OIDC トークンを取得しているため、操作がスロットリングされています。 | OIDC トークンを取得する API 操作を頻繁に呼び出さないでください。現在の OIDC トークンの有効期限が切れる前に新しい OIDC トークンを取得する必要はありません。アプリケーションを手動で設定してトークンを取得するのではなく、Alibaba Cloud SDK を使用して OIDC トークンを取得することを推奨します。詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。 |
| アプリケーションテンプレートの |
|
| クラスターで RRSA 機能が無効になっています。 | アプリケーションが存在するクラスターで RRSA 機能を有効にする必要があります。詳細については、「RRSA 機能の有効化」をご参照ください。RRSA 機能を有効にした後、RRSA 機能を使用する Pod を再作成する必要があります。 |
| アプリケーションが引き受ける RAM ロールが存在しません。 | 必要な RAM ロールを作成する必要があります。詳細については、「OIDC IdP の RAM ロールを作成する」および「例」をご参照ください。 |
| アプリケーションが引き受ける RAM ロールに必要な信頼ポリシーが設定されていません。 | アプリケーションが RAM ロールを引き受けられるように、RAM ロールの信頼ポリシーを変更する必要があります。詳細については、「既存の RAM ロールを使用し、必要な権限を付与する」をご参照ください。 |
一般的に使用される CLI で RRSA の OIDC トークン認証をサポートする
ack-ram-tool を使用して、Pod 内で一般的に使用される CLI (Alibaba Cloud CLI、ossutil 2.0、Terraform など) で RRSA の OIDC トークン認証をサポートできます。次の表に、設定と例を示します。
関連ドキュメント
\