RAM Roles for Service Accounts (RRSA) を使用すると、クラスター内で Pod レベルの OpenAPI 権限隔離を実装できます。これにより、クラウドリソースへのアクセスをきめ細かく制御し、セキュリティリスクを低減できます。このトピックでは、RRSA 機能の使用方法について説明します。
背景情報
OIDC (OpenID Connect) は、OAuth 2.0 上に構築された認証プロトコルです。Alibaba Cloud RAM は、OIDC ベースのロール SSO をサポートしています。Kubernetes クラスター内のアプリケーションは、Security Token Service (STS) からの一時的な認証情報を使用してクラウドリソース API にアクセスします。Container Service for Kubernetes (ACK) は RRSA をサポートしています。マルチテナントシナリオでは、RRSA はクラスター内のアプリケーション Pod 間でクラウドリソースへのアクセスに対して、きめ細かな権限隔離を提供します。ACK では、RRSA を使用して一時的な認証情報の有効期間を制御することもできます。
RRSA は次のように機能します:
-
サービスアカウントトークンのボリュームプロジェクション機能を使用するアプリケーション Pod をデプロイします。
説明ACS クラスターでは、サービスアカウントトークンボリュームプロジェクション機能はデフォルトで有効になっています。
-
クラスターは、アプリケーション Pod に対応するサービスアカウントの OIDC トークンファイルを作成し、マウントします。
-
Pod 内のアプリケーションは、マウントされた OIDC トークンファイルを使用して STS の
AssumeRoleWithOIDCAPI を呼び出し、指定された RAM ロールの一時的な認証情報を取得します。説明Pod のサービスアカウントが RAM ロールを偽装できるように、RAM ロールの信頼ポリシーを事前に変更する必要があります。詳細については、「AssumeRoleWithOIDC」をご参照ください。
-
Pod 内のアプリケーションは、取得した一時的な認証情報を使用してクラウドリソース API にアクセスします。
RRSA の有効化
-
ACS コンソールにログオンします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象のクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、Cluster Information を選択します。
-
クラスターの詳細ページで、Basic Information タブをクリックします。[セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックします。
-
RRSA の有効化 ダイアログボックスで、OK をクリックします。
説明-
RRSA 機能の有効化には約 2〜3 分かかります。クラスターステータス が 更新中 のままである場合は、ページの右上隅にある
更新ボタンをクリックしてリフレッシュしてください。 -
クラスターの状態が 更新中 から 実行中 に変わると、クラスターで RRSA 機能が有効になります。[RRSA OIDC] の横にある 有効 にカーソルを合わせると、OIDC プロバイダーの URL と ARN を表示できます。
-
クラスターで RRSA 機能を有効にすると、ACS コンソールはバックグラウンドで次の操作を実行します:
-
クラスター専用の OIDC Issuer サービスを自動的に作成します。このサービスは ACS によって管理され、手動でのメンテナンスは不要です。
-
この OIDC Issuer を使用する OIDC ID プロバイダーをアカウントに作成します。OIDC ID プロバイダーの名前は
ack-rrsa-<cluster_id>です。ここで、<cluster_id>はご利用のクラスター ID です。
RRSA の使用
RRSA 機能を有効にした後、次の手順に従って、クラスター内のアプリケーションが RRSA を使用して一時的な認証情報を取得し、クラウドリソース API にアクセスできるようにします。
新しい RAM ロールの作成と承認
新しい RAM ロールを作成する代わりに既存の RAM ロールを使用するには、既存の RAM ロールに必要な権限を追加できます。
この例でデプロイされるアプリケーションは、RRSA 機能を使用して指定されたロールを偽装し、現在のアカウント内のクラスターのリストを取得します。使用される主なリソースは次のとおりです:
-
名前空間:
rrsa-demo -
サービスアカウント:
demo-sa -
RAM ロール:
demo-role-for-rrsa
-
demo-role-for-rrsaという名前の RAM ロールを作成します。-
Alibaba Cloud アカウントを使用して RAM コンソールにログインします。
-
左側のナビゲーションウィンドウで、 を選択します。Roles ページで、ロール作成 をクリックします。
-
ロール作成 パネルで、Switch to Policy Editor をクリックしてロールを作成します。
-
視覚化 タブで、次の表に従ってロール情報を設定し、はい をクリックします。
パラメーター
説明
効果
デフォルト値は 許可 です。
Principal
[ID プロバイダー] を選択し、エディット をクリックします。
[ID プロバイダータイプ] を [OIDC] に設定し、クラスターの OIDC ID プロバイダー (例:
ack-rrsa-<cluster_id>) を選択します。<cluster_id>はご利用のクラスター ID です。操作
デフォルトでは、sts:AssumeRole が選択されています。
条件
-
oidc:iss:この条件は [ID プロバイダー] を選択した後に自動的に追加されます。デフォルト設定を使用します。
-
oidc:aud:この条件は [ID プロバイダー] を選択した後に自動的に追加されます。デフォルト設定を使用します。
-
oidc:sub:手動で 条件を追加 を行う必要があります。
-
条件键:
oidc:sub -
运算符:
StringEquals -
条件值:フォーマットは
system:serviceaccount:<namespace>:<serviceAccountName>です。-
<namespace>:アプリケーションが存在する名前空間。 -
<serviceAccountName>:サービスアカウントの名前。
テストアプリケーションの情報に基づき、
system:serviceaccount:rrsa-demo:demo-saと入力します。 -
-
-
-
表示されるダイアログボックスで、ロール名
demo-role-for-rrsaを入力し、はい をクリックします。
-
-
作成したロールに、テストアプリケーションで必要な AliyunCSReadOnlyAccess システムポリシーを付与します。詳細については、「RAM ロールの権限管理」をご参照ください。
-
テストアプリケーションをデプロイします。
-
demo.yamlという名前のファイルを以下の内容で作成します。説明サンプルアプリケーションテンプレート内の次のプレースホルダーを置き換えてください。
-
<role_arn>:これをアプリケーションが使用する RAM ロールの ARN に置き換えます。ARN は、RAM コンソールのロールの 基本情報 ページにある [ARN] フィールドから取得できます。 -
<oidc_provider_arn>:これをクラスターの OIDC プロバイダーの ARN に置き換えます。この ARN は、クラスター情報 ページの 基本情報 タブにある [RRSA OIDC] の横の 有効 にカーソルを合わせることで取得できます。
-
-
次のコマンドを実行して、テストアプリケーションをデプロイします。
kubectl apply -f demo.yamlアプリケーションがデプロイされると、アプリケーションはマウントされた OIDC トークン、RAM ロールの ARN、および OIDC ID プロバイダーの ARN を使用して、STS の
AssumeRoleWithOIDCAPI を呼び出し、指定された RAM ロールの一時的な認証情報を取得できます。その後、アプリケーションはこの一時的な認証情報を使用してクラウドリソース API にアクセスします。詳細については、「AssumeRoleWithOIDC」をご参照ください。
-
-
次のコマンドを実行して、テストアプリケーションのログを表示します。
kubectl -n rrsa-demo logs demo期待される出力は、ACK クラスターのリストです:
20**/**/** 08:35:23 ======= [begin] list ACK clusters with RRSA ======= clusters: cluster id: cf***, cluster name: foo* cluster id: c8***, cluster name: bar* cluster id: c4***, cluster name: foob* 20**/**/** 08:35:24 ======= [end] list ACK clusters with RRSA ======= -
(任意) ロールから AliyunCSReadOnlyAccess システムポリシーをデタッチします。詳細については、「RAM ロールから権限を削除する」をご参照ください。
約 30 秒待ってから、次のコマンドを再度実行してアプリケーションのログを表示します:
kubectl -n rrsa-demo logs demo権限拒否エラーが期待されます:
20**/**/** 10:09:33 ======= [begin] list ACK clusters with RRSA ======= 20**/**/** 10:09:33 SDKError: StatusCode: 403 Code: StatusForbidden Message: code: 403, STSToken policy Forbidden for action cs:DescribeClusters request id: XXXX Data: {"accessDeniedDetail":{"AuthAction":"cs:DescribeClusters","AuthPrincipalDisplayName":"demo-role-for-rrsa:ack-ram-tool","AuthPrincipalOwnerId":"XXXX","AuthPrincipalType":"AssumedRoleUser","EncodedDiagnosticMessage":"XXXX","NoPermissionType":"ImplicitDeny","PolicyType":"ResourceGroupLevelIdentityBasedPolicy"},"code":"StatusForbidden","message":"STSToken policy Forbidden for action cs:DescribeClusters","requestId":"XXXX","status":403,"statusCode":403}
既存の RAM ロールの承認
アプリケーションが新しいロールではなく既存の RAM ロールを使用する必要がある場合、RAM ロールの信頼ポリシーを変更し、特定のサービスアカウントを使用するアプリケーションがこの RAM ロールを偽装して一時的な認証情報を取得できるようにするステートメントを追加できます。詳細については、「RAM ロールの信頼ポリシーを変更する」をご参照ください。
以下のコードは、RAM ロールの信頼ポリシーに追加する Statement エントリの例です。
サンプル Statement エントリ内の次のプレースホルダーを置き換えてください。
-
<oidc_issuer_url>:これをクラスターの OIDC プロバイダーの URL に置き換えます。URL は、クラスター情報 ページの 基本情報 タブにある [RRSA OIDC] の横の 有効 にカーソルを合わせることで取得できます。 -
<oidc_provider_arn>:これをクラスターの OIDC プロバイダーの ARN に置き換えます。ARN は、クラスター情報 ページの 基本情報 タブにある [RRSA OIDC] の横の 有効 にカーソルを合わせることで取得できます。 -
<namespace>:これをアプリケーションが存在する名前空間に置き換えます。 -
<service_account>:これをアプリケーションが使用するサービスアカウントに置き換えます。
{
"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>"
]
}
}
参考
-
一部の Alibaba Cloud 公式 SDK は、RRSA OIDC トークンを使用した認証を組み込みでサポートしています。次の表は、この機能をサポートする 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 and TypeScript
-
OIDC ロールベース SSO を実行する際、AssumeRoleWithOIDC API を呼び出して RAM ロールを偽装するための一時的な認証情報を取得できます。