# 官方提供@yunTaoScripts 集群强化 🔥🔥

loading

通过对用户的授权,提升系统安全性。

# 验证 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里。
  1. k8s 1.20 版本之前

    • 每创建一个sa 就会创建一个secret,且永不过期。
    • secret 里包含一个token,和pod 完全一致。
      • token 格式为 JWT 格式。
  2. k8s 1.21~1.23 版本之间

    • 每创建一个sa 就会创建一个secret,且永不过期。
    • secret 里包含一个token。
    • pod 不会使用这个token,pod内地token 为kubelet动态分配的,有效期一年。
  3. 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.
最后修改时间: 12/31/2022, 12:00:03 PM