すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ack-ram-authenticatorを使用して、ACKマネージドクラスターのAPIサーバーがwebhook認証を完了できるようにします。

最終更新日:Nov 14, 2024

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認証がどのように機能するかを示しています。

123..png

  1. kubectlなどのツールを使用してACK管理クラスターのAPIサーバーを認証する場合、kubectlクライアントはkubeconfigファイルでexecコマンドを実行し、ack-ram-toolを呼び出して署名付きのSecurity Token Service (STS) トークンURLを生成します。

  2. kubectlクライアントが認証webhookをAPIサーバーに送信すると、APIサーバーはwebhookをack-ram-authenticatorにルーティングします。

  3. ack-ram-authenticatorは、RAMのGetCallerIdentity操作を呼び出して、受信したトークンURLに基づいて呼び出し元に関するID情報を取得します。 GetCallerIdentity操作が呼び出し元に関するID情報を返した後、ack-ram-authenticatorは、呼び出し元のRAM IDを、RAMIdentityMapping設定で定義されているIDマッピングと照合します。

  4. 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コンポーネントをインストールするには、次の手順を実行します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、[セキュリティ] タブをクリックし、ack-ram-authenticatorコンポーネントを見つけ、カードの右下にある [インストール] をクリックし、[OK] をクリックします。

ステップ2: ack-ram-toolクライアントのインストール

ack-ram-toolクライアントを使用して、オンプレミス環境でkubeconfigファイルを自動的に生成できます。 kubeconfigファイルには、クラスターへのアクセスに使用される資格情報が含まれています。

  1. 使用するオペレーティングシステムに基づいて、ack-ram-toolクライアントのバージョンをダウンロードします。

  2. 次のコマンドを実行して、クライアントプログラムを実行可能にします。

    chmod +x ./ack-ram-tool
  3. 次のコマンドを実行して、ack-ram-toolファイルをPATHパラメーターで指定したディレクトリにコピーします。

     mkdir -p $HOME/bin && cp ./ack-ram-tool $HOME/bin/ack-ram-tool && export PATH=$HOME/bin:$PATH
  4. 次のコマンドを実行して、$HOME/binのPATH設定を保持します。

    echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile
    
  5. 次のコマンドを実行して、インストールしたクライアントのバージョンが返されるかどうかを確認します。 そうである場合、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ファイルの生成

  1. 次のコマンドを実行してkubeconfigファイルを生成します。 get-kubeconfig」をご参照ください。

    ack-ram-tool credential-plugin get-kubeconfig --cluster-id $cluster_id --mode ram-authenticator-token
  2. 返されたkubeconfigファイルをオンプレミス環境または指定された環境で変更します。 詳細は、「Kubernetesドキュメント」をご参照ください。

ステップ5: RAM IDをRBAC権限にマップする

ack-ram-authenticatorコンポーネントをインストールすると、デフォルトでRAMIdentityMappingという名前のカスタムリソース定義 (CRD) がクラスターに作成されます。 CRDは、RAM IDをKubernetes RBAC権限にマップするために使用されます。 クラスターの権限管理者は、次の手順を実行して、RAMユーザーまたはRAMロールをKubernetes RBAC権限にマップできます。

  1. 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

  2. 次のコマンドを実行して、RAMIdentityMapping CRDを作成します。

    kubectl apply -f auth.yaml
  3. カスタム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