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 を使用してアクセス制御を実施する場合、アプリケーションがクラウド リソースにアクセスする手順を以下に示します。
テナントは、サービスアカウントトークンボリュームプロジェクション機能が有効になっているポッドをデプロイします。
説明ACS クラスターでは、サービスアカウントトークンボリュームプロジェクション機能がデフォルトで有効になっています。
ACS クラスターは、サービスアカウント OpenID Connect (OIDC) トークンファイルを作成し、そのトークンファイルをポッドにマウントします。
ポッド内のアプリケーションは、OIDC トークンファイルを使用して STS の AssumeRoleWithOIDC API オペレーションを呼び出し、RAM ロールを担うために使用される STS トークンを取得します。
説明アプリケーションがこれらの操作を実行できるようにするには、まず RAM ロールの設定を変更して、ポッドで使用されるサービスアカウントが指定された RAM ロールを担うことを承認する必要があります。詳細については、AssumeRoleWithOIDC を参照してください。
ポッド内のアプリケーションは、STS トークンを使用して指定された RAM ロールを担い、関連するクラウドサービスの API を呼び出します。
RRSA を有効にする
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
クラスター ページで、管理するクラスターを見つけ、その ID をクリックするか、クラスターの アクション 列の 詳細 をクリックします。
クラスターの詳細ページで、基本情報 タブをクリックします。クラスター情報 セクションで、RRSA OIDC の RRSA を有効にする をクリックします。
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 ロールに付与する を参照してください。
demo-role-for-rrsa という名前の RAM ロールを作成します。
Alibaba Cloud アカウントで RAM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。ロール ページで、ロールの作成 をクリックします。
ロールの作成 パネルで、信頼できるエンティティの選択で IdP を選択し、次へ をクリックします。
ロールの設定 ウィザードページで、次のパラメーターを設定し、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 で作成した RAM ロールに AliyunCSReadOnlyAccess ポリシーをアタッチして、アプリケーションに必要な権限を付与します。詳細については、RAM ロールに権限を付与する を参照してください。
アプリケーションをデプロイします。SDK デモの詳細については、RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ を参照してください。
demo.yaml という名前のファイルを次の要件に基づいて作成します。
重要上記のテンプレートで次のフィールドを変更します。
<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 を参照してください。
次のコマンドを実行して、アプリケーションをデプロイします。
kubectl apply -f demo.yaml
次のコマンドを実行して、アプリケーションのログを出力します。
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}
既存の 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
設定の次のフィールドを変更します。
RRSA の OIDC トークン認証をサポートする Alibaba Cloud SDK のデモ
一部の Alibaba Cloud SDK では、アプリケーションが RRSA の OIDC トークンを使用して特定のクラウドサービスの API を呼び出すことができます。次の表に、サポートされている SDK のバージョンとデモを示します。
プログラミング言語 | サポートされている SDK バージョン | デモ |
Go | Alibaba Cloud Credentials for Go 1.2.6 以降 | |
Java | Alibaba Cloud Credentials for Java 0.2.10 以降 | |
Python 3 | Alibaba Cloud Credentials for Python 0.3.1 以降 | |
Node.js および TypeScript |