K8s进阶篇-细粒度权限控制
集群是否启用RBAC
grep -C3 /usr/lib/systemd/system/kube-apiserver.service |grep authorization-mode
API Server目前支持以下几种授权策略
AlwaysDeny:表示拒绝所有请求,一般用于测试。
AlwaysAllow:允许接收所有请求。如果集群不需要授权流程,则可以采用该策略,这也是Kubernetes的默认配置。
ABAC(Attribute-Based Access Control):基于属性的访问控制。表示使用用户配置的授权规则对用户请求进行匹配和控制。
Webhook:通过调用外部REST服务对用户进行授权
RBAC:Role-Based Access Control,基于角色的访问控制。
Node:是一种专用模式,用于对kubelet发出的请求进行访问控制
k8s认证/授权/准入控制
认证
认证支持多种插件
(1)令牌(token)认证:
双方有一个共享密钥,服务器上先创建一个密码,存下来,客户端登陆的时候拿这个密码登陆即可,这个就是对称密钥认证方式;k8s提供了一个restful风格的接口,它的所有服务都是通过http协议提供的,因此认证信息只能经由http协议的认证首部进行传递,这种认证首部进行传递通常叫做令牌;
(2)ssl认证:
对于k8s访问来讲,ssl认证能让客户端确认服务器的认证身份,我们在跟服务器通信的时候,需要服务器发过来一个证书,我们需要确认这个证书是不是ca签署的,如果是我们认可的ca签署的,里面的subj信息与我们访问的目标主机信息保持一致,没有问题,那么我们就认为服务器的身份得到认证了,k8s中最重要的是服务器还需要认证客户端的信息,kubectl也应该有一个证书,这个证书也是server所认可的ca签署的证书,双方需要互相认证,实现加密通信,这就是ssl认证
授权
如果用户通过认证,那么什么权限都没有,需要一些后续的授权操作,如对资源的增删该查等,kubernetes1.6之后开始有RBAC(基于角色的访问控制机制)授权检查机制。
ServiceAccount(服务账号)
User account(用户账号)
准入控制
一般而言,准入控制只是用来定义我们授权检查完成之后的后续的其他安全检查操作的,进一步补充了授权机制,由多个插件组合实行,一般而言在创建,删除,修改或者做代理时做补充;
K8s集群添加useraccount和serviceaccount
生成证书签名文件
cd /etc/kubernetes/pki/
openssl genrsa -out lucky.key 2048
生成证书key
openssl req -new -key lucky.key -out lucky.csr -subj "/CN=lucky"
生成证书
openssl x509 -req -in lucky.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out lucky.crt -days 3650
Kubeconfig添加用户
在kubeconfig下新增加一个lucky这个用户把lucky这个用户添加到kubernetes集群中,可以用来认证apiserver的连接
kubectl config set-credentials lucky --client-certificate=./lucky.crt --client-key=./lucky.key --embed-certs=true
kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky
切换到lucky这个用户
kubectl config get-contexts-------查看集群账号
kubectl config current-context----查看集群当前账号
kubectl config use lucky@kubernetes---切换账号
账号授权
把user这个用户通过rolebinding绑定到clusterrole上,授予权限,权限只是在lucky这个名称空间有效把lucky这个用户通过rolebinding绑定到clusterrole上
kubectl create rolebinding lucky -n lucky --clusterrole=cluster-admin --user=lucky
添加普通用户
useradd lucky
cp -ar /root/.kube/ /home/lucky/
chown -R lucky.lucky /home/lucky/
su - lucky
使用kubeconfig和token访问集群
kubectl命令访问集群时,默认情况下在$HOME/.kube目录下寻找名为config的配置文档,配置文档中包含集群 API 地址、端口号、证书等,kubectl 据此建构访问集群的上下文。
准备好证书请求文档
定义集群用户上下文
制作 kubeconf 主要有三步:
为配置文档添加集群信息
为配置文档添加用户信息(token 访问可忽略)
为配置文档添加上下文
输入以下命令,将群集详细信息添加到配置文档中:
kubectl config --kubecnotallow=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
kubectl config set-cluster kubernetes
--certificate-authority=/etc/kubernetes/cert/ca.pem
--embed-certs=true
--server=https://172.16.200.100:8443
--kubecnotallow=config-demo.kubeconfig
将用户认证详细信息添加到配置文档中(如果使用 token 访问可忽略此步骤):
kubectl config --kubecnotallow=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
kubectl config set-credentials devuser-sa-key
--client-certificate=/etc/kubernetes/cert/devuser-sa.pem
--client-key=/etc/kubernetes/cert/devuser-sa-key.pem
--embed-certs=true
--kubecnotallow=devuser-sa.kubeconfig
将上下文详细信息添加到配置文档中:
kubectl config set-context kubernetes-dev
--cluster=kubernetes
--user=devuser-
--namespace=dev
--kubecnotallow=config-demo.kubeconfig
# 设置上下文参数
kubectl config set-context kubernetes-test
--cluster=kubernetes
--user=devuser
--namespace=test
--kubecnotallow=config-demo.kubeconfig
通过token令牌登陆dashboard界面
[root@master01 .kube]# kubectl create namespace lucky 创建名称空间
namespace/lucky created
[root@master01 .kube]# kubectl create serviceaccount lucky-admin -n lucky --创建sa
serviceaccount/lucky-admin created
[root@master01 .kube]# kubectl create rolebinding lucky-admin -n lucky --clusterrole=cluster-admin --serviceaccount=lucky:lucky-admin -----创建servicebindings
rolebinding.rbac.authorization.k8s.io/lucky-admin created
[root@master01 .kube]# kubectl get secret -n lucky
NAME TYPE DATA AGE
default-token-kr6h5 kubernetes.io/service-account-token 3 71s
lucky-admin-token-rj449 kubernetes.io/service-account-token 3 60s
[root@master01 .kube]# kubectl describe secret lucky-admin-token-rj449 -n lucky
Name: lucky-admin-token-rj449
Namespace: lucky
Labels: <none>
Annotations: kubernetes.io/service-account.name: lucky-admin
kubernetes.io/service-account.uid: 57a4e386-8bf5-4a95-ac21-1a6c826300a1
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1371 bytes
namespace: 5 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlNnZHZuMVdPTjVhaklzSFdFNVBkeExCWGNYamRtRnowN25uVmtPQjFKZ0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJsdWNreSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJsdWNreS1hZG1pbi10b2tlbi1yajQ0OSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJsdWNreS1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU3YTRlMzg2LThiZjUtNGE5NS1hYzIxLTFhNmM4MjYzMDBhMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpsdWNreTpsdWNreS1hZG1pbiJ9.doThTLo_k6mKtIRID4hu6Y2A0iE2jY_RBmnPa2FJJ-PKfhCKNFDae1uvdM_dpasaHN8g9Eh3Tz5-pFOKefvuyjo4pKCaVsJ3v0mPBLXD7LGKZeWLEiQdAMq3XbHR5kyfzljGKhyN9eexngTGTm3eR08u2ppVThjd-kQZzJUiKya3ifiWpOeYM1GMPeJeRWSSXXd3q73UHC93Alp5iRMEPKrItluOpyWH3DYbCipLFYEp2OURgeHwsJ6gJz23WFD1MCM6FO6pNIBgRWmuY2EntmNH1RnQ0SYoP4s-VmwRfxr6k_IVztToyiTG5RDGFBkDiyycwtJxQ8O-cWKTbQlrWg
通过dashboard登录界面进行创建pod的操作
apiVersion: v1
kind: Pod
metadata:
name: lucky-pod
namespace: lucky
spec:
containers:
- name: lucky
image: nginx
通过kubeconfig登陆dashboard
[root@master01 ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.211.200:8443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: admin
name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
创建账号
kubectl create serviceaccount lucky-admin -n lucky
kubectl get secret -n lucky 获取账号的secret信息
(1)创建cluster
kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.0.6:6443" --embed-certs=true --kubecnotallow=/root/lucky-admin.conf
(2)创建credentials时需要使用上面我门创建的token信息
kubectl get secret -n lucky
DEF_NS_ADMIN_TOKEN=$(kubectl get secret lucky-admin-token-2pm2l -n lucky -o jsnotallow={.data.token}|base64 -d)
(3)开始创建credentials
kubectl config set-credentials lucky --token=$DEF_NS_ADMIN_TOKEN --kubecnotallow=/root/lucky-admin.conf
(4)创建context
kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky --kubecnotallow=/root/lucky-admin.conf
(5)切换context的current-context是lucky@kubernetes
kubectl config use-context lucky@kubernetes --kubecnotallow=/root/lucky-admin.conf
(6)把刚才的kubeconfig文件lucky-admin.conf复制到桌面
浏览器访问时使用kubeconfig认证,把刚才的lucky-admin.conf导入到web界面,那么就可以登陆了