サービスアカウントのRAMロール (RRSA) 機能を使用して、Container Service for Kubernetes (ACK) クラスターにデプロイされているさまざまなポッドにアクセス制御を適用できます。 これにより、ポッドのきめ細かいAPI権限制御が実現し、セキュリティリスクが軽減されます。 このトピックでは、ACKクラスターでRRSAを使用する方法について説明します。
目次
背景情報
Elasticコンテナインスタンスは、Elastic Compute Service (ECS) インスタンスで実行されます。 ECSインスタンスのメタデータには、Alibaba Cloud上のECSインスタンスに関する情報が含まれます。 実行中のECSインスタンスにログインしてそのメタデータを表示し、そのメタデータに基づいてECSインスタンスを設定または管理できます。 ACKクラスターにデプロイされたアプリケーションは、ECSインスタンスメタデータを使用して、異なるRAM (Resource Access Management) ロールを引き受けるために使用されるSTS (Security Token Service) トークンを取得できます。 このようにして、アプリケーションは異なるクラウドサービスのAPIを呼び出すことができます。 詳細については、「インスタンスメタデータの取得」をご参照ください。
クラスター内のさまざまなアプリケーションのRAM権限を制御する場合、これらのアプリケーションがECSインスタンスまたはエラスティックコンテナインスタンスのメタデータを使用して、インスタンスに割り当てられたRAMロールを引き受けるために使用されるSTSトークンを取得することを禁止できます。 ECSインスタンスまたはエラスティックコンテナインスタンスに割り当てられているRAMロールに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機能は、Kubernetes 1.22を実行するACKクラスターのみをサポートします。 RRSA機能をサポートするACKクラスターには、ACK Basicクラスター、ACK Proクラスター、ACK Serverless Basicクラスター、ACK Serverless Proクラスター、ACK Edge Proクラスターがあります。
RRSAの有効化
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。
[基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックします。
では、RRSAの有効化ダイアログボックスで、確認.
[基本情報] セクションで、クラスターのステータスが [更新中] から [実行中] に変わった場合、クラスターのRRSA機能が有効になり、OIDCプロバイダーのURLとAlibaba Cloud Resource Name (ARN) がRRSA OIDCの横に表示されます。
RRSAを有効にすると、ACKはバックグラウンドで次の操作を実行します。
クラスター専用のOIDC発行者を自動的に作成します。 OIDC発行者は、ACKによって管理される。 詳細については、「OIDC発行者」をご参照ください。
クラスターのサービスアカウントトークンボリューム予測を有効にし、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コンポーネントをインストールします。
[クラスター] ページで、クラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作]> [アドオン] を選択します。
On theアドオンページをクリックし、セキュリティタブで、ack-pod-identity-webhookを見つけ、インストールカードの右下にあります。
表示されるメッセージで、情報を確認し、OK.
demo-role-for-rrsaという名前のRAMロールを作成します。
にログインします。RAMコンソールをAlibaba Cloudアカウントに置き換えます。
左側のナビゲーションウィンドウで、 を選択します。 [ロール] ページで、[ロールの作成] をクリックします。
では、ロールの作成パネル、選択IdP[信頼できるエンティティ] を選択し、次へ.
On theロールの設定ウィザードページで、次のパラメーターを設定し、OK.
下表に、各パラメーターを説明します。
パラメーター
説明
RAMロール名
値をdemo-role-for-rrsaに設定します。
注
RAMロールの説明を入力します。 このパラメーターはオプションです。
IdPタイプ
[OIDC] を選択します。
IdPの選択
IdPを選択します。 IdPは、ack-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で作成した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トークンをマウントするための設定。
ボリューム
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: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}
アプリケーションテンプレートを手動で変更してRRSAを有効にする
アプリケーションテンプレートで、必要なOIDCトークンファイルを環境変数として手動で指定できます。 これにより、ack-pod-identity-webhookをインストールせずにRRSAを有効にできます。
次のテンプレートに例を示します。
上記のテンプレートの次のフィールドを変更します。
<oid_provider_arn>
を、クラスターが使用するOIDCプロバイダーのARNに置き換えます。 ARNは、ACKコンソールのクラスター詳細ページの [基本情報] タブで取得できます。<role_arn>
を、アプリケーションが使用するRAMロールのARNに置き換えます。 ARNは、RAMコンソールの [ロール] ページで取得できます。audience
パラメーターをsts.aliyuncs.com
に設定します。 この値は、RRSA機能が有効になったときに自動的に作成されるOIDC IdPで設定されたクライアントのIDです。 値は、STSのAssumeRoleWithOIDC操作を呼び出すためにSDKによって使用されるドメイン名ではありません。 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
設定の次のフィールドを変更します。
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
RRSAの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 IdPのRAMロールの使用」をご参照ください。 | |
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 | TypeScript/Node.jsのAlibaba Cloud資格情報2.2.6以降。 詳細については、「方法7: OIDC IdPのRAMロールの使用」をご参照ください。 |
一部のクラウドサービスSDKでは、上記の方法を参照して、API操作を呼び出すときにRRSAのOIDCトークンを認証に使用できます。 次の表に、SDKデモについて説明します。
クラウド製品 | SDK | デモ |
Object Storage Service (OSS) | 詳細については、「方法5: OIDCRoleARNの使用」をご参照ください。 | |
詳細については、「アクセス資格情報の設定」をご参照ください。 | ||
詳細については、「方法6: OIDCRoleARNの使用」をご参照ください。 | ||
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機能を使用するポッドを再作成する必要があります。 |
| アプリケーションが引き受けるRAMロールが存在しません。 | 必要なRAMロールを作成する必要があります。 詳細については、「OIDC IdPのRAMロールの作成」および「例」をご参照ください。 |
| アプリケーションが引き受けるRAMロールに対して、必要な信頼ポリシーが構成されていません。 | アプリケーションがRAMロールを引き受けることを許可するには、RAMロールの信頼ポリシーを変更する必要があります。 詳細については、「既存のRAMロールを使用し、RAMロールに必要な権限を付与する」をご参照ください。 |
RRSAのOIDCトークン認証をサポートする一般的に使用されるCLIの有効化
ack-ram-toolを使用して、一般的に使用されるCLIを有効にし、ポッドでRRSAのOIDCトークン認証をサポートできます。 次の表に、設定と例を示します。
CLI | 設定方法 | 例 |
RRSAのOIDCトークン認証をサポートするには、 説明
|
| |
設定ファイルを作成せずに、Alibaba Cloud CLIで関連するコマンドを直接実行することもできます。 説明 Alibaba Cloud CLI v3.0.206以降のみがこの機能をサポートしています。 |
| |
Simple Log Service CLIの設定ファイルを変更して、RRSAのOIDCトークン認証をサポートすることはできません。 Simple Log Service CLIで |
| |
RRSAのoidcトークン認証をサポートするように、設定ファイルで 説明
|