十六、k8s安全框架
k8s安全框架
一、kubernetes安全框架
k8s安全控制框架主要由下面三个阶段进行控制,每一个阶段都支持插件方式,通过api server配置来启用插件。
1、鉴权:Authentication
2、授权:Authorization
3、准入控制:Admission Control
客户端要想访问k8s集群api server,一般需要证书、token或用户名+密码;如果Pod访问,需要ServiceAccount。
二、认证、授权、准入控制
2.1 鉴权:Authentication
三种客户端身份认证:
a、HTTPS证书认证: 基于CA证书签名的数字证书认证
b、HTTP Token认证:通过一个Token来识别用户
c、HTTP Base认证:用户名+密码的方式认证
2.2、授权:Authorization
RBAC(Role-BasedAccess Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝
比较常见的授权维度:
a、user:用户名
b、group:用户分组
c、资源,如pod、deployment
d、资源操作方法:get, list, create, update, patch, watch, delete
e、命名空间
f、API组
2.3 准入控制:Admission Control
实际上是一个准入控制插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
准入控制插件列表:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/
三、基于角色的权限访问控制:RBAC
RBAC(Roke-Based Access Control,基于角色的访问控制),允许通过kubernetes API动态配置策略(立即生效)。
3.1 角色:
1、Role:授权特定命名空间的访问权限
2、ClusterRole:授权所有命名空间的访问权限
3.2 角色绑定:
1、RoleBinding:将角色绑定到主体(即subject)
2、ClusterRoleBinding:将集群角色绑定到主体
3.3 主体:
1、User: 用户
2、Group: 用户组
3、 ServiceAccount:服务账号
四、案例:为指定用户授权访问不同命名空间权限
示例:为qj用户授权default命名空间pod读取权限
4.1、用k8s CA签发客户端证书
CA指的是k8s的根证书。
kubeadmin部署,目录是:/etc/kubernetes/pki/ca.crt 和 ca.key
二进制部署,一般会放到一个单独的目录:TLS/kubernetes/ca.pem或者其他后缀 和 ca-key.pem
需要单独安装cfssl、 cfssl-certinfo、cfssljson等 命令
vi cert.sh
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
cat > qj-csr.json <<EOF
{
"CN": "qj",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": ""BeiJing,
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes qj-csr.json | cfssljson -bare qj
注:
CN字段代表用户名
O字段代表用户组名
# bash cert.sh
会生成qj-key.pem和qj.pem两个文件
4.2、生成kubeconfig授权文件
# vi kubeconfig.sh
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://192.168.2.153:6443 \
--kubeconfig=qj.kubeconfig
#设置客户端认证
kubectl config set-credentials qj \
--client-key=qj-key.pem \
--client-certificate=qj.pem \
--embed-certs=true \
--kubeconfig=qj.kubeconfig
#设置默认上下文
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=qj \
--kubeconfig=qj.kubeconfig
#设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=qj.kubeconfig
# bash kubeconfig.sh
会生成qj.kubeconfig文件。
4.3、创建RBAC权限策略
拷贝qj.kubeconfig文件到远程主机。
# scp qj.kubeconfig root@x.x.x.x:~
在远程主机执行kubectl命令:
# kubectl get pods --kubeconfig=qj.kubeconfig 此时会报qj账户无法列出默认命名空间pods,即没有权限
创建RBAC权限策略
# vi rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-server
rule:
- apiGroups: [""] #API组
resources: ["pods"] #资源
verbs: ["get","watch","list"] #操作方法
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User #主体
name: qj #用户名
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role #绑定角色
name: pod-reader #绑定的角色名称
apiGroup: rbac.authorization.k8s.io
# kubectl apply -f rbac.yaml
4.4、# 指定kubeconfig文件测试:
# kubectl get pods --kubeconfig=./qj.kubeconfig
4.5、# 添加service权限,修改此配置:
# kubectl apply -f rbac.yaml
4.6、# 添加apps和deployment权限
# kubectl apply -f rbac.yaml
4.7、# 官方示例参考:
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
4.8、查看所有API接口:
# kubectl api-resources 《红框重表示API组,只有v1的表示为核心组,留空 。如apps/v1表示组为apps组》
4.9、不添加kubeconfig文件直接执行kubectl命令
放在家目录如:/root
# mkdir /root/.kube
# mv qj.kubeconfig /root/.kube/config
# kubectl get pod,svc
五、授权一个应用程序(pod)访问apiserver流程
1、创建一个serviceaccount
2、创建role规则
3、role绑定serviceaccount
subjects:
- king: ServiceAccount
name: nfs-client-provisioner
六、获取token
# kubectl get sa
#kubectl get secret
七、管理员权限组
获取权限组:
获取管理员权限组,默认的管理员权限组:
赋管理员权限,可以直接使用:
# kubectl create serviceaccount dashboard-admin -n kube-system
# kubectl create clusterrolebinding dashboard-admin --cluserrrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret |awk '/dashboard-admin/{print $1}')
更多推荐
所有评论(0)