はじめに
Kubernetesクラスターへのアクセスにてデフォルトではkubernetes-adminというユーザにclient-certificate-dataとclient-key-dataが与えられて認証しています。
今回は新規ユーザを用意した場合にclient-certificate-dataとclient-key-dataを用意する流れについて記載しました。
環境情報
- kubectl v1.23
CSRを発行する
新しいユーザ用に鍵とCSRをopensslコマンドで作成します。ちなみに冒頭で記載したclient-key-dataはtest.keyに相当します。
$ openssl genrsa -out test.key 2048 ...
$ openssl req -new -key test.key -out test.csr ... Common Name (eg, your name or your server's hostname) []:testuser ...
csrのCommonNameの箇所にはユーザ情報を特定する情報を入れます。
ここからは同CSRファイルをKuberntesクラスターに署名してもらう必要があるため、以下コマンドにてbase64でエンコーディングします。
$ cat test.csr | base64 -w 0 LS0t....LQo=
そしてこの情報をrequestの項目に入れて以下のYAMLを作成した上で
apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: test_kube spec: request: LS0t...tLQo= signerName: kubernetes.io/kube-apiserver-client usages: - client auth
適用することでcsrが承認待ち状態で生成されました。
$ kubectl apply -f testcsr.yaml certificatesigningrequest.certificates.k8s.io/test_kube created $ kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION test_kube 11s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Pending
尚、管理者と申請者が同じであれば以下コマンドにてSSL証明書が発行されます。
# openssl x509 -req -in test.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out test.crt
CSRを承認してCRTを発行する
csrの中身は以下のようなデータですが
# kubectl describe csr Name: test_kube Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"certificates.k8s.io/v1","kind":"CertificateSigningRequest","metadata":{"annotations":{},"name":"test_kube"},"spec":{"request":"LS0t...LQo=","signerName":"kubernetes.io/kube-apiserver-client","usages":["client auth"]}} ... Requesting User: kubernetes-admin Signer: kubernetes.io/kube-apiserver-client Status: Pending Subject: Common Name: testuser Serial Number: Organization: Default Company Ltd Country: XX Locality: Default City Events: <none>
管理者権限のユーザが以下コマンドでCSRを承認することで
# kubectl certificate approve test_kube certificatesigningrequest.certificates.k8s.io/test_kube approved
同csrリソースのstatus.certificateに値が格納されます。
そして、申請者側が同値をbase64でデコードするとBEGIN CERTIFICATE
で始まる証明書が取得できます。この証明書ファイルがclient-certificate-dataに当たります。
$ echo LS0tL...tCg== | base64 -d > test.crt
ちなみにopensslコマンドでCRTファイルの中身を見ると確かにkubernetesに署名されています。
$ openssl x509 -noout -issuer -in test.crt issuer= /CN=kubernetes $ openssl x509 -noout -subject -in test.crt subject= /C=XX/L=Default City/O=Default Company Ltd/CN=testuser
終わりに
同ファイルを利用して以下のように鍵を指定することでユーザ情報が
$ kubectl config set-credentials testuser --client-key=test.key --client-certificate=test.crt
Configに格納されてClusterにアクセスすることが可能となります。
$ kubectl config view apiVersion: v1 clusters: ... users: - name: testuser user: client-certificate: /home/test/test.crt client-key: /home/test/test.key
以上です。