【Kubernetes】ユーザー管理について理解する

2021.11.02
2024.03.24
Kubernetes
ServiceAccount

はじめに

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でエンコードします。

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

まとめ

  • ユーザー自体のオブジェクトは存在しない
  • ユーザーの認証方法は複数ある

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee