共有ノード認証情報の代わりに、有効期間の短い STS トークンを持つ専用の RAM ロールを各 Pod に割り当てます。
RRSA は、主に 2 つのセキュリティプロパティを提供します。
-
最小権限:RAM 権限を特定のサービスアカウントにスコープすることで、そのアカウントを使用する Pod のみがこれらのリソースにアクセスできるようになります。これにより、静的な AccessKey ペアが不要になります。
-
認証情報の分離:Pod は、同じノード上の他の Pod が使用する認証情報にアクセスできません。RRSA を使用しない場合、ノード上のすべての Pod は、基盤となる Elastic Compute Service (ECS) のインスタンスロールの権限を共有します。
RRSA の仕組み
RRSA を使用しない場合、ノード上のすべての Pod はインスタンスメタデータを介して ECS インスタンスロールの権限を共有するため、重大なセキュリティリスクが生じます。
RRSA は、RAM ロールを Kubernetes のサービスアカウントにバインドすることでこの問題を解決します。Pod が起動すると、そのサービスアカウントにスコープされた OpenID Connect (OIDC) トークンを受け取り、AssumeRoleWithOIDC API を呼び出して、クラウド API アクセス用のロールにスコープされた STS トークンを受け取ります。
認証フローは以下の通りです。
-
トークンインジェクション:Pod が起動すると、Container Service for Kubernetes (ACK) はサービスアカウントトークンのボリュームプロジェクションを使用して、Pod のサービスアカウントにスコープされた OIDC トークンファイルをマウントします。
-
ロールの引き受け:アプリケーションは、この OIDC トークンを使用して
AssumeRoleWithOIDCAPI を呼び出します。 -
STS 認証情報の受け取り:RAM は、クラスターの OIDC プロバイダーに対して OIDC トークンを検証し、ロールにスコープされた STS 認証情報を返します。
-
リソースへのアクセス:Pod は、有効期間の短い STS 認証情報を使用して、承認された Alibaba Cloud API にアクセスします。
OIDC トークンは有効期間が短いです。認証リクエストごとにファイルからトークンを読み取り、キャッシュしないでください。ACK は有効期限が切れる前にトークンを自動的に更新します。
RRSA が有効化されると、ACK は自動的に以下を実行します。
-
クラスター専用の OIDC 発行者を作成します。
-
クラスターのサービスアカウントトークンのボリュームプロジェクションを有効にします。
-
アカウントに、クラスターの OIDC 発行者とのシングルサインオン (SSO) 用に設定された、
ack-rrsa-<cluster_id>という名前の RAM ID プロバイダー (IdP) を作成します。
事前準備
RRSA を設定する前に、以下を確認してください。
-
クラスターバージョン:ACK クラスター (Basic、Pro、Serverless、または Edge) が Kubernetes 1.22 以降を実行していること。
-
権限:ACK コンソールおよび RAM コンソールへの管理者アクセス権限。
-
トークンの有効期間制限:RRSA が有効になると、新しく作成された ServiceAccount トークンの最大有効期間は 12 時間になります。
ステップ 1:クラスターで RRSA を有効化
RRSA は、クラスター作成時、またはクラスター実行後に有効化できます。ACK Serverless クラスターの場合は、クラスター作成後にクラスター詳細ページから RRSA を有効化します。
クラスター作成時に有効化
ACK マネージドクラスターまたは ACK Edge クラスターを作成する際、[クラスター設定] ステップに進み、[詳細オプション (任意)] を展開し、[RRSA OIDC] の横にある [有効化] をクリックします。

既存のクラスターで有効化
-
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
-
クラスターの名前をクリックします。左側のナビゲーションペインで、[クラスター情報] をクリックします。
-
[基本情報] タブで、[セキュリティと監査] セクションまでスクロールし、[RRSA OIDC] の横にある [有効化] をクリックします。

-
[RRSA の有効化] ダイアログボックスで、[確認] をクリックします。クラスターのステータスが [更新中] から [実行中] に変わるまで待ちます。これで RRSA が有効になりました。
OIDC プロバイダーの URL と ARN の取得
RRSA が有効になった後、[セキュリティと監査] セクションの [RRSA OIDC] の横にある [有効] ラベルにカーソルを合わせます。OIDC プロバイダーの URL と Alibaba Cloud リソースネーム (ARN) が表示されます。

RAM ロールとアプリケーションテンプレートを設定する際に使用するため、両方の値を記録しておきます。
ステップ 2:RRSA を使用するようにアプリケーションを設定
サンプルアプリケーションの設定は、2 つのパートで構成されます。
-
クラスターレベルの設定 (クラスターごとに 1 回):RRSA を有効にし、
ack-pod-identity-webhookをインストールします。 -
アプリケーションごとの設定 (アプリごとに繰り返し):既存の RAM ロールを作成または使用し、権限を付与して、アプリケーションをデプロイします。
サンプル設定
|
項目 |
値 |
|
Namespace |
|
|
サービスアカウント |
|
|
RAM ロール |
|

