ack-ram-authenticator コンポーネントを使用すると、ACK マネージドクラスターが Alibaba Cloud Resource Access Management (RAM) と Webhook を利用して、API Server へのリクエストを安全に認証できます。ロールベースのシングルサインオン (SSO) の場合、このコンポーネントは同じロールを引き受ける異なるユーザーからの API Server リクエストを安全に監査することも支援します。本トピックでは、ACK マネージドクラスター の API Server で Webhook 認証に ack-ram-authenticator コンポーネントを使用する方法について説明します。
前提条件
ACK マネージドクラスター が作成済みである必要があります。クラスターバージョンは 1.24.6-aliyun.1 以降である必要があります。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
注意事項
ack-ram-authenticator コンポーネントのインストールまたはアンインストールにより、クラスターのコントロールプレーンにある API Server が再起動されます。これにより、API Server への持続的接続が切断されます。オフピーク時間帯にコンポーネントをインストールまたはアンインストールしてください。
Webhook 認証を有効化した後でも、DescribeClusterUserKubeconfig API 操作によって返される kubeconfig ファイルは引き続きクラスターの API Server へのアクセスに使用できます。
ACK サーバーレスクラスター もサポートされています。
認証方式
ack-ram-authenticator コンポーネントは ACK マネージドクラスター 向けの認証プラグインです。このコンポーネントは Kubernetes のネイティブな Webhook Token Authentication 方式を使用し、RAM を介してクラスターの API Server へのリクエストを認証します。また、RAM ID と RBAC 権限の間のマッピングをカスタムリソース定義 (CRD) として提供することで、RBAC 権限付与をより柔軟に構成できます。
Alibaba Cloud CloudSSO ロールを使用して ACK マネージドクラスター にアクセスする場合、ack-ram-authenticator コンポーネントはリクエスト送信者の ID のセッション名を API Server に渡すことができます。これにより、同じロールを引き受ける異なるユーザーからのクラスター API Server へのアクセスリクエストをより安全に監査できます。
クラスターの Webhook 認証フローは次のとおりです。

