本文最后更新于 321 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
安全机制
一、Kubernetes的安全框架
-
访问K8S集群的资源需要过三关:认证、鉴权、准入控制
-
普通用户若要安全访问集群API Server,往往需要证书、Token 或者用户名+密码;Pod访问,需要ServiceAccount
-
K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。
- Authentication
- Authorization
- Admission Control
二、传输安全,认证,授权,准入控制
传输安全:告别8080,迎接6443
三种客户端身份认证:
- HTTPS 证书认证:基于CA证书签名的数字证书认证
- HTTP Token认证:通过一个Token来识别用户
- HTTP Base认证:用户名+密码的方式认证
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器 插件的检查,检查不通过,则拒绝请求。
1.11版本以上推荐使用的插件:
--enable-admission-plugins= \ NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds, ResourceQuota
三、使用RBAC授权
RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
- 角色
- Role:授权特定命名空间的访问权限
- ClusterRole:授权所有命名空间的访问权限
- 角色绑定
- RoleBinding:将角色绑定到主体(即subject)
- ClusterRoleBinding:将集群角色绑定到主体
- 主体(subject)
- User:用户
- Group:用户组
- ServiceAccount:服务账号
示例:授权对Pod读取权限
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
角色授权
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
创建用户(CA证书为例)
cat > qinzc-csr.json <<EOF
{
"CN": "qinzc",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes qinzc-csr.json | cfssljson -bare qinzc
kubectl config set-cluster kubernetes \
--certificate-authority=ca.pem \
--embed-certs=true \
--server=https://192.168.31.63:6443 \
--kubeconfig=qinzc-kubeconfig
kubectl config set-credentials qinzc \
--client-key=qinzc-key.pem \
--client-certificate=qinzc.pem \
--embed-certs=true \
--kubeconfig=qinzc-kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=qinzc \
--kubeconfig=qinzc-kubeconfig
kubectl config use-context default --kubeconfig=qinzc-kubeconfig
绑定角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: qinzc
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io