【Kubernetes】ユーザー管理について理解する
はじめに
Kubernetesのユーザーについてざっくりまとめて、実際にユーザーを作成(?)してみました。
Kubernetesでのユーザー
Kubernetesには以下の2種類のユーザーがあります。
- ユーザー(いわゆる通常のユーザー)
- サービスアカウント(Service Account)
それぞれができる操作はRBAC(Role-Based Access Control)という仕組みで制御します。
ユーザー
ユーザーは、クラスタ外からKubernetesの操作が可能です。
公式ドキュメントで下記のように記載されているように、Kubernetesでは通常のユーザーのオブジェクトはありません。
Kubernetesは通常のユーザーアカウントを表すオブジェクトを持ちません。
ただし、Kubernetes側で認証ができたユーザーがクラスタ外から操作できるようになっています。
認証方法はいくつか用意されており、以下のような認証方法があります。
- X509クライアント証明書
- 静的なトークンファイル
- サービスアカウントトークン
- OpenID Connectトークン
- Webhookトークン認証
- 認証プロキシー
サービスアカウント
サービスアカウント(Service Account)は、Kubernetes内で管理されているアカウントで、Podと紐づけることでPodからKubernetesAPIを操作できるようになります。
通常のユーザとは異なり実際にKubernetes内に作成します。
通常のユーザーで認証してみる
実際にユーザーで認証してみます。いわゆるユーザーの追加のようなことをします。
今回は、X509クライアント証明書での認証をしたいと思います。
秘密鍵の作成
まずは、2048ビットの秘密鍵masa.key
を生成します。
1❯ openssl genrsa -out masa.key 2048
2Generating RSA private key, 2048 bit long modulus
3.....................+++
4..........................................................+++
5e is 65537 (0x10001)
CSRの作成
秘密鍵masa.key
をもとに証明書署名要求(CSR)masa.csr
を作成します。Common Name(CN)がユーザ名、Organizationがグループ名になります。
1❯ openssl req -new -key masa.key -out masa.csr -subj "/CN=masa"
CSRの登録
Base64でエンコードします。
1❯ cat masa.csr | base64 | tr -d "\n"
CSRを登録するcsr.yml
を作成して、エンコードしたCSRをrequest
に記入します。
1apiVersion: certificates.k8s.io/v1
2kind: CertificateSigningRequest
3metadata:
4 name: masa
5spec:
6 request: LS0tLS1CRUdJTi....... # エンコードしたCSR
7 signerName: kubernetes.io/kube-apiserver-client
8 usages:
9 - client auth
マニフェストを反映します。
1❯ kubectl apply -f csr.yml
2certificatesigningrequest.certificates.k8s.io/masa created
CSRを確認してみます。 ステータスがPendingであることがわかります。
1❯ kubectl get csr
2NAME AGE SIGNERNAME REQUESTOR CONDITION
3masa 29s kubernetes.io/kube-apiserver-client docker-for-desktop Pending
CSRの承認
CSRを承認します。
1❯ kubectl certificate approve masa
2certificatesigningrequest.certificates.k8s.io/masa approved
確認するとステータスが承認されたことがわかります。
1❯ kubectl get csr
2NAME AGE SIGNERNAME REQUESTOR CONDITION
3masa 109s kubernetes.io/kube-apiserver-client docker-for-desktop Approved,Issued
証明書masa.crt
を取得します。
1❯ kubectl get csr masa -o jsonpath='{.status.certificate}'| base64 -d > masa.crt
ロールの作成
クラスタ全体で有効なPodを読み取れるClusterRoleを作成します。
1❯ kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
2clusterrole.rbac.authorization.k8s.io/pod-reader created
ClusterRoleをユーザに紐づけるためのClusterRoleBindingを作成します。
1❯ kubectl create clusterrolebinding pod-reader-binding --clusterrole=pod-reader --user=masa
2clusterrolebinding.rbac.authorization.k8s.io/pod-reader-binding created
kubeconfig
kubeconfigにユーザー情報を設定します。
まずは、ユーザーを追加します。
1❯ kubectl config set-credentials masa --client-key=masa.key --client-certificate=masa.crt --embed-certs=true
2User "masa" set.
コンテキスト(context)を作成します。
コンテキストとは、クラスタとユーザーとnamespaceからなるものです。
1❯ kubectl config set-context masa@docker-desktop --cluster=docker-desktop --user=masa
2Context "masa@docker-desktop" created.
コンテキストを変更することで、利用するユーザーが変更されます。
1❯ kubectl config use-context masa@docker-desktop
2Switched to context "masa@docker-desktop".
試しにPodとDeploymentを取得してみると、新しく作成したユーザーにはPod取得のロールしか割り当てていないので、Podは取得できて、Deploymentは取得できていないことがわかります。
1❯ kubectl get deployments --all-namespaces
2Error from server (Forbidden): deployments.apps is forbidden: User "masa" cannot list resource "deployments" in API group "apps" at the cluster scope
3
4❯ kubectl get pods --all-namespaces
5NAMESPACE NAME READY STATUS RESTARTS AGE
6kube-system coredns-558bd4d5db-9k9lx 1/1 Running 0 25m
7 :
8 :
9 :
最後に設定を確認すると、コンテキストとユーザーが追加されていることが確認できます。
1❯ kubectl config view
2apiVersion: v1
3clusters:
4- cluster:
5 certificate-authority-data: DATA+OMITTED
6 server: https://kubernetes.docker.internal:6443
7 name: docker-desktop
8contexts:
9- context:
10 cluster: docker-desktop
11 user: docker-desktop
12 name: docker-desktop
13- context:
14 cluster: docker-desktop
15 user: masa
16 name: masa@docker-desktop
17current-context: masa@docker-desktop
18kind: Config
19preferences: {}
20users:
21- name: docker-desktop
22 user:
23 client-certificate-data: REDACTED
24 client-key-data: REDACTED
25- name: masa
26 user:
27 client-certificate-data: REDACTED
28 client-key-data: REDACTED
まとめ
- ユーザー自体のオブジェクトは存在しない
- ユーザーの認証方法は複数ある