K8s身份认证策略:
- x.509客户端证书认证
- 静态令牌文件认证
一、静态令牌文件认证
1. 静态令牌认证的基础配置
令牌信息保存于文本文件中
- 文件格式为CSV,每行定义一个用户,由“令牌、用户名、用户ID和所属的用户组”四个字段组成,用户组为可选字段
格式:token,user,uid,“group1,group2,group3”
如 3e6745.42c03381b4162e8e,jack,998,kubeadmin - 由kube-apiserver在启动时通过–token-auth-file选项加载
- 加载完成后的文件变动,仅能通过重启程序进行重载(kubelet会扫描到文件发生变化并重启apiserver),因此,相关的令牌会长期有效
- 客户端在HTTP请求中,通过“Authorization Bearer TOKEN”标头附带令牌令牌以完成认证
- 配置加载完成以后,kubelet会监控到配置文件发生变化
1.2 静态令牌认证配置示例
1.2.1 生成token
root@k8s-master01:/etc/kubernetes/manifests# echo "$(openssl rand -hex 3).$(openssl rand -hex 8)"
0d62b3.afc3dd15eac1b5fd
root@k8s-master01:/etc/kubernetes/manifests# echo "$(openssl rand -hex 3).$(openssl rand -hex 8)"
f2b630.7a6661ae816edf9b
root@k8s-master01:/etc/kubernetes/manifests# echo "$(openssl rand -hex 3).$(openssl rand -hex 8)"
947a13.bea6f44f252a6e81
1.2.2. 生成static token文件
root@master1:~# cd /etc/kubernetes/
root@master1:/etc/kubernetes# mkdir auth
root@master1:/etc/kubernetes/auth# cat /etc/kubernetes/auth/token.csv
0d62b3.afc3dd15eac1b5fd,tom,1001,kubeusers
f2b630.7a6661ae816edf9b,jerry,1002,kubeusers
947a13.bea6f44f252a6e81,park,999,kubeadmin
配置kube-apiserver加载该静态令牌文件以启用相应的认证功能
vi /etc/kubernetes/manifes/kube-apiserver.yaml
增加如下三处配置(建议先备份原文件,修改备份文件后覆盖原文件,因kubelet会扫描原文件配置)
验证:
kubectl --server https://172.29.7.2:6443/ --token='0d62b3.afc3dd15eac1b5fd' --certificate-authority=/etc/kubernetes/pki/ca.crt get pods
2. x509数字证书认证API Server
1.创建证书签署请求
2.由kubernetes CA签署证书
3.用户使用证书认证到API Server
方式一:
步骤:
1.创建证书签署请求
openssl genrsa -out mason.key 2048
openssl req -new -key mason.key -out mason.csr -subj "/CN=mason/O=developers"
(CN后面为用户名,O后面为用户所属的主)
2.创建CertificateSignRequest资源
cat mason.csr |base64 |tr -d ‘\n’ 生成request字段所需要的csr编码内容
kubectl apply -f certificatesignrequest-mason.yaml
certificatesignrequest-mason.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: mason
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ2FqQ0NBVklDQVFBd0pURU9NQXdHQTFVRUF3d0ZiV0Z6YjI0eEV6QVJCZ05WQkFvTUNtUmxkbVZzYjNCbApjbk13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZSaVphbXppczg2NjRNdGtRCnVxb0RZR01uK0F0UFRXMTNNdzB4VzE2VFczaGVjQzJuNDhIekVqTktoRjRSVW9UMGJTQmZUWXNIZHBVTU5Uak4KcVZyQWlBT2gyT3hSMHRZS2dMbmFyUGh6dVE3aDJ2M2tKU1FpZ1Q5bGtHTEtDQzFwcERML0QrMTV0eG50bXpMaApxTUZ1U01DL3BTdUhQYTN1NzhvTldXSGpRVmN1M3d6UkhoRTFibWNMOVVvdWtiZGh1V0dIMlVtN211dmNwQUJXCjFDRDZGek1vQzFmdjNpam93OG0yaFUxNEVzZkFhaVBlU2J1VEtUMW9vUkJxd0J6UDRDV3MzVVd3cUhHcHB3cHMKVDhOeFY2RmZGYkQ2K3pxcFNMVy8rbHc5VHhDZWlrTmtUb1RnM0IwajBYSTlreWpvOFliOFdDMUpuTG5pNXZWVgo3K3pGQWdNQkFBR2dBREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBSmFoTE41V00yemZNeWFxNGFKelNsS253CnlhL3MwZUcxR1JkbzdRUXVLcmNkcFdmRzk0b0xPNkcyKzZBakVzNXhZVSt2amVha0gxcjRVRUhiN3B2WDRWcy8KazhublVFV3hwUkIvQzdQZ3ZlMnBKd2pyZHhlMEJrVnM0aEd3TnByazhaK1FtdFhGUGNPOWJGUFN4aUhNdm12egoydkk0MVZ6eGV4YXZYWG5PWnJuT2w1YmlhWGNRSkZnUjhlY2VYcFJtZzVrM09NMzZITk9PdmV6dUw5WE94cG5lCnE0ZWZTdEU0ZFlYQlRtaGtMMUdjd1lPbzZxM0luN3BXL2FEMFBRbktqQWhkU2ExWmRHRVFzMS9OOFZDQXNJK3IKWGpxLzQzeElreEloNEliajErZjh4NmdyUS9Hbkt0MCsyWXF5K21NMW5Zc0NScTU3S3ZhRDBvQmVPc24vZXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 864000 # ten days
usages:
- client auth
说明: request后面为客户端证书签署请求文件(CSR)的base64编码内容
root@k8s-master01:~/learning-k8s-master/examples/authn_and_authz/certificate-sign-request-demo# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
mason 7s kubernetes.io/kube-apiserver-client kubernetes-admin 10d Pending
3.签署证书
root@k8s-master01:~/learning-k8s-master/examples/authn_and_authz/certificate-sign-request-demo# kubectl certificate approve mason
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
mason 119s kubernetes.io/kube-apiserver-client kubernetes-admin 10d Approved,Issued
4.获取证书,保存为证书文件
kubectl get csr mason -o jsonpath='{.status.certificate}' |base64 -d > mason.crt
5.验证
curl -k -E ./mason.crt --key mason.key https://172.29.7.1:6443
-k 表示不验证服务器端证书
方式二:
步骤:
- 创建证书签署请求
openssl genrsa -out tom.key 2048
openssl req -new -key tom.key -out tom.csr -subj "/CN=tom/O=system:masters"
(CN后面为用户名,O后面为用户所属的主,system:masters组拥有管理员权限)
- 签署证书
openssl x509 -req -days 30 -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -in ./tom.csr -out ./tom.crt
- 验证
curl -k -E ./tom.crt --key ./tom.key https://172.29.7.1:6443/api/v1/namespaces/default/pods
或者
scp -r tom.crt tom.key 172.29.7.3:/tmp
kubectl --server https://172.29.7.1:6443/ --client-certificate=/tmp/tom.crt --client-key=/tmp/tom.key --certificate-authority=/etc/kubernetes/pki/ca.crt get pods
kubeconfig基础
kubeconfig是Yaml格式的文件,用于存储用户身份认证信息,以便于客户端加载并认证到API Server
kubeconfig 保存有认证到1至多个kubernetes集群的相关配置信息,并允许管理员在各配置间灵活切换
clusters: kubernetes集群访问断点列表
users: 认证到API Server的身份凭据列表
contexts: 将每一个user同可认证到的cluster建立关联的上下文列表
客户端程序加载kubeconfig的途径和次序
- –kubeconfig 选项
- KUBECONFIG环境变量: 其值是包含有kubeconfig文件的列表
- 默认路径: $HOME/.kube/config
kubectl加载认证信息的方式:
scp /etc/kubernetes/admin.conf $HOME/.kube/config # master主节点的admin.conf配置同步到其他节点便可以使kubectl通过kubeconfig文件来认证到APIServer
kubectl get pods
或者
export KUBECONFIG='/etc/kubernetes/admin.conf'
kubectl get pods
或者
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods
cat /etc/kubernete/admin.conf
openssl x509 -in kubernetes-admin.crt -text 查看证书内容
设置集群
kubectl config set-cluster mykube --embed-certs=true --certificate-authority=/etc/kubernetes/pki/ca.crt --server="https://172.29.7.1:6443"
kubectl config view --raw 查看原始格式(包含证书内容)
配置用户
kubectl config set-credentials tom --token='0d62b3.afc3dd15eac1b5fd'
kubectl config view --raw
kubectl config set-credentials --client-certificate=mason.crt --client-key=mason.key --embed-certs=true
kubectl config view --raw
设置集群上下文
kubectl config set-context tom@mykube --cluster=mykube --user=tom
kubectl config set-context mason@mykube --cluster=mykube --user=mason
切换使用上下文
kubectl config get-contexts
kubectl config use-context mason@mykube
kubectl get pods
kubectl get pods --context=tom@mykube
以上操作均使用默认的kubeconfig配置文件路径,也可以指定手动指定 --kubeconfig=/root/mykube.conf 将配置文件生成到指定位置,但是需要在执行kubectl 命令时指定–kubeconfig=/root/mykube.conf,为了方便可以将配置文件加入环境变量
export KUBECONFIG='/root/kube.conf:/root/.kube/config'
kubectl config view