クラスタ権限制御

Prev Next

VPC環境で利用できます。

参考

ncp-iam-authenticatorを使用して kubeconfigを構成すると、ServiceAccountトークンを利用して権限を制御する必要がありません。
IAM認証ユーザーの管理を確認してください。

Ncloud Kubernetes Serviceが提供する kubeconfig認証ファイルは ncp-iam-authenticatorを通じて動作 するため、ユーザーが Jenkins、Github Actionのような3rd-partyサービスを使用する場合、多少の不便が発生することがあります。その認証ファイルは、ユーザーのクラスタ権限を対象3rd-partyサービスに付与するため、セキュリティ問題が発生する可能性があります。これを防ぐには、トークンを使用した kubeconfig認証ファイルを作成し、必要な権限のみ付与して権限を最小化することでセキュリティを強化できます。

kubeconfigファイルのトークン値変更

kubeconfigファイルのトークン値を変更してクラスタ権限を制限する方法を、ユースケースにて説明します。

kubeconfigファイルのトークン値を変更する方法は、次の通りです。

  1. 以下のコマンドを順に実行して Namespaceと Service Accountを作成します。

    $ kubectl --kubeconfig $KUBE_CONFIG create ns hello-world
    
    $ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: hello-user
      namespace: hello-world
    EOF
    
  2. 以下のコマンドを実行して Roleと Role Bindingを追加します。

    $ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f -
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: hello-world
      name: hello-role
    rules:
    - apiGroups: [""]
      resources: ["pods"] # Objectの指定
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # Action制御 
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: hello-world
      name: hello-rb
    subjects:
    - kind: ServiceAccount
      name: hello-user
      namespace: hello-world
    roleRef:
      kind: Role 
      name: hello-role
      apiGroup: rbac.authorization.k8s.io
    EOF
    
    • Roleの resources、verbsで使用する権限を定義します。上記のサンプルコードでは、hello-worldという名前空間の Podリソースのみ制御するように制限します。
  3. 以下のコマンドを実行して Service Accountの Secretを作成します。

    $ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: hello-user-default
      namespace: hello-world
      annotations:
        kubernetes.io/service-account.name: hello-user
    type: kubernetes.io/service-account-token
    EOF
    
    参考

    Kubernetes 1.24からは Service Account作成時に自動で default secretを作成しません。使用しているバージョンが1.24以降である場合、ステップ3で関連 secretの作成が必要です。以前のバージョンである場合は、自動で作成されるため、当該ステップを行う必要はありません。

  4. 以下のコマンドを実行して Service Accountのトークンを確認します。

    $ kubectl --kubeconfig $KUBE_CONFIG -n hello-world describe secret $(kubectl --kubeconfig $KUBE_CONFIG -n hello-world get secret | grep hello-user | awk '{print $1}')
    
  5. ncp-iam-authenticatorを通じてクラスタの kubeconfigファイルを作成します。

  6. 作成した kubeconfigファイルをコピーして kubeconfig-token.yamlファイルに保存した後、そのファイルの user部分の client-certificate-data、client-key-data値を以下のように削除します。

    $ cp kubeconfig.yaml kubeconfig-token.yaml
    $ vi kubeconfig-token.yaml
    apiVersion: v1
    clusters:
    ...
    users:
    - name: kubernetes-admin
      user:
    
    
  7. 前のステップで確認したトークン情報を、以下のように userの値として追加します。

    $ cat kubeconfig-token.yaml
    apiVersion: v1
    clusters:
    ...
    users:
    - name: kubernetes-admin
      user:
        token:  eyJhbGciOiJSU... # Service Account Tokenを追加
    

権限制御確認

上記で作成した kubeconfig-token.yamlファイルを基準に、トークンを利用して Kubernetes APIを呼び出す際に正常に権限を制限するか確認する方法は、次の通りです。

  1. 以下のコマンドを実行して kubeconfig-token.yamlを環境変数として宣言します。

    $ export KUBE_CONFIG_TOKEN=kubeconfig-token.yaml
    
  2. 以下のコマンドをそれぞれ実行してアクセスの有無を確認します。

    • Podオブジェクトの照会(アクセス可能)
    $ kubectl --kubeconfig $KUBE_CONFIG_TOKEN -n hello-world get pod
    
    • Deploymentオブジェクトの照会(アクセス不可)
    $ kubectl --kubeconfig $KUBE_CONFIG_TOKEN -n hello-world get deploy
    
    • 他の名前空間の照会(アクセス不可)
    $ kubectl --kubeconfig $KUBE_CONFIG_TOKEN get pod