RAM Roles for Service Accounts (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) ロールを引き受けるために使用されるセキュリティトークンサービス (STS) トークンを取得できます。このようにして、アプリケーションは異なるクラウドサービスの API を呼び出すことができます。詳細については、「インスタンスメタデータを取得する」をご参照ください。
セキュリティ上の理由から、クラスタ内の異なるアプリケーションの RAM 権限を制限する必要がある場合は、ECS または Elastic Container Instance メタデータを通じてインスタンスロールに関連付けられた STS トークンを取得する機能を無効にするか、インスタンスに関連付けられたロールに RAM ポリシーを割り当てないようにする必要があります。ただし、これらのアプリケーションは、クラウドリソースにアクセスするために STS トークンを取得するための安全な方法を引き続き必要とします。これらの問題に対処するために、ACK は RAM に基づいて開発された RRSA 機能をリリースしました。
RRSA 機能を使用すると、ACK クラスタ内の異なるアプリケーションが異なる RAM ロールを引き受けることができます。アプリケーションは STS トークンを取得し、そのトークンを使用して特定の RAM ロールを引き受け、関連するクラウドサービスにアクセスできます。これにより、最小権限の原則が適用され、アプリケーションは AccessKey ペアを使用せずに API 操作を呼び出すことができるため、AccessKey ペアの漏洩を防ぎます。
次の手順は、RRSA を使用してアクセス制御を適用する場合に、アプリケーションがクラウドリソースにアクセスする方法を示しています。
テナントは、サービスアカウントトークンボリュームプロジェクションの機能が有効になっている 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 を使用してアクセス制御を適用する場合に、アプリケーションがクラウドリソースにアクセスする方法を示しています。
テナントは、サービスアカウントトークンボリュームプロジェクションの機能が有効になっている 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 ベーシッククラスタ、ACK Pro マネージドクラスター、ACK Serverless ベーシッククラスタ、ACK Serverless Pro クラスタ、および ACK Edge Pro クラスタ が含まれます。
RRSA を有効にする
既存のクラスタがない場合は、ACK マネージドクラスター または ACK Edge クラスタ を作成するときに RRSA を有効にします。それ以外の場合は、クラスタ詳細ページの [セキュリティと監査] セクションで有効にします。
Serverless Kubernetes クラスター の場合、クラスタの作成後、クラスタ詳細ページの [セキュリティと監査] セクションでのみ RRSA を有効にできます。
クラスタ作成中に有効にする
ACK マネージドクラスター または ACK Edge クラスタ を作成する際に、[クラスタ構成] ステップの [詳細オプション (オプション)] セクションで、[RRSA OIDC] の横にある [有効にする] をクリックします。
クラスタ作成後に有効にする
ACK コンソール にログオンします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のペインで、[クラスタ情報] をクリックします。
[基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効にする] をクリックします。
[RRSA を有効にする] ダイアログボックスで、[確認] をクリックします。
[基本情報] セクションで、クラスタステータスが [更新中] から [実行中] に変わると、クラスタの RRSA 機能が有効になります。
URL と ARN 情報を取得する
クラスタの RRSA 機能を有効にした後、[基本情報] タブの [セキュリティと監査] セクションに移動します。[RRSA OIDC] の横にある [有効] ラベルにマウスポインタを合わせると、OIDC プロバイダーの URL と Alibaba Cloud Resource Name (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 がアプリケーション用に作成された 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_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: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 の取得方法の詳細については、「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-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 | 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 | 詳細については、「Java 用 Simple Log Service SDK を使用する」をご参照ください。 |
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 ロールを使用し、必要な権限を RAM ロールに付与する」をご参照ください。 |
一般的に使用される CLI が RRSA の OIDC トークン認証をサポートできるようにする
ack-ram-tool を使用すると、Pod 内で一般的に使用される CLI が RRSA の OIDC トークン認証をサポートできるようにすることができます。次の表に、構成と例を示します。
CLI | 構成方法 | 例 |
説明
|
| |
構成ファイルを作成せずに、Alibaba Cloud CLI で関連コマンドを直接実行することもできます。 説明 Alibaba Cloud CLI v3.0.206 以降のみがこの機能をサポートしています。 |
| |
RRSA の OIDC トークン認証をサポートするために Simple Log Service CLI の構成ファイルを変更することはできません。Simple Log Service CLI で |
| |
構成ファイルの 説明
|
参考資料
\