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

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

Loading

Facebook评论