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ファイルのトークン値を変更する方法は、次の通りです。
-
以下のコマンドを順に実行して 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 -
以下のコマンドを実行して 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リソースのみ制御するように制限します。
-
以下のコマンドを実行して 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の作成が必要です。以前のバージョンである場合は、自動で作成されるため、当該ステップを行う必要はありません。
-
以下のコマンドを実行して 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}') -
ncp-iam-authenticatorを通じてクラスタの kubeconfigファイルを作成します。
- ncp-iam-authenticatorの詳細は、関連ガイドの [IAM認証ユーザーの管理] をご参照ください。
-
作成した 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: -
前のステップで確認したトークン情報を、以下のように userの値として追加します。
$ cat kubeconfig-token.yaml apiVersion: v1 clusters: ... users: - name: kubernetes-admin user: token: eyJhbGciOiJSU... # Service Account Tokenを追加
権限制御確認
上記で作成した kubeconfig-token.yamlファイルを基準に、トークンを利用して Kubernetes APIを呼び出す際に正常に権限を制限するか確認する方法は、次の通りです。
-
以下のコマンドを実行して
kubeconfig-token.yamlを環境変数として宣言します。$ export KUBE_CONFIG_TOKEN=kubeconfig-token.yaml -
以下のコマンドをそれぞれ実行してアクセスの有無を確認します。
- 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