ack-ram-authenticator を使用して、ACK マネージドクラスターの API サーバーリクエストに対し、RAM によるセキュアな Webhook 認証を実行します。RAM ID を RBAC にマッピングし、監査ログで同じロールを引き受ける SSO ユーザーを区別します。本トピックでは、Webhook 認証の方法と使用ワークフローについて説明します。
前提条件
ACK マネージドクラスター (バージョン 1.24.6-aliyun.1 以降) が作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
注意事項
-
ack-ram-authenticatorのインストールまたはアンインストールを行うと、API サーバーが再起動し、長時間接続が切断されます。この操作はピーク時間外に計画してください。 -
Webhook 認証は、
DescribeClusterUserKubeconfigから取得した kubeconfig を使用した API サーバーへのアクセスをブロックしません。 -
ack-ram-authenticatorは ACK サーバーレスクラスターでもサポートされています。
どのように ack-ram-authenticator は動作するか
ack-ram-authenticator は、ACK マネージドクラスター用の認証アドオンです。Kubernetes の Webhook トークン認証を使用して Alibaba Cloud RAM で API サーバーリクエストを認証し、RAM ID を CRD として RBAC 権限にマッピングします。
ユーザーが Alibaba Cloud SSO ロールを引き受けて ACK マネージドクラスターの API サーバーにアクセスすると、ack-ram-authenticator はその ID のセッション名を API サーバーに渡します。これにより、API サーバーは、同じロールを引き受ける異なるユーザーからのリクエストを認証できます。
クラスターの Webhook 認証フローは次のとおりです:

kubectl などのツールを使用して認証リクエストを API サーバー に送信すると、KubeConfig ファイル内の
execコマンドプラグインが ack-ram-tool クライアントを実行します。クライアントは署名付きのセキュリティトークンサービス (STS) リクエスト URL を生成します。Webhook 認証リクエストが ACK マネージドクラスター の API サーバー に送信されます。リクエストは Webhook 認証設定に基づいて ack-ram-authenticator コンポーネントにルーティングされます。
コンポーネントは、受信したトークン URL を使用して、Alibaba Cloud RAM の GetCallerIdentity API に対してリクエストを認証します。認証が成功すると、ack-ram-authenticator コンポーネントは、API から返された RAM ID と、指定された RAMIdentityMapping カスタムリソース (CR) 内でユーザーが設定した ID とのマッピングを検索します。
API サーバー は、マッピングされたユーザー ID とグループ ID に対してネイティブの RBAC 権限付与を実行し、権限付与の結果を返します。
メリット
ACK のデフォルトの X.509 証明書認証と比較して、ack-ram-authenticator を使用した Webhook 認証には次のメリットがあります。
-
柔軟で管理しやすいデータプレーンの RBAC 認可によるエンタープライズ SSO 統合。
-
SSO シナリオでは、API サーバーの監査ログにエンタープライズ ID プロバイダー (IdP) のアイデンティティ情報が含まれるため、同じロールを引き受ける異なる IdP ユーザーからのアクションを監査できます。
-
退職した従業員の RAM ユーザーまたは RAM ロールが削除されると、そのユーザーのクラスター RBAC 権限は自動的に取り消されます。
ステップ1:ack-ram-authenticator のインストール
サーバー側の ack-ram-authenticator アドオンをインストールして、クラスターの API サーバーで RAM による Webhook 認証を有効にします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
アドオン管理 ページで セキュリティ タブをクリックし、
ack-ram-authenticatorアドオンを見つけ、カードの右下隅にある インストール をクリックします。表示された パラメーター ダイアログボックスで、EnableNonBootstrapMappingオプションを選択し、OK をクリックします。
ステップ2:ack-ram-tool クライアントのインストール
ローカルマシンで、ack-ram-tool はクラスターの認証情報を含む kubeconfig ファイルを生成します。
-
お使いの OS とアーキテクチャに対応する ack-ram-tool をダウンロードします。
-
クライアントに実行権限を付与します。
chmod +x ./ack-ram-tool -
ack-ram-tool をシステムの
PATHに含まれるディレクトリにコピーします。mkdir -p $HOME/bin && cp ./ack-ram-tool $HOME/bin/ack-ram-tool && export PATH=$HOME/bin:$PATH -
(オプション) Bash の場合、
~/.bash_profileにPATH設定を永続化します。echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile -
インストールを検証します。コマンドはクライアントのバージョンを返します。
ack-ram-tool version
ステップ3:Alibaba Cloud 認証情報の設定
RAM ユーザーと SSO ユーザーは、次のいずれかの方法で Alibaba Cloud 認証情報を設定できます。
認証情報関連の環境変数が設定されている場合、ack-ram-tool はデフォルトでそれらを使用します。 上書きするには、--ignore-env-credentials を ack-ram-tool コマンドに追加します。 ack-ram-tool でサポートされている環境変数: 認証情報。
RAM ユーザー
ack-ram-tool は、ローカルに設定された Alibaba Cloud 認証情報を使用して RAM に対する認証を行います。
アクセス認証情報の設定については、「Alibaba Cloud CLI」をご参照ください。
SSO ユーザー
SSO ユーザーは、CloudSSO の CLI ツールである acs-sso を使用してログインし、認証情報を取得します。acs-sso の詳細については、「CLI を使用した CloudSSO へのログインと Alibaba Cloud リソースへのアクセス」をご参照ください。Alibaba Cloud CLI の external モードは、外部コマンドを実行して認証情報を取得します。CloudSSO の自動ログインと認証情報取得を次のように設定します。
aliyun configure --mode External --profile sso
Configuring profile 'sso' in 'External' authenticate mode...
Process Command [acs-sso login --profile sso]:
Default Region Id [cn-shanghai]:
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en:
Saving profile[sso] ...Done.
Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............
ステップ4:kubeconfig ファイルの生成
-
kubeconfig ファイルを生成します。コマンドの詳細については、get-kubeconfigをご参照ください。
ack-ram-tool credential-plugin get-kubeconfig --cluster-id $cluster_id --mode ram-authenticator-token -
生成されたファイルを既存の kubeconfig にマージまたは置換します。詳細については、「kubeconfig ファイルを使用したクラスターアクセスの整理」をご参照ください。
ステップ5:RAM ID の RBAC 権限へのマッピング
インストール時に EnableNonBootstrapMapping オプションを選択してください。そうしない場合、以下のマッピングは有効になりません。
ack-ram-authenticator をインストールすると、クラスターは RAM ID を Kubernetes のユーザーモデルにマッピングする RAMIdentityMapping CRD を作成します。クラスター管理者として、RAM ユーザーまたは RAM ロールを RBAC 権限を持つ Kubernetes ユーザーにマッピングします。
-
以下の内容で
auth.yamlという名前の設定テンプレートファイルを作成します。cat >auth.yaml <<EOF --- apiVersion: ramauthenticator.k8s.alibabacloud/v1alpha1 kind: RAMIdentityMapping metadata: name: tester spec: arn: '<ARN>' username: tester groups: - system:users EOF-
各 RAMIdentityMapping インスタンスは、1 つの RAM ARN を 1 つの
usernameとgroupsにマッピングします。マッピングごとに 1 つのインスタンスを作成してください。 -
<ARN>を対象の RAM ユーザーまたは RAM ロールの ARN に置き換えます。次の表に、アカウントタイプごとの ARN 形式を示します。アカウントタイプ
ARN 形式
例
Alibaba Cloud アカウント
acs:ram::<root_uid>:root<root_uid>はAlibaba Cloud AccountID です。acs:ram::123456789012****:rootRAM ユーザー
acs:ram::<root_uid>:user/<user_name><root_uid>は Alibaba Cloud アカウント ID、<user_name>は RAM ユーザー名です。acs:ram::123456789012****:user/testuserRAM ロール
acs:ram::<root_uid>:role/<role_name><root_uid>はAlibaba Cloud AccountID、<role_name>は RAM ロール名です。RAM ロールの ARN を表示するには、「RAM ロールの情報の表示」をご参照ください。acs:ram::123456789012****:role/testrole
-
-
RAMIdentityMappingインスタンスを作成します。kubectl apply -f auth.yaml -
クラスターの RBAC 権限を設定します。必要に応じて、カスタム RBAC ロールとバインディングを作成します。
RBAC バインディングの例:
cat >binding.yaml <<EOF --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tester-clusterrolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cs:ops subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: tester EOF kubectl apply -f binding.yaml
ステップ6:kubeconfig を使用したリクエストの送信
ステップ4で取得した kubeconfig ファイルを使用して API サーバーにリクエストを送信し、設定された権限内で成功することを確認します。
kubectl get ns
想定される出力:
NAME STATUS AGE
arms-prom Active 4h48m
default Active 4h50m
kube-node-lease Active 4h50m
kube-public Active 4h50m
kube-system Active 4h50m