KubernetesのCertificateSigningRequestを試す
GitHub: https://github.com/puppypepper/kind-playground/tree/main/examples/certificate-sigining-request
前提条件
CLIで以下を使うことができるようにしてください。
- `yq`
- `openssl`
事前にkindで作成されるデフォルトユーザーの認証認可を確認するのシナリオを確認することを推奨します。
CertificateSigningRequest確認シナリオ
kindで今回使用するclusterを作成する。
kind create cluster --config kind-config.yamlCSRに使用する秘密鍵を作成する。
openssl genrsa -out resources/csr-user.key 2048作成した秘密鍵を用いてCSRを作成する。
Common Name: `csr-user`
Organization: `csr-group`
openssl req -new -key resources/csr-user.key -out resources/csr-user.csr \
-subj "/CN=csr-user/O=csr-group"CSRをKubernetesリソースに合わせて整形する。
base64 < resources/csr-user.csr | tr -d '\n' > resources/csr-user.csr.b64kind: CertificateSigningRequestのmanifestに値を適用する。
yq -i '.spec.request = load_str("resources/csr-user.csr.b64")' manifests/csr.yamlKubernetesクラスタにmanifestを適用する。
kubectl apply -f manifests/csr.yamloutput
certificatesigningrequest.certificates.k8s.io/csr-user createdkubectlでリソースを確認する。
kubectl get csr csr-useroutput
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-user 76s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Pendingこの状態ではPendingとなっているためクライアント証明書を利用してkube-apiserverにアクセスすることはできない。
kindのdefaultユーザーとしてCSRのapproveを行う。
kubectl certificate approve csr-useroutput
certificatesigningrequest.certificates.k8s.io/csr-user approvedリソースの状態がPendingからApproved,Issuedに変わっていることを確認する。
kubectl get csr csr-useroutput
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-user 4m15s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Approved,Issuedリソースの詳細を確認し、status.certificateにクライアント証明書が作成されていることを確認する。
kubectl get csr csr-user -o yamloutput
...
status:
certificate: <Your Base64 encoded cert> 作成されたクライアント証明書をファイルとして保存する。
kubectl get csr csr-user \
-o jsonpath='{.status.certificate}' \
| base64 --decode > resources/csr-user.crtクライアント証明書の確認を行う。CSRを作成した際に設定したSubjectに対して証明書が発行されていることが確認できる。
openssl x509 -in resources/csr-user.crt -noout -textoutput
重要な部分を抜粋
...
Issuer: CN=kubernetes
Validity
Not Before: Jan 17 10:18:06 2026 GMT
Not After : Jan 17 10:18:06 2027 GMT
Subject: O=csr-group, CN=csr-user
...作成したユーザーをkubeconfigに登録する。
kubectl config set-credentials csr-user \
--client-certificate=resources/csr-user.crt \
--client-key=resources/csr-user.keyoutput
User "csr-user" set.作成したcsr-userとしてkubectlコマンドを利用する。
kubectl --user=csr-user auth whoamioutput
```text
ATTRIBUTE VALUE
Username csr-user
Groups [csr-group system:authenticated]
Extra: authentication.kubernetes.io/credential-id [X509SHA256=997c816e61503713c31e50575ab94aac542ccf668db57bf819076ce841c90a1b]作成したユーザーは特にClusterRoleBindingなどで権限を紐づけていないためPod一覧の取得なども実行することができない。
認可の適用に関しては別のシナリオで対応する。
```bash
kubectl --user=csr-user get pods ```
output
Error from server (Forbidden): pods is forbidden: User "csr-user" cannot list resource "pods" in API group "" in the namespace "default"kube-configファイルからcsr-userを削除する。
kubectl config unset users.csr-useroutput
Property "users.csr-user" unset.kind clusterを削除する
kind delete cluster --name certificate-signing-request