RAM Roles for Service Accounts(RRSA)機能を使用して、Container Service for Kubernetes(ACK)クラスタにデプロイされている異なるポッドに対してアクセス制御を実施できます。 これにより、ポッドに対するきめ細かいAPI権限制御を実現し、セキュリティリスクを軽減します。 このトピックでは、ACKクラスタでRRSAを使用する方法について説明します。
背景情報
Elastic Container InstanceはElastic Compute Service(ECS)インスタンス上で実行されます。 ECSインスタンスメタデータには、Alibaba Cloud内のECSインスタンスに関する情報が含まれています。 実行中のインスタンス内からこのメタデータにアクセスして、インスタンスを構成または管理できます。 ACKクラスタにデプロイされたアプリケーションは、ECSインスタンスメタデータを使用して、さまざまなResource Access Management(RAM)ロールをアシュームするために使用されるセキュリティトークンサービス(STS)トークンを取得できます。 これにより、アプリケーションはさまざまなクラウドサービスのAPIを呼び出すことができます。 詳細については、「インスタンスメタデータ」をご参照ください。
セキュリティ上の理由から、クラスタ内のさまざまなアプリケーションのRAM権限を制限する必要がある場合は、ECSまたはElastic Container Instanceメタデータを通じてインスタンスロールに関連付けられたSTSトークンを取得する機能を無効にするか、インスタンスに関連付けられたロールにRAMポリシーを割り当てないようにする必要があります。 ただし、これらのアプリケーションは、クラウド リソースにアクセスするためにSTSトークンを取得するための安全な方法を引き続き必要とします。 これらの問題に対処するために、ACKはRAMに基づいて開発されたRRSA機能をリリースします。
RRSA機能を使用すると、ACKクラスタ内のさまざまなアプリケーションがさまざまなRAMロールをアシュームできます。 アプリケーションはSTSトークンを取得し、そのトークンを使用して特定のRAMロールをアシュームし、関連するクラウドサービスにアクセスできます。 これにより、最小権限の原則が適用され、アプリケーションはAccessKeyペアを使用せずにAPI操作を呼び出すことができるため、AccessKeyペアの漏洩を防ぎます。
RRSAを使用してアクセス制御を実施する場合、アプリケーションがクラウド リソースにアクセスする方法は次のとおりです。
テナントは、サービスアカウントトークンボリュームプロジェクションの機能が有効になっているポッドをデプロイします。
ACKクラスタは、サービスアカウントOpenID Connect(OIDC)トークンファイルを作成し、そのトークンファイルをポッドにマウントします。
ポッド内のアプリケーションは、OIDCトークンファイルを使用してSTSのAssumeRoleWithOIDC API操作を呼び出し、RAMロールをアシュームするために使用されるSTSトークンを取得します。
説明アプリケーションがこれらの操作を実行できるようにするには、まずOIDC IDプロバイダーを作成し、ポッドで使用されるサービスアカウントが指定されたRAMロールをアシュームできるようにする必要があります。 詳細については、「AssumeRoleWithOIDC」をご参照ください。
OIDCトークンファイル内のOIDCトークンは一時的なトークンです。 アプリケーションがOIDCトークンファイルから最新のトークンを読み取るように構成することをお勧めします。 クラスタは、トークンの有効期限が切れる前に、OIDCトークンファイル内のトークンを更新します。
ポッド内のアプリケーションは、STSトークンを使用して指定されたRAMロールをアシュームし、関連するクラウドサービスのAPIを呼び出します。
RRSAを使用してアクセス制御を実施する場合、アプリケーションがクラウド リソースにアクセスする方法は次のとおりです。
テナントは、サービスアカウントトークンボリュームプロジェクションの機能が有効になっているポッドをデプロイします。
ACKクラスタは、サービスアカウント OpenID Connect(OIDC)トークンファイルを作成し、そのトークンファイルをポッドにマウントします。
ポッド内のアプリケーションは、OIDCトークンファイルを使用してSTSのAssumeRoleWithOIDC API操作を呼び出し、RAMロールをアシュームするために使用されるSTSトークンを取得します。
説明アプリケーションがこれらの操作を実行できるようにするには、まずOIDC IDプロバイダーを作成し、ポッドで使用されるサービスアカウントが指定されたRAMロールをアシュームできるようにする必要があります。 詳細については、「AssumeRoleWithOIDC」をご参照ください。
OIDCトークンファイル内のOIDCトークンは一時的なトークンです。 アプリケーションがOIDCトークンファイルから最新のトークンを読み取るように構成することをお勧めします。 クラスタは、トークンの有効期限が切れる前に、OIDCトークンファイル内のトークンを更新します。
ポッド内のアプリケーションは、STSトークンを使用して指定されたRAMロールをアシュームし、関連するクラウドサービスのAPIを呼び出します。
制限
RRSA機能は、Kubernetes 1.22以降を実行するACKクラスタのみをサポートしています。 RRSA機能をサポートするACKクラスタには、ACK ベーシッククラスタ、ACK Pro マネージドクラスター、ACK Serverless ベーシッククラスタ、ACK Serverless Pro クラスタ、および ACK Edge Pro クラスタが含まれます。
RRSAを有効にする
既存のクラスタがない場合は、ACK マネージドクラスターまたは ACK Edge クラスタを作成するときにRRSAを有効にします。 それ以外の場合は、クラスタ詳細ページの [セキュリティと監査] セクションで有効にします。
サーバーレス Kubernetes クラスターの場合、この機能は、クラスタ詳細ページの [セキュリティと監査] セクションから作成後に有効にする必要があります。
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 を参照してください。
クラスタのサービスアカウントトークンボリュームプロジェクションを有効にし、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ロールを使用し、必要な権限を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が必要な構成をアプリケーション用に作成されたポッドに挿入したかどうかを確認します。
kubectl -n rrsa-demo get pod demo -o yaml出力は、ack-pod-identity-webhookが次の構成をポッドに挿入したことを示しています。
カテゴリ
構成項目
説明
環境変数
ALIBABA_CLOUD_ROLE_ARN
アシュームされるRAMロールのARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN
OIDC IdPのARN。
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*オプション: AliyunCSReadOnlyAccessシステムポリシーをRAMロールからデタッチします。 詳細については、「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ロールの信頼ポリシーを変更する必要があります。 これにより、アプリケーションはサービスアカウントを使用して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:OIDC RoleArn を使用する」をご参照ください。 | |
Java | Alibaba Cloud Credentials for Java 0.2.10 以降。詳細については、「方法 6: OIDC IdP の RAM ロールを使用する」をご参照ください。 | |
Python 3 | Alibaba Cloud Credentials for Python 0.3.1 以降。詳細については、「方法 6: OIDC IdP の RAM ロールを使用する」をご参照ください。 | |
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 の使用を開始する」をご参照ください。 |
SDKエラーの解決策
次の表に、さまざまなエラーの解決策を示します。
エラーメッセージ | 考えられる原因 | 解決策 |
| アプリケーションで使用されているOIDCトークンの有効期限が切れています。 | OIDC トークンファイルは、 |
| アプリケーションがOIDCトークンを頻繁に取得しています。 その結果、操作がスロットルされます。 | OIDC トークンを取得するために、API 操作を頻繁に呼び出さないでください。現在の OIDC トークンの有効期限が切れる前に、新しい OIDC トークンを取得する必要はありません。アプリケーションを手動で設定してトークンを取得するのではなく、Alibaba Cloud SDK を使用して OIDC トークンを取得することをお勧めします。詳細については、「RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ」をご参照ください。 |
| アプリケーションテンプレートの |
|
| クラスタのRRSA機能が無効になっています。 | アプリケーションが存在するクラスターで RRSA 機能を有効にする必要があります。詳細については、「RRSA 機能を有効にする」をご参照ください。RRSA 機能を有効にした後、RRSA 機能を使用するポッドを再作成する必要があります。 |
| アプリケーションがアシュームするRAMロールが存在しません。 | 必要な RAM ロールを作成する必要があります。詳細については、「OIDC IdP 用の RAM ロールを作成する」および「例」をご参照ください。 |
| アプリケーションがアシュームするRAMロールに必要な信頼ポリシーが構成されていません。 | アプリケーションが RAM ロールを偽装できるように、RAM ロールの信頼ポリシーを変更する必要があります。 詳細については、「既存の RAM ロールを使用し、RAM ロールに必要な権限を付与する」をご参照ください。 |
一般的に使用されるCLIがRRSAのOIDCトークン認証をサポートできるようにする
ack-ram-tool を使用すると、一般的に使用されるCLI(Alibaba Cloud CLI、ossutil 2.0、Terraformなど)がポッド内のRRSAのOIDCトークン認証をサポートできるようにすることができます。 次の表に、構成と例を示します。
参考資料
\