ack-ram-authenticator は、Webhook と Resource Access Management (RAM) を使用して、Container Service for Kubernetes (ACK) マネージドクラスターの API サーバーに送信されたリクエストを認証するのに役立つコンポーネントです。シングルサインオン (SSO) のシナリオでは、ack-ram-authenticator は、同じロールを担うユーザーが API サーバーに送信したリクエストを API サーバーが認証するのに役立ちます。このトピックでは、ack-ram-authenticator が API サーバーの Webhook 認証を完了するのにどのように役立つかについて説明します。また、Webhook 認証を構成する方法についても説明します。
前提条件
ACK マネージドクラスターが作成されており、クラスターのバージョンが 1.24.6-aliyun.1 以降であること。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
使用上の注意
ack-ram-authenticator コンポーネントをインストールまたはアンインストールすると、クラスター内の API サーバーが再起動し、API サーバーへのすべての持続的接続が閉じられます。 ack-ram-authenticator コンポーネントは、オフピーク時にインストールまたはアンインストールすることをお勧めします。
Webhook 認証を有効にした後も、DescribeClusterUserKubeconfig API 操作によって返された kubeconfig ファイルを使用して、通常どおり API サーバーにアクセスできます。
ack-ram-authenticator コンポーネントは、Serverless Kubernetes クラスター でサポートされています。
ack-ram-authenticator のしくみ
ack-ram-authenticator は、ACK マネージドクラスター用の認証コンポーネントです。このコンポーネントは、Kubernetes ネイティブの Webhook トークン認証 と RAM を使用して、ACK マネージドクラスターの API サーバーに送信されたリクエストを認証するのに役立ちます。このコンポーネントを使用すると、カスタムリソース定義 (CRD) を使用して、RAM ID とロールベースアクセス制御 (RBAC) 権限間のマッピングを定義できます。これにより、さまざまな RAM ID の RBAC 権限をより柔軟に検証できます。
ユーザーが Alibaba Cloud シングルサインオン (SSO) ロールを担って ACK マネージドクラスターの API サーバーにアクセスする場合、ack-ram-authenticator はユーザー ID に対応するセッションの名前を API サーバーに渡します。これにより、API サーバーは、同じロールを担うユーザーによって API サーバーに送信されたリクエストを認証できます。
次の図は、ack-ram-authenticator をインストールした ACK マネージドクラスターにおける Webhook 認証のしくみを示しています。
kubectl などのツールを使用して ACK マネージドクラスターの API サーバーに対して認証を行う場合、kubectl クライアントは kubeconfig ファイルで
exec
コマンドを実行し、ack-ram-tool を呼び出して署名付きセキュリティトークンサービス (STS) トークン URL を生成します。kubectl クライアントが認証 Webhook を API サーバーに送信すると、API サーバーは Webhook を ack-ram-authenticator にルーティングします。
次に、ack-ram-authenticator は RAM の GetCallerIdentity 操作を呼び出し、受信したトークン URL に基づいて呼び出し元の ID 情報を取得します。 GetCallerIdentity 操作が呼び出し元の ID 情報を返すと、ack-ram-authenticator は呼び出し元の RAM ID を RAMIdentityMapping 構成で定義された ID マッピングと照合します。
API サーバーは、一致するマッピング内の RAM ユーザーまたはユーザーグループの RBAC 権限を確認し、認証結果を kubectl クライアントに返します。
ack-ram-authenticator のメリット
ACK クラスターによって提供されるデフォルトの x509 証明書認証モードと比較して、ack-ram-authenticator を使用して Webhook 認証を実行することには、次の利点があります。
CloudSSO を使用する企業に適しており、ロールベースアクセス制御 (RBAC) 権限付与を実装するための柔軟で制御可能な方法を提供します。
ユーザーが SSO ロールを使用して API サーバーにアクセスするシナリオでは、API サーバーの監査ログには、企業 ID プロバイダー (IdP) によって提供される ID 情報が含まれます。これにより、API サーバーは、同じロールを担うユーザーによって送信されたリクエストを認証できます。
パーティション分割された従業員に関連付けられている RAM ユーザーまたは RAM ロールを削除すると、ack-ram-authenticator は関連付けられているクラスター RBAC 権限を自動的に取り消します。
ステップ 1: ack-ram-authenticator コンポーネントをインストールする
Webhook 認証を有効にするには、API サーバーと対話するために ack-ram-authenticator コンポーネントをインストールする必要があります。次の手順を実行して、ack-ram-authenticator コンポーネントをインストールできます。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックし、[ack-ram-authenticator] コンポーネントを見つけて、カードの右下にある [インストール] をクリックします。
[ Ack-ram-authenticator をインストール] ダイアログボックスで、
EnableNonBootstrapMapping
を選択し、[OK] をクリックします。
ステップ 2: ack-ram-tool クライアントをインストールする
ack-ram-tool クライアントを使用すると、オンプレミス環境で kubeconfig ファイルを自動的に生成できます。 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 認証情報を構成する
RAM ユーザーと CloudSSO ユーザーは、次の方法を使用して、クラウドリソースへのアクセスに使用される認証情報を取得できます。
認証情報関連の環境変数が存在する場合、ack-ram-tool はそれらの変数で構成された認証情報を優先的に使用します。 ack-ram-tool コマンドを実行するときに --ignore-env-credentials
オプションを追加することで、これらの変数を無視できます。 ack-ram-tool でサポートされている認証情報関連の環境変数の詳細については、 認証情報 を参照してください。
ack-ram-tool クライアントは、ローカル認証情報を使用して RAM にアクセスし、認証を完了します。
クラウドリソースへのアクセスに使用される認証情報を構成する方法の詳細については、「Alibaba Cloud CLI」をご参照ください。
CloudSSO ユーザーは、CloudSSO によって提供される acs-sso CLI を使用して CloudSSO にアクセスし、クラウドリソースへのアクセスに使用される認証情報を取得できます。 acs-sso の詳細については、「Alibaba Cloud CLI を使用して CloudSSO と Alibaba Cloud リソースにアクセスする」をご参照ください。 Alibaba Cloud CLI は、外部 モードをサポートしています。このモードを使用して、外部プログラムを介して認証情報を動的に取得できます。次のコマンドを実行して、オンプレミス環境から 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 ファイルを、オンプレミス環境または指定された環境で変更します。詳細については、「Kubernetes ドキュメント」をご参照ください。
ステップ 5: RAM ID を RBAC 権限にマッピングする
コンポーネントのインストール中に EnableNonBootstrapMapping
パラメーターが選択されていることを確認してください。そうでない場合、構成されたマッピングは有効になりません。
ack-ram-authenticator コンポーネントがインストールされると、RAMIdentityMapping という名前のカスタムリソース定義 (CRD) がデフォルトでクラスターに作成されます。 CRD は、RAM ID を Kubernetes RBAC 権限にマッピングするために使用されます。クラスターの権限管理者は、次の手順を実行して、RAM ユーザーまたは RAM ロールを Kubernetes RBAC 権限にマッピングできます。
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 CRD の
spec
セクションでは、RAM Amazon リソースネーム (ARN) をusername
とgroups
の 1 つのペアのみにマッピングできます。 ARN を複数の ID にマッピングするには、同じ数の RAMIdentityMapping CRD を作成する必要があります。アカウントタイプ
ARN 形式
例
アカウントタイプ
ARN 形式
例
Alibaba Cloud アカウント
acs:ram::<root_uid>:root
。ここで、<root_uid>
は Alibaba Cloud アカウントの ID です。acs:ram::123456789012****:root
RAM ユーザー
acs:ram::<root_uid>:user/<user_name>
。ここで、<root_uid>
は Alibaba Cloud アカウントの ID で、<user_name>
は使用する RAM ユーザーの名前です。acs:ram::123456789012****:user/testuser
RAM ロール
acs:ram::<root_uid>:role/<role_name>
。ここで、<root_uid>
は Alibaba Cloud アカウントの ID で、<role_name>
は使用する RAM ロールの名前です。 RAM ロールの ARN を表示する方法の詳細については、「RAM ロールの情報を表示する」をご参照ください。acs:ram::123456789012****:role/testrole
次のコマンドを実行して、RAMIdentityMapping CRD を作成します。
kubectl apply -f auth.yaml
カスタム 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 - apiGroup: rbac.authorization.k8s.io kind: User name: tester2 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