1. ack-pod-identity-webhook のインストール
ack-pod-identity-webhook は、OIDC トークンファイルのパスと RAM ロールの ARN を環境変数として Pod に自動的にインジェクトします。Pod テンプレートを手動で設定する場合は、このステップをスキップしてください。詳細については、「Pod テンプレートの手動設定」をご参照ください。
-
ACK コンソールで、クラスターの名前をクリックします。左側のナビゲーションペインで、[アドオン] をクリックします。
-
[アドオン] ページで、[セキュリティ] タブをクリックします。
-
[ack-pod-identity-webhook] を見つけて、[インストール] をクリックします。
-
情報を確認し、[OK] をクリックします。
2. OIDC ID プロバイダー用の RAM ロールの作成または設定
RAM ロールの作成
クラスターの OIDC ID プロバイダー (IdP) を信頼する demo-role-for-rrsa という名前の RAM ロールを作成します。詳細については、「OIDC ID プロバイダー用の RAM ロールを作成する」をご参照ください。
以下のパラメーター値を使用します。
|
パラメーター |
値 |
|
[ID プロバイダーのタイプ] |
[OIDC] を選択します。 |
|
[アイデンティティプロバイダー者] |
|
|
[条件] |
|
|
[ロール名] |
|
oidc:sub条件により、信頼の範囲が特定の名前空間にある特定のサービスアカウントに限定されます。rrsa-demoとdemo-saを、実際の名前空間とサービスアカウント名に置き換えてください。
既存の RAM ロールの設定
既存の RAM ロールを使用するには、サービスアカウントがそのロールを引き受けられるように信頼ポリシーを更新します。詳細については、「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>"
]
}
}
プレースホルダーを置き換えます。
|
プレースホルダー |
値 |
|
|
クラスターの OIDC プロバイダーの URL — 「OIDC プロバイダーの URL と ARN の取得」をご参照ください |
|
|
クラスターの OIDC プロバイダーの ARN — 「OIDC プロバイダーの URL と ARN の取得」をご参照ください |
|
|
アプリケーションの Namespace |
|
|
アプリケーションが使用するサービスアカウント |
信頼ポリシーの更新を自動化するには、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
3. RAM ロールへの権限付与
demo-role-for-rrsa に AliyunCSReadOnlyAccess ポリシーをアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。
これにより、アプリケーションに ACK クラスター情報への読み取り専用アクセス権が付与されます。
4. アプリケーションのデプロイ
次の内容で demo.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」をご参照ください。
---
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.3.0
args:
- rrsa
- demo
name: demo
restartPolicy: OnFailure
アプリケーションをデプロイします。
kubectl apply -f demo.yaml
5. インジェクトされた設定の検証
ack-pod-identity-webhook が必要な環境変数とボリュームマウントをインジェクトしたことを確認します。
kubectl -n rrsa-demo get pod demo -o yaml
期待される出力には、以下のインジェクトされた項目が含まれます。
|
カテゴリ |
項目 |
説明 |
|
環境変数 |
|
引き受ける RAM ロールの ARN |
|
|
OIDC ID プロバイダーの ARN |
|
|
|
OIDC トークンファイルのパス |
|
|
|
現在のリージョンの STS VPC エンドポイント |
|
|
|
STS エンドポイントのリージョン識別子 |
|
|
|
VPC 内部エンドポイント経由で STS にアクセスするかどうか |
|
|
VolumeMount |
|
OIDC トークンをコンテナにマウント |
|
Volume |
|
OIDC トークンの projected ボリュームソース |
正しくインジェクトされた Pod の spec は以下のようになります。
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
- name: ALIBABA_CLOUD_STS_ENDPOINT
value: sts-vpc.cn-hangzhou.aliyuncs.com
- name: ALIBABA_CLOUD_STS_REGION
value: cn-hangzhou
- name: ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED
value: "true"
image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.3.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
6. アプリケーションログの確認
アプリケーションログを出力します。
kubectl -n rrsa-demo logs demo
正常に実行されると、Alibaba Cloud アカウント内のクラスターが一覧表示されます。
cluster id: cf***, cluster name: foo*
cluster id: c8***, cluster name: bar*
cluster id: c4***, cluster name: foob*
オプション: 最小権限の適用を検証するには、RAM ロールから AliyunCSReadOnlyAccess ポリシーをデタッチします (「RAM ロールから権限を削除」をご参照ください)。 30 秒待機してから、ログコマンドを再度実行します。 アプリケーションは、次のような 403 エラーを返します:
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 が Pod レベルで権限を適用していることが確認できます。
高度な設定:Pod テンプレートの手動設定
ack-pod-identity-webhook をスキップするには、Pod spec に必要な環境変数と projected ボリュームを手動で追加します:
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.3.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
プレースホルダーの値を置き換えます。
|
プレースホルダー |
値 |
確認場所 |
|
|
RAM ロールの ARN |
RAM コンソールの Roles ページ |
|
|
OIDC プロバイダーの ARN |
クラスター詳細ページの セキュリティと監査 セクション。「OIDC プロバイダーの URL と ARN の取得」をご参照ください。 |
audience を sts.aliyuncs.com に設定します。これは OIDC プロバイダーのクライアント ID であり、SDK で使用される STS エンドポイントドメインではありません。
expirationSeconds を 600~43200 (秒) の範囲で設定します。43200 を超える値は、12 時間に制限されます。
再デプロイ後、アプリケーションは ALIBABA_CLOUD_OIDC_TOKEN_FILE から OIDC トークンを読み取り、AssumeRoleWithOIDC を介して STS トークンに交換し、その STS トークンでクラウド API を呼び出します。詳細については、「AssumeRoleWithOIDC」をご参照ください。
SDK サポート
Alibaba Cloud SDK V2.0 は、RRSA OIDC トークン認証をサポートしています。V2.0 上に構築され、STS トークンをサポートするクラウドサービスの SDK は、RRSA もサポートします。
サポートされている SDK バージョンとデモ
|
言語 |
最小バージョン |
デモ |
|
Go |
||
|
Java |
||
|
Python 3 |
||
|
Node.js / TypeScript |
各言語の認証情報に関するドキュメントをご参照ください — 方法 6:OIDC IdP の RAM ロールを使用する。
クラウドサービス固有の SDK デモ
一部のクラウドサービス SDK は、ネイティブの OIDC トークンサポートを提供しています。
|
クラウドサービス |
SDK |
デモ |
|
Object Storage Service (OSS) |
OSS Go SDK — 方法 5:OIDCRoleARN を使用する |
|
|
OSS |
OSS Java SDK — アクセス資格情報を設定する |
|
|
OSS |
OSS Python SDK — OIDC IdP のロールを使用する |
|
|
Simple Log Service (SLS) |
CLI の RRSA 認証を有効化
ack-ram-tool を使用して、Pod 内から RRSA OIDC トークン認証用に CLI を設定します。
Alibaba Cloud CLI
Alibaba Cloud CLI v3.0.206 以降は RRSA に対応しています。region_id を目的のリージョンに設定します。
オプション A: 設定ファイル。 ~/.aliyun/config.json で mode を OIDC に設定します:
{
"current": "rrsa",
"profiles": [
{
"name": "rrsa",
"mode": "OIDC",
"region_id": "cn-hangzhou",
"ram_session_name": "test-rrsa"
}
],
"meta_path": ""
}
オプション B:直接コマンド (設定ファイル不要):
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
ossutil V2.1.0 以降は RRSA に対応しています。region を実際のリージョンに置き換えてください。
~/.ossutilconfig で mode を oidcRoleArn に設定します:
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 ドキュメントの「例」をご参照ください。
Simple Log Service CLI
Simple Log Service CLI は OIDC 設定ファイルをサポートしていません。ack-ram-tool を使用して、実行時に認証情報をインジェクトします:
ack-ram-tool export-credentials -f environment-variables -- aliyunlog log list_project --region-endpoint=cn-hangzhou.log.aliyuncs.com
Terraform
Alibaba Cloud Provider V1.222.0 以降はassume_role_with_oidcをサポートします。regionにはターゲットリージョンを設定します。
プロバイダー設定に assume_role_with_oidc を追加します:
provider "alicloud" {
assume_role_with_oidc {
role_session_name = "terraform-with-rrsa-auth-example"
}
region = "cn-hangzhou"
}
詳細については、「Terraform RRSA デモ」をご参照ください。
トラブルシューティング
SDK エラー
|
エラー |
原因 |
修正方法 |
|
|
アプリケーションが OIDC トークンをキャッシュし、期限切れのコピーを使用しています。 |
認証するたびにファイル ( |
|
|
アプリケーションが |
STS トークンが期限切れになるまで再利用します。トークン管理を自動化するには、Alibaba Cloud SDK を使用してください。詳細については、「SDK サポート」をご参照ください。 |
|
|
Pod spec 内の |
pod spec の projected ボリュームソースに |
|
|
クラスターで RRSA が有効になっていません。 |
「ステップ 1:クラスターで RRSA を有効化」をご参照ください。有効にした後、RRSA を使用するすべての Pod を再作成してください。 |
|
|
アプリケーションが引き受けようとした RAM ロールが存在しません。 |
RAM ロールを作成します。詳細については、「OIDC IdP の RAM ロールを作成する」および「ステップ 2:OIDC ID プロバイダー用の RAM ロールの作成または設定」をご参照ください。 |
|
|
RAM ロールの信頼ポリシーが、サービスアカウントによる引き受けを許可していません。 |
信頼ポリシーを更新します。詳細については、「既存の RAM ロールの設定」をご参照ください。 |