# 官方提供@yunTaoScripts 集群强化 🔥🔥
通过对用户的授权,提升系统安全性。
# 验证 Authentication
判断是否允许登录k8s 。校验身份。如果切换了一个用户,则有可能导致验证失败。
# 验证方式
# token
跳过mtls认证
kubectl --insecure-skip-tls-verify=true # 因为登录节点无证书信息,可以通过这种方式跳过mtls认证。
# kubeconfig
修改apiserver manifest允许所有授权或者拒绝所有授权
如果不对用户授权,登录了也执行不了操作。
--Authorization=AlwaysAllow # 测试环境可以加,其他任何情况要选择RBAC
--Authorization=AlwaysDeny
# oauth2
第三方验证方式,比如LDAP (opens new window)
# 授权 Authorization
k8s集群存在用户账号和服务账号两类账号,用户账号用于登录集群,服务账号用于pod访问服务。
# 用户授权
# ServiceAccount 授权
每个pod必须要指定一个sa,如果没有指定,使用default这个sa。
- pod 在创建时 会自动创建投射卷,将serviceaccount 的token 挂载到pod里。
k8s 1.20 版本之前
- 每创建一个sa 就会创建一个secret,且永不过期。
- secret 里包含一个token,和pod 完全一致。
- token 格式为 JWT 格式。
k8s 1.21~1.23 版本之间
- 每创建一个sa 就会创建一个secret,且永不过期。
- secret 里包含一个token。
- pod 不会使用这个token,pod内地token 为kubelet动态分配的,有效期一年。
k8s 1.24 版本之后
- 创建sa 不会创建secret。
- pod内地token 是 kubelet动态分配的,有效期一年。
- 查看 sa 权限
root@vms33:~# kubectl --as system:serviceaccount:networkpolicy:sa1 get pod
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:networkpolicy:sa1" cannot list resource "pods" in API group "" in the namespace "netpolicy"
root@vms33:~#
- apiserver 设置为AlwaysAllow
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=192.168.26.33
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --authorization-mode=AlwaysAllow # 授权所有访问
root@vms33:~# systemctl restart kubelet.service
root@vms33:~# kubectl --as system:serviceaccount:networkpolicy:sa1 get pod
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 1 (5m52s ago) 21h
pod2 1/1 Running 1 (5m51s ago) 21h
sa的权限一定不能过大
如果容器中存在sa,非法程序访问到了pod,并且窃取了token。这个程序就可以实现利用token入侵k8s集群。为解决这件事可以通过automountServiceAccountToken 禁用自动挂载。
root@vms33:~# kubectl create clusterrole crole1 --resource pod,deployment --verb get
root@vms33:~# kubectl --as system:serviceaccount:netpolicy:sa1 auth can-i get pod
- 在sa中 automountServiceAccountToken 置为false,禁用自动挂载token。
root@vms33:~# kubectl explain serviceaccount | grep automount -C4
automountServiceAccountToken <boolean>
AutomountServiceAccountToken indicates whether pods running as this service
account should have an API token automatically mounted. Can be overridden
at the pod level.
- 在pod 中增 automountServiceAccountToken 置为false,禁用自动挂载token。(优先级更高)
root@vms33:~# kubectl explain pod.spec | grep automount -C4
automountServiceAccountToken <boolean>
AutomountServiceAccountToken indicates whether a service account token
should be automatically mounted.
← 快速链接