(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】新規ユーザのClusterアクセス用にSSL証明書を用意する流れ

スポンサーリンク

はじめに

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

以上です。