kubectl などのツールを使用して API Server に認証リクエストを送信すると、KubeConfig ファイル内の
execコマンドプラグインが ack-ram-tool クライアントを実行します。クライアントは署名済みのセキュリティトークンサービス (STS) リクエスト URL を生成します。Webhook 認証リクエストが ACK マネージドクラスター の API Server に送信されます。このリクエストは Webhook 認証設定に基づいて ack-ram-authenticator コンポーネントにルーティングされます。
コンポーネントは受信したトークン URL を使用して、Alibaba Cloud RAM GetCallerIdentity API に対してリクエストを認証します。認証が成功した場合、ack-ram-authenticator コンポーネントは API から返された RAM ID と、指定された RAMIdentityMapping カスタムリソース (CR) 内でユーザーが構成した ID 間のマッピングを検索します。
API Server はマッピングされたユーザーおよびグループ ID に対してネイティブな RBAC 権限付与を実行し、その結果を返します。
この認証方式の利点
ACK クラスターのデフォルトの X.509 証明書認証方式と比較して、ack-ram-authenticator Webhook 認証方式には以下の利点があります。
エンタープライズクラウド SSO シナリオに対応し、データプレーンの RBAC 権限付与を柔軟かつ制御可能にします。
ロールベース SSO シナリオにおいて、API Server の監査ログに企業の ID プロバイダー (IDP) からの ID 情報が含まれるため、同じロールを引き受ける異なる IDP ユーザーの動作を効果的に監査できます。
従業員が退職し、その RAM ユーザーまたは RAM ロールが削除されると、クラスター内の RBAC 権限が自動的に取り消されます。
手順 1:ack-ram-authenticator コンポーネントのインストール
RAM Webhook 認証を有効化するには、サーバー側の認証プラグインである ack-ram-authenticator をインストールします。このプラグインはクラスターの API Server と連携して認証を実行します。ack-ram-authenticator コンポーネントをインストールするには、次の手順を実行します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで管理対象のクラスターを見つけ、その名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
[コンポーネント管理] ページで、[セキュリティ] タブをクリックし、ack-ram-authenticator コンポーネントを見つけます。[インストール] をカードの右下隅でクリックします。表示される [パラメーター設定] ダイアログボックスで、
EnableNonBootstrapMapping設定項目を選択し、[確認] をクリックします。
手順 2:ack-ram-tool クライアントのインストール
ack-ram-tool クライアントは、ローカルマシン上で特定のクラスター用の kubeconfig アクセス認証情報を自動的に生成します。
環境のアーキテクチャに合った 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(任意)次のコマンドを実行して、
$HOME/binの PATH 設定を永続化します。echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile次のコマンドを実行してクライアントのバージョンを確認します。バージョン番号が返された場合、ack-ram-tool クライアントは正常にインストールされています。
ack-ram-tool version
手順 3:Alibaba Cloud 認証情報の構成
Alibaba Cloud RAM ユーザーおよび SSO ユーザーは、以下の方法でクラウドリソースのアクセス認証情報を構成および取得できます。
現在の環境にアクセス認証情報に関連する環境変数がある場合、ack-ram-tool はそれらの変数に設定された認証情報を優先します。ack-ram-tool コマンドを実行する際に --ignore-env-credentials パラメーターを追加して、これらの環境変数を無視できます。ack-ram-tool がサポートする認証情報関連の環境変数の詳細については、「Credentials」をご参照ください。
RAM ユーザー
ack-ram-tool クライアントは、RAM への ID 認証のためにローカルに構成された Alibaba Cloud キー認証情報に依存します。
アクセス認証情報の構成方法の詳細については、「Alibaba Cloud CLI」をご参照ください。
SSO ユーザー
Alibaba CloudSSO ユーザーの場合、CloudSSO サービスが提供する acs-sso コマンドラインインターフェイス (CLI) ツールを使用してログインし、クラウドリソースのアクセス認証情報を取得できます。acs-sso の詳細については、「CLI を使用した CloudSSO へのログインと Alibaba Cloud リソースへのアクセス」をご参照ください。Alibaba Cloud CLI ツールは外部モードをサポートしており、外部コマンドラインツールを実行することで動的にリソース認証情報を取得できます。次のコマンドを実行して CloudSSO にログインし、ローカルマシン上に認証情報を自動的に構成します。
aliyun configure --mode External --profile sso
「External」 認証モードでプロファイル 「sso」 を設定しています...
コマンドの処理 [acs-sso login --profile sso]:
デフォルトのリージョン ID [cn-shanghai]:
デフォルトの出力形式 [json]: json (json のみをサポート)
デフォルトの言語 [zh|en] en:
プロファイル[sso]の保存...完了。
設定完了!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Alibaba Cloud へようこそ.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... コマンドラインインターフェイス (リロード済み) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............手順 4:kubeconfig ファイルの生成
kubeconfig ファイルを生成するには、次のコマンドを実行します。コマンドの詳細については、see get-kubeconfigをご参照ください。
ack-ram-tool credential-plugin get-kubeconfig --cluster-id $cluster_id --mode ram-authenticator-tokenコマンドによって返された kubeconfig ファイルをローカル環境または指定された環境に構成します。詳細については、Kubernetes 公式ドキュメントをご参照ください。
手順 5:RAM ID と RBAC 権限のマッピングの構成
コンポーネントをインストールする際に、EnableNonBootstrapMapping 設定項目を[チェック] していることを確認してください。そうでない場合、構成したマッピングは適用されません。
ack-ram-authenticator コンポーネントをインストールすると、クラスター内に RAMIdentityMapping という CRD がデフォルトでインストールされます。この CRD は RAM ID と Kubernetes ユーザーモデルの間のマッピングを構成するために使用されます。クラスター管理者は、以下の方法でユーザー ID を構成し、特定の RAM ユーザーまたは RAM ロールを Kubernetes RBAC 権限にバインドできます。
次の YAML コンテンツを使用して、
auth.yamlという名前の構成テンプレートファイルを作成します。cat >auth.yaml <<EOF --- apiVersion: ramauthenticator.k8s.alibabacloud/v1alpha1 kind: RAMIdentityMapping metadata: name: tester spec: arn: '<ARN>' username: tester groups: - system:users EOFRAMIdentityMapping インスタンスの
specフィールドでは、1 つの RAM ARN のみをusernameおよびgroupsにマッピングできます。異なる RAM ID をマッピングするには、複数の RAMIdentityMapping インスタンスを作成する必要があります。<ARN>は、指定された RAM ユーザーまたは RAM ロールの ARN に置き換えてください。以下の表は、アカウントタイプ別の ARN 形式を示しています。アカウントタイプ
ARN 形式
例
Alibaba Cloud アカウント
acs:ram::<root_uid>:rootここで、
<root_uid>は Alibaba Cloud アカウントの ID です。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 アカウントの ID、<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 ファイルを使用して APIServer にリクエストを送信します。権限の範囲内で API Server に正常にアクセスできることを確認します。
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