kubestronautへの道 ~CKS編 その8 killer coda「CertificateSigningRequests sign via API」~

tech article

今日覚えて帰ること

CSRリソース

CertificateSigningRequest リソース タイプを使用すると、クライアント(ユーザーや各リソース)は署名要求に基づいて X.509 証明書の発行を要求することができる。

CertificateSigningRequests sign via API

Create KEY and CSR

前回の記事と全く同じです。

kubestronautへの道 ~CKS編 その7 killer coda「CertificateSigningRequests sign manually」~
今日覚えて帰ること CSRってなに? 認証局(CA)に証明書を作ってもらうためのファイル 「公開鍵」「識別情報」「署名」で構成される 署名部分を除いたCSRの内容をハッシュ化し、それを秘密鍵で暗号化したものが「署名」 Certificate...

Signing via API

Create a K8s CertificateSigningRequest resource named 60099@internal.users and which sends the /root/60099.csr to the API.

Let the K8s API sign the CertificateSigningRequest.

Download the CRT file to /root/60099.crt .

Create a new context for kubectl named 60099@internal.users which uses this CRT to connect to K8s.


こちらは証明書を作成するまでの手順が前回と違います。それ以降は同じです。

まずはCSRファイルを base64 でエンコードします。
このとき、改行なしに出力したいので -w 0 オプションを使います。

controlplane $ cat 60099.csr | base64 -w 0
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ3FUQ0NBWkVDQVFBd1pERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeApJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERWRNQnNHQTFVRUF3d1VOakF3Ck9UbEFhVzUwWlhKdVlXd3VkWE5sY25Nd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFEQWlHVmh6L05iblZwOExraXpsUy9WSGpiZnEwTDNHR1BYYzQ3YzdUTkRIZ0ltQ1lIRld6ZEl4T2NqbXFORwpOcWt3NVVpWnBWTndVQmlGOUFMY3hrK3ZxOVFpSTNKeDVhWHNLNDVKWmhJVU5qbnRzOFpESnNGOHh6NDFKZ0NWCjNiQk9hOWoya0RmeVNDeit5dUt5Z1ZwQXVyRFlxWUhFUEthNFd5YU9YcFdkK3JOMkd3bmNSaDBGOVFMMzZuOHUKOGxiazZkZUc3UmJjU3ZPT1hsNkk1dEhRSkFCeHRlekQxU3NtSXBQaTZnb1l0ditOUm1VOXhvTnQvUDJNdjJXegpzNlBnTDdmLzdjZUZMOTBCaTJUK0dvZkVtY202L0xHclIwc05EZXdLRTMrMExoay9GMGZpdGV4Ulo5K2habW9jCncvWWcydFZhTVRHUmMwOFNHbVJ3RmU0bkFnTUJBQUdnQURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUhMYjIKck5yUWRjcm5HZnF2UDdXK3RjcXJhZnFoRU9oRzZjVUVYYmtjNzhiRmZLR29JSmw0ZzduRENVTWFZRmVzSlF0Ugo1ZG1BdFZMUUhaODV2WkFHeldTRGVPdC9RNWhSdzFBVkMycEpwSHZMVENqL1JINjBkcThqQ0VTMWV0aEgwTHRECkRrTEI3SGFSR3JYSVg2YmYwR0F0OFUvdDNhWGs2SXhGYkxsVnlxMDNYSm5hNjVoWjl4dTJzVHJVdjVuVlRCUVIKNUJOT1dPeTM3SUl6YnNxWE5RdmhkR2drMmNPNHgwa2huaVl0cW1EZWd3WVhTTEJsRlFuL01uQy9Cby8vNDBzOAoxMkhsb2Nka1UwWEtIRUhzMy9weTFJWHcwSVBsVTBkdU1KRzkybDZKYmpCSWtqQ1lWUnZMUmZ6akczREZyKzNrClBQeFlJWG1yMnBYM1VUWTlhUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=controlplane $ 

kubernetes公式には
cat myuser.csr | base64 | tr -d “\n”
という方法が書いてあります。こちらでもOKです。

続いて、CSR(Kubernetesのリソース)を作成します。

Certificates and Certificate Signing Requests
Kubernetes certificate and trust bundle APIs enable automation of X.509 credential provisioning by providing a programmatic interface for clients of the Kuberne...
controlplane $ vi csr.yaml
controlplane $ cat csr.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: 60099@internal.users # ADD
spec:
  groups:
  - system:authenticated
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ3FUQ0NBWkVDQVFBd1pERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeApJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERWRNQnNHQTFVRUF3d1VOakF3Ck9UbEFhVzUwWlhKdVlXd3VkWE5sY25Nd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFEQWlHVmh6L05iblZwOExraXpsUy9WSGpiZnEwTDNHR1BYYzQ3YzdUTkRIZ0ltQ1lIRld6ZEl4T2NqbXFORwpOcWt3NVVpWnBWTndVQmlGOUFMY3hrK3ZxOVFpSTNKeDVhWHNLNDVKWmhJVU5qbnRzOFpESnNGOHh6NDFKZ0NWCjNiQk9hOWoya0RmeVNDeit5dUt5Z1ZwQXVyRFlxWUhFUEthNFd5YU9YcFdkK3JOMkd3bmNSaDBGOVFMMzZuOHUKOGxiazZkZUc3UmJjU3ZPT1hsNkk1dEhRSkFCeHRlekQxU3NtSXBQaTZnb1l0ditOUm1VOXhvTnQvUDJNdjJXegpzNlBnTDdmLzdjZUZMOTBCaTJUK0dvZkVtY202L0xHclIwc05EZXdLRTMrMExoay9GMGZpdGV4Ulo5K2habW9jCncvWWcydFZhTVRHUmMwOFNHbVJ3RmU0bkFnTUJBQUdnQURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUhMYjIKck5yUWRjcm5HZnF2UDdXK3RjcXJhZnFoRU9oRzZjVUVYYmtjNzhiRmZLR29JSmw0ZzduRENVTWFZRmVzSlF0Ugo1ZG1BdFZMUUhaODV2WkFHeldTRGVPdC9RNWhSdzFBVkMycEpwSHZMVENqL1JINjBkcThqQ0VTMWV0aEgwTHRECkRrTEI3SGFSR3JYSVg2YmYwR0F0OFUvdDNhWGs2SXhGYkxsVnlxMDNYSm5hNjVoWjl4dTJzVHJVdjVuVlRCUVIKNUJOT1dPeTM3SUl6YnNxWE5RdmhkR2drMmNPNHgwa2huaVl0cW1EZWd3WVhTTEJsRlFuL01uQy9Cby8vNDBzOAoxMkhsb2Nka1UwWEtIRUhzMy9weTFJWHcwSVBsVTBkdU1KRzkybDZKYmpCSWtqQ1lWUnZMUmZ6akczREZyKzNrClBQeFlJWG1yMnBYM1VUWTlhUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
controlplane $ 


このファイルを apply し状態を確認します。
CSRを作った時点ではまだ approve されておらず pending 状態になっています。

controlplane $ k -f csr.yaml create
certificatesigningrequest.certificates.k8s.io/60099@internal.users created

controlplane $ k get csr # pending
NAME                   AGE   SIGNERNAME                                    REQUESTOR                  REQUESTEDDURATION   CONDITION
60099@internal.users   7s    kubernetes.io/kube-apiserver-client           kubernetes-admin           <none>              Pending
csr-6fbxw              28d   kubernetes.io/kube-apiserver-client-kubelet   system:node:controlplane   <none>              Approved,Issued

kubectl certificate approve <CSR name> でCSRを承認します。

controlplane $ k certificate approve 60099@internal.users
certificatesigningrequest.certificates.k8s.io/60099@internal.users approved

controlplane $ k get csr # approved
NAME                   AGE   SIGNERNAME                                    REQUESTOR                  REQUESTEDDURATION   CONDITION
60099@internal.users   32s   kubernetes.io/kube-apiserver-client           kubernetes-admin           <none>              Approved,Issued
csr-6fbxw              28d   kubernetes.io/kube-apiserver-client-kubelet   system:node:controlplane   <none>              Approved,Issued

この操作によってCSRに証明書が発行されます。
CSRリソースのstatus.certificateにbase64でエンコードされた証明書が存在します。
デコードしてfileとして出力しましょう。

controlplane $ k get csr 60099@internal.users -ojsonpath="{.status.certificate}" | base64 -d > 60099.crt

ちなみに全容はというとこんな感じです。

controlplane $ k get csr 60099@internal.users -o yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  creationTimestamp: "2024-08-01T13:58:09Z"
  name: 60099@internal.users
  resourceVersion: "1730"
  uid: ddf41a69-c88e-4dac-8146-6e18001d28b5
spec:
  groups:
  - kubeadm:cluster-admins
  - system:authenticated
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ3FUQ0NBWkVDQVFBd1pERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeApJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERWRNQnNHQTFVRUF3d1VOakF3Ck9UbEFhVzUwWlhKdVlXd3VkWE5sY25Nd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFDNHdFVHE5Smg1RkNQY2wwUmNjblRQd3dCaGZTQWNBalpVNWRsQ00rczhQdFJ0ejdNaEhMMnZ6QkFvUzdiNgozd0EwK3M4ZVFYM2VRZFIrU1pSc0cra0Vzd3E3bFJFVDAvTHg5UFBQODl5Uy8rZzkxYm9kQzlOL1VNM3JWRzFVCmJmbGU1YjVNenJCRGVScThBcWFXeERjMjcwK2tvRjM1NStSZEt4dW5kejNxRVBBVi8wbWhnSDlOMTdNYXltSzEKclg5RFlWa0hQK3AwMjdWZjN6YXZvdi81Nllad2VnbGZQQWp1VXBGRGZIclRnWVNFd2VDNWdsdjZ6UTdCVm5vMApsdlNIek8za2cwUUN1aGFrQnRmRUx4NHRteDlwYTlUc01zektjN0J3YkozQklsR2kvMjNsS0djdXlIUmNNa3hmCjNlRFRRN3Bubkxwb1JJVDZTUDc2UVh2ckFnTUJBQUdnQURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWlvM1EKOG11eWhqMzZPdVNXTStDOXowU2c4dHJZa2xwNUJYYTJHa1hiMWlwZThmaE9zTk5Ja3crOWxiRytOWWMyUENIRQphUHlnSkFXV2Q5bzJGMG4xMFExRHdLODdMaFBibjBobDVyRlNTakJsQVpiZzBLbk8wYkpXNXZuaExLZlJiVWRtCk4ybWZDQ3dtMS9NZUpZRW9wRWt3OU0rTTl0cFlkaUhlZTVEWUw2eVZPK21zbFhtNW1qQ2pqNGloS2V3ZnkrM1IKUG53TDk1Tit5WjZpRGtsSzZSLzFLdDVVNHllNEQyZlFGVmo1NWtvelBhWGhJM2p0RUxRL2xBc0k5RENxSEZ3ago5VVBUbnh6N0UwNWgycGk4S1RGZnlKc2tNMnpYVUVIdGZ3d2l1cWptR3Z4eFBsZnZLNTd5V25zNFA1QThnbGRzClNZUUF0L2NiWGM5ZTdiQWt0Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
  username: kubernetes-admin
status:
  certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTVENDQWpHZ0F3SUJBZ0lRTHdOeVJGK0o4a3BwNktWcldqNUpMakFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwcmRXSmxjbTVsZEdWek1CNFhEVEkwTURnd01URXpOVE14TmxvWERUSTFNRGd3TVRFegpOVE14Tmxvd1pERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WCkJBb1RHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERWRNQnNHQTFVRUF3d1VOakF3T1RsQWFXNTAKWlhKdVlXd3VkWE5sY25Nd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0d0VUcQo5Smg1RkNQY2wwUmNjblRQd3dCaGZTQWNBalpVNWRsQ00rczhQdFJ0ejdNaEhMMnZ6QkFvUzdiNjN3QTArczhlClFYM2VRZFIrU1pSc0cra0Vzd3E3bFJFVDAvTHg5UFBQODl5Uy8rZzkxYm9kQzlOL1VNM3JWRzFVYmZsZTViNU0KenJCRGVScThBcWFXeERjMjcwK2tvRjM1NStSZEt4dW5kejNxRVBBVi8wbWhnSDlOMTdNYXltSzFyWDlEWVZrSApQK3AwMjdWZjN6YXZvdi81Nllad2VnbGZQQWp1VXBGRGZIclRnWVNFd2VDNWdsdjZ6UTdCVm5vMGx2U0h6TzNrCmcwUUN1aGFrQnRmRUx4NHRteDlwYTlUc01zektjN0J3YkozQklsR2kvMjNsS0djdXlIUmNNa3hmM2VEVFE3cG4Kbkxwb1JJVDZTUDc2UVh2ckFnTUJBQUdqUmpCRU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQXdHQTFVZApFd0VCL3dRQ01BQXdId1lEVlIwakJCZ3dGb0FVNUx2eEFObTlYV21QUkhKTGx4bHM0UkxXTkRnd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnRUJBQVVBMElkdHA3RGhpeGlCTTBhV0lPOW56ME9TLzFWSlJXdGFzQ1BvQ1NUaXFpNnkKRGMrSFB2THBUVzVXVzZxUHg0REVYemlzVnRXRzl4Ui91UHNwbjFqZ0hBN21IazB6VEVpa3JFOWlDQVI2NnVSawp0aEgwOU9aQ2txNFpBQlpXSXVpWkFEV2EyeHlYT1JZemJ2QVhJb2ZPMHpYamFQWDFKTTVtY2Y2WmMyYTYwL3Y0CktBMkQzOTZxeTVCT3diTjNTUWNEeWNlMit1V2JCU1pjSUdzUGozemJrSTBjMGRTdE5sS1hCbGJYTzZhRVBCZloKNXMwazBEdUJYYUNoTWtkNlloU0I3OEtUWXI2Z1FnNVREeFI0aDV6dGFTL3MyQzQvMmhkRjVnRitBdU8wcUkybgpGSmhlZENiWmkyamo0THdKVjVyMU4zUGNSbE5RRmJjN051QlhybDQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  conditions:
  - lastTransitionTime: "2024-08-01T13:58:16Z"
    lastUpdateTime: "2024-08-01T13:58:16Z"
    message: This CSR was approved by kubectl certificate approve.
    reason: KubectlApprove
    status: "True"
    type: Approved

このあとは次60099@internal.users が kubectl を使えるように context を設定していきます。
ここからは前回と同じなので前回の記事を読んでください。

コマンドで作る方が楽な気がします。
kube-apiserverを経由して作るメリットって何かあるんですかね?

タイトルとURLをコピーしました