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コンポーネントは、ACKサーバーレスクラスタでサポートされています。
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を呼び出して署名付きのSecurity Token Service (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認証を有効にするには、ack-ram-authenticatorコンポーネントをインストールしてAPIサーバーと対話する必要があります。 ack-ram-authenticatorコンポーネントをインストールするには、次の手順を実行します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[セキュリティ] タブをクリックし、ack-ram-authenticatorコンポーネントを見つけ、カードの右下にある [インストール] をクリックし、[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でサポートされている資格情報関連の環境変数の詳細については、 「資格情報」をご参照ください。
RAM ユーザー
ack-ram-toolクライアントは、ローカルの資格情報を使用してRAMにアクセスし、認証を完了します。
クラウドリソースへのアクセスに使用される資格情報を設定する方法の詳細については、「Alibaba cloud CLI」をご参照ください。
CloudSSOユーザー
CloudSSOユーザーは、CloudSSOが提供するacs-sso CLIを使用してCloudSSOにアクセスし、クラウドリソースへのアクセスに使用される資格情報を取得できます。 acs-ssoの詳細については、「Alibaba Cloud 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。.......=888888888888888888888D=.................
...............88888888888888888888888。......... D8888888888888888888888I ..............
......... 、888888888888888ZI: 。..........................=Z88D8888888888D ...........
.........+ 88888888。......................................... 88888888D ............
.........+ 88888888。Alibaba Cloudへようこそ ........ O888888888D .............
................ ************* 88888888。.............. O888888888D .............
.........+ 88888888 .... コマンドラインインターフェイス (リロード) 。... O8888888D ...........
............+ 88888888 ........................................... 88888888D ............
............ D8888888888DO + 。 ..........................?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権限にマップする
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 Alibaba Cloudリソース名 (ARN) をユーザー名
とグループ
のペアにのみマッピングできます。 ARNを複数のIDにマップするには、同じ数のRAMIdentityMapping CRDを作成する必要があります。アカウントタイプ
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