Kubernetes认证、鉴权与准入控制(一)

K8s身份认证策略:

  1. x.509客户端证书认证
  2. 静态令牌文件认证

一、静态令牌文件认证

1. 静态令牌认证的基础配置

令牌信息保存于文本文件中

  1. 文件格式为CSV,每行定义一个用户,由“令牌、用户名、用户ID和所属的用户组”四个字段组成,用户组为可选字段
    格式:token,user,uid,“group1,group2,group3”
    如 3e6745.42c03381b4162e8e,jack,998,kubeadmin
  2. 由kube-apiserver在启动时通过–token-auth-file选项加载
  3. 加载完成后的文件变动,仅能通过重启程序进行重载(kubelet会扫描到文件发生变化并重启apiserver),因此,相关的令牌会长期有效
  4. 客户端在HTTP请求中,通过“Authorization Bearer TOKEN”标头附带令牌令牌以完成认证
  5. 配置加载完成以后,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 表示不验证服务器端证书

方式二:
步骤:

  1. 创建证书签署请求
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组拥有管理员权限) 
  1. 签署证书
openssl x509 -req -days 30 -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -in ./tom.csr -out ./tom.crt
  1. 验证
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的途径和次序

  1. –kubeconfig 选项
  2. KUBECONFIG环境变量: 其值是包含有kubeconfig文件的列表
  3. 默认路径: $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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值