CKA [Security] – 实践自行创建cert以便连接K8s Cluster
准备安装好kubectl
1. 需要安装kubectl, 可以参考官方文档 (macos)
https://kubernetes.io/docs/tasks/tools/install-kubectl-macos/#install-kubectl-on-macos
2. 创建.kube目录和创建config文件
mkdir ~/.kube
nano ~/.kube/config
3. 由于还没set好kube config所以就会有以下的报错
kubectl get pods

创建Private Key和CSR
1. 创建cert目录
mkdir /root/cert
cd /root/cert
2. 使用openssl创建private key和csr证书
openssl genrsa -out client.key 2048
【可以放在做个group当中】
openssl req -new -key client.key -out client.csr -subj "/CN=kiat/O=group1/O=group2"
【也可以不放在任何group】
openssl req -new -key client.key -out client.csr -subj "/CN=kiat"
默认情况下,Kubernetes 会把证书里的 Subject 字段映射为:
- CN(Common Name)→
user
名称 - O(Organization)→ 一个或多个
group
名称
准备好Kubernetes Signing Request Yaml
1. 使用命令行把生成的csr证书给encode成base64格式
cat client.csr | base64 | tr -d '\n'

输出结果:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ2FEQ0NBVkFDQVFBd0l6RU5NQXNHQTFVRUF3d0VhMmxoZERFU01CQUdBMVVFQ2d3SmJYbERiMjF3WVc1NQpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhlWm5PMFAyMk03eUp0ZFJGOUFuCnF3akZlVG5jbkR2WXU3ditqWGpvNllSWkhxbkJlWkwzd2drYjlWcEhoejI5VVRucTA0WGZRQnIxUUtBV1NJamQKV3lJN3BkbkRpS0U4OGtwR0tocndOcGlTTGgzaWRISHZyeXFUaUEvTGJrT1ltYU9GeXY0WFZvYVB3c2xUeTVuMQpkTHhJYldwWk5UL1EzNDk1SDNkeTZqN0VUdUpXWVBYVDU5S1hmRnh6WHd0djgvT3RmUXRCSVV0NkxDUmZEMEtmClBBWktzdkZiT0x3WXVBemZNN1A3SFI2SHNsc3ZJakNHK213VUkyTTlPRFlpaXB4alNYdWhDMTRwang0MHE1eisKSm5SYVhGdys5NlB2RmpNRnpvT3NHT2xIaFlaeHdpR3NFUnV3ZTNQeE4xSTNIbExDV2piMFd5NCtZV1JwTG9HNgo5UUlEQVFBQm9BQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSUZ0VXBTS0lLd0lNektSMTdIRzdLWWNhNGYzCmlFNysvRnkvc0VDOW05V2s4OTdIVllOQXVIQ1M1RVAxR2R2RGpQUXRTQ2ZGVTVCc1BOZUxYUU1LODk0djYvZzUKZVhoWWhKaW1pVWJnNnBwSk9VTFMrY1dGcHlId3ZNNjJGeldmY2paOTA5UUQzSEFjdE9qWnJZUHlJK1F0dzYrVwpTREpvWDI1dlRUUnpYMkdBUkZBSjVoMFpWZFpsUVNSa00wSDdaa0gwNVdpWER4THlDK0ZXQyt6RmhIMlo0TENMCkUyWGFWdFgxZnFJZlRyUWVkeEU0Y2t5T0FhL2NsckVnbWowR1hTNUx3K0xiRERObWw4Y2h2a3BGTWNROWVSczAKS0xaL09pNVQvNCswWFBHVGROWUUzZkduMHBBM3djUmYwam1DWjlzR2I2cFJSZG5jdk5GYTFieFdEanc9Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
2. 创建Kubernetes Signing Request的yaml文件
nano csr-requests.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: kiat-csr
spec:
groups:
- system:authenticated
request: 【把你的CsrBase64Encoded放在这里】
signerName: kubernetes.io/kube-apiserver-client
usages:
- digital signature
- key encipherment
- client auth
在Kubernetes Cluster当中创建Signing Request
1. 首先需要使用master账号登入到kubernetes cluster, 这里就不详细解说了
2. 使用命令行创建signing request
kubectl apply -f csr-requests.yaml

3. 使用命令行批准signing request的请求
kubectl certificate approve kiat-csr

从Kubernetes Cluster下载CRT证书,并且部署到本机
1. 使用kubectl命令行, 从Kubernetes Cluster当中获取kiat-csr的证书,然后把证书进行base64 decode 最后才存到kiat.crt文件当中
kubectl get csr kiat-csr -o jsonpath='{.status.certificate}' | base64 -d > kiat.crt
2. 使用这个命令是在本机设置了登入信息进kubeconfig文件当中
kubectl config set-credentials kiat --client-certificate=kiat.crt --client-key=client.key
3. 在本机的kubeconfig创建新的context 把cluster name和本地设置好的user给绑定
kubectl config set-context kiat-context --cluster [YOUR-CLUSTER-HERE] --user=kiat
[YOUR-CLUSTER-HERE] 其实就是从你原本的kubeconfig是连接到哪个cluster而定,比如我的cluster name就是如下图获取的


4. 使用这个命令行测试连接cluster并且获取pod
kubectl --context=kiat-context get pods
注意:由于这个user还没绑定rolebinding,所以是无权获取pod的

5. 使用这个命令行可以查看总共创建了多少个CSR
kubectl get csr

创建RoleBinding绑定User
1. 创建role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list"]
kubectl apply -f role.yaml
2. 创建role binding 把role和user做绑定
kubectl create rolebinding testbinding --role=pod-reader --user=kiat

最终测试
1. 我们在kuberntes cluster创建好了csr,并且approve了csr
2. 已经在本机设置好了kubeconfig 使用crt 和 private key 连接 kubernetes cluster
3. 已经在本机的kubeconfig 创建new context 绑定了本机的用户和cluster
4. 已经创建了role,然后使用role binding绑定了用户的role权限
【测试1】
使用以下的命令行获取default namespace的pod, 由于default namespace底下是没有pod的,所以是无资源可获取
kubectl --context=kiat-context get pods

【测试2】
使用以下的命令行获取kube-system namespace的pod, 由于对于kube-system namespace是没有权限的,所以是无法获取任何pod
kubectl --context=kiat-context get pods -n kube-system
