2023年6月30日发(作者:)
青藤最全K8S加固指南:12个最佳实践,防⽌K8S配置错误在容器环境中,K8S管理着拥有数个、数百个甚⾄数千个节点的容器集群,其配置的重要性不可忽略。K8S的配置选项很复杂,⼀些安全功能并⾮默认开启,这加⼤了安全管理难度。如何有效地使⽤包括Pod安全策略、⽹络策略、API服务器、Kubelet及其他K8S组件和功能策略建⽴安全的K8S环境?青藤云安全为你整理了以下12个最佳实践,对K8S进⾏全⾯加固。1、将K8S更新到最新稳定版本K8S新版本通常会引⼊⼀系列不同的安全功能,提供关键的安全补丁等,将K8S部署更新到最新稳定版本,使⽤到达stable状态的API,能够补救⼀些已知的安全风险,帮助解决影响较⼤的K8S安全缺陷问题,⼤⼤减少攻击⾯。2、利⽤Pod策略防⽌风险容器/Pod被使⽤PodSecurityPolicy是K8S中可⽤的集群级资源,通过启⽤PodSecurityPolicy准⼊控制器来使⽤此功能。⽤户⾄少要授权⼀个策略,否则将不允许在集群中创建Pod。Pod安全策略解决了以下⼏个关键安全⽤例:防⽌容器以特权模式运⾏,因为这种类型的容器将会拥有底层主机可⽤的⼤部分能⼒避免容器与宿主机共享⾮必要的命名空间,如PID、IPC、NET等,确保Docker容器和底层主机之间的适当隔离限制Volume的类型。例如,通过可写HostPath⽬录卷,操作者可写⼊⽂件系统,让容器得以在pathprefix之外随意移动,因此,必须使⽤readonly:true限制主机⽂件系统的使⽤通过ReadOnlyRootFilesystem将根⽂件系统设置为只读基于defaultAllowPrivilegeEscalation和allowPrivilegeEscalation选项,防⽌Pod及Pod中的进程获得⾼权限在遵循最⼩权限原则的前提下,将Linux功能限制为最低权限此外,⼀些Pod属性也可以通过securityContext来控制。3、利⽤K8S命名空间正确隔离K8S资源通过命名空间可以创建逻辑分区、强制分离资源以及限制⽤户权限范围。在⼀个命名空间内的资源名称必须是唯⼀的,且不能相互嵌套,每个K8S资源只能位于⼀个命名空间中。在创建命名空间时,要避免使⽤前缀kube-,因为kube-⽤于K8S系统的命名空间。4、利⽤⽹络策略限制容器和Pod通信⽹络策略功能规定了Pod群组之间相互通信以及Pod群组与其他⽹络端点间进⾏通信的⽅式,可以理解为K8S的防⽕墙。虽然Kubernetes⽀持对NetworkPolicy资源的操作,但如果没有实现该资源的插件,仅创建该资源是没有效果的,可以通过使⽤⽀持⽹络策略的⽹络插件,⽐如Calico、Cilium、Kube-router、Romana和Weave Net等。如果有⼀个适⽤于Pod的⽹络策略被允许,那么与Pod的连接就会被允许。要明确可以允许哪些Pod访问互联⽹,如果在每个命名空间内使⽤了default-deny-all命令,那所有的Pod都不能相互连接或接收来⾃互联⽹的流量。对于⼤多数应⽤程序来说,可以通过设置指定标签的⽅式,创建针对这些标签的⽹络策略来允许⼀些Pod接收来⾃外部的流量。5、利⽤ImagePolicyWebhook策略管理镜像来源可以通过准⼊控制器ImagePolicyWebhook来防⽌使⽤未经验证的镜像,从⽽拒绝使⽤未经验证的镜像来创建Pod,这些镜像包括近期未扫描过的镜像、未列⼊⽩名单的基础镜像、来⾃不安全的镜像仓库的镜像。6、安全配置K8S API服务器6、安全配置K8S API服务器Kubernetes API 服务器处理来⾃集群内运⾏的⽤户或应⽤程序的 REST API 调⽤,以启⽤集群管理。在主节点运⾏ps -ef | grep kube-apiserver命令,并检查输出中的以下信息:7、安全配置Kube-schedulerKube-scheduler作为K8S的默认编排器,负责监视未分配节点的新创建的Pod,从⽽将该Pod调度到合适的Node上运⾏。在主节点上运⾏ps -ef | grep kube-scheduler命令,并检查输出中的以下信息:--profiling设置为false,以⼤⼤减少攻击⾯。当遇到系统性能瓶颈的时候,profiling可以通过识别定位瓶颈来发挥作⽤,对性能调优有显著帮助。--address设置为127.0.0.1,防⽌将编排器绑定到⼀个⾮回环的不安全地址。8、安全配置Kube-controller-manager8、安全配置Kube-controller-manager在主节点上运⾏ps -ef | grep kube-controller-manager命令,并检查输出中的以下信息:--terminated-pod-gc-threshold设置为⼀个适合的值,以确保拥有⾜够可⽤的资源,并不会导致性能降低。--profilingargument 设置为false。--use-service-account-credentials设置为true。这种设置可以配合RBAC使⽤,确保控制环路以最⼩权限原则运⾏。--service-account-private-key-file设置为单独的公钥/私钥对,⽤于签署服务账户令牌。--root-ca-file设置为⼀个适合的值,在包含API服务器的服务证书的根证书中进⾏设置,这样Pod会先验证API服务器的服务证书,然后再建⽴连接。--RotateKubeletServerCertificate设置为true,并且只适⽤于Kubelets从API服务器获得其证书的情况下。--address argument设置为127.0.0.1,确保控制管理器服务不会与⾮回环的不安全地址绑定。9、安全配置EtcdEtcd是⼀种分布式键值存储,实现跨集群存储数据。K8S集群都使⽤Etcd作为主要的数据存储⽅式,来处理K8S集群状态的存储和复制数据,使系统⼈员可以根据需要从Etcd读取并写⼊数据。安全地配置Etcd与其服务器的通信是最关键的。在Etcd服务器节点上运⾏ps -ef | grep etcd命令,并检查输出中的以下信息:--cert-file和 --key-file根据需要设置,以确保客户端连接只通过TLS(传输中加密)提供服务。--client-cert-auth 设置为true,确保所有⽤户的访问都会包括⼀个有效的客户端证书。--auto-tls不要设置为true,这会禁⽌客户在TLS中使⽤⾃签名的证书。如果使⽤的是Etcd集群(⽽⾮单⼀的Etcd服务器),要检查⼀下--peer-cert-file 和--peer-key-file 参数是否设置正确,以确保同级别的Etcd连接在Etcd集群中被加密。此外,检查--peer-client-cert-auth 参数是否设置为true,确保只有经过认证的同级别的Etcd才能访问Etcd集群。最后检查⼀下--peer-auto-tls 参数是否设置为true。不要为Etcd与Kubernetes使⽤相同的授权证书,可以通过验证API服务器的--client-ca-file引⽤的⽂件与Etcd使⽤的--trusted-ca-file之间的差别来确保这种区分情况。10、安全配置KubeletKubelet是运⾏在每个节点上的主要“节点代理”,错误地配置Kubelet会⾯临⼀系列的安全风险,所以,可以使⽤运⾏中的Kubelet可执⾏⽂件参数或Kubelet配置⽂件来设置Kubelet配置。找到Kubelet配置⽂件(通过config 参数可找到Kubelet配置⽂件的位置),运⾏ps -ef | grep kubelet | grep config 命令,并检查输出中的以下信息:--anonymous-auth 设置为false。常见的错误配置之⼀是允许Kubelet服务器提供匿名和未经验证的请求。--authorization-mod设置为AlwaysAllow。若使⽤默认配置值,要确保有--config 指定的Kubelet配置⽂件,并且该⽂件将authorization: mode 设置为AlwaysAllow以外的配置。--client-ca-file 设置的是客户端证书授权的位置。若使⽤默认配置值,要确保有⼀个由--config指定的Kubelet配置⽂件,并且该⽂件已经过认证,同时将x509:clientCAFile 设置为客户端证书授权的位置。--read-only-port 设置为0,若使⽤默认配置值,要确保有⼀个由config指定的⽂件,如果要设置适合的值,则将readOnlyPort设置为0。--protect-kernel-defaults设置为true。若使⽤默认配置值,要确保有⼀个由config指定的⽂件,并且该⽂件已将--protect-kernel-defaults设置为true。若使⽤默认配置值,要确保有⼀个由config指定的⽂件,并且该⽂件已将protectKernelDefaults设置为true。--hostname-override 使⽤默认配置值,确保Kubelet和API服务器之间TLS设置没有中断。--event-qps设置为0。若使⽤默认配置值,要确保有⼀个由config指定的kubelet配置⽂件,并且eventRecordQPS设置为0。--tls-cert-file和--tls-private-key-file参数设置为合适的值。通过--config所指定的Kubelet config包含tlsCertFile 和tlsPrivateKeyFile,确保Kubelet上的所有连接都是通过TLS进⾏的。如果Kubelet从API服务器获得证书,将RotateKubeletServerCertificate和--rotate-certificates设置为true,确保Kubelet只使⽤强密码。11、确保主节点的配置⽂件安全主节点上的配置⽂件安全主要涉及到确保API服务器的Pod规范⽂件权限和所有权、控制管理器Pod规范⽂件的权限和所有权、编排器Pod规范⽂件的权限和所有权、Etcd Pod规范⽂件的权限和所有权、容器⽹络接⼝⽂件的权限和所有权、Etcd数据⽬录的权限和所有权、⽂件的权限和所有权、⽂件的权限和所有权、⽂件权限和所有权、Kubernetes PKI⽬录&⽂件权限和所有权、Kubernetes PKI密钥⽂件权限等安全性。以API服务器的Pod规范⽂件权限和所有权为例:⽂件权限:在主节点上运⾏stat -c %a /etc/kubernetes/manifests/ 命令 (指定系统的⽂件位置),在输出中检查和确保权限是644或更多权限限制,并保持⽂件的完整性。所有权:在主节点上运⾏stat -c %U:%G /etc/kubernetes/manifests/命令 (指定系统的⽂件位置),在输出中检查和确保所有权权限设置为root:root。12、确保⼯作节点的配置⽂件安全保护⼯作节点的配置⽂件安全包括确保Kubelet服务⽂件权限、⽂件权限和所有权、Kubelet服务⽂件所有权、代理Kubeconfig⽂件的权限和所有权、证书管理中⼼的⽂件权限、客户端证书管理中⼼的⽂件所有权、Kubelet配置⽂件的权限和所有权。以Kubelet服务⽂件权限为例:在主节点上运⾏stat-c%a /etc/systemd/system/e.d/命令(指定系统的⽂件位置),在输出中检查和确保权限是644或更多权限限制,并保持⽂件的完整性。总结K8S提供了创建安全应⽤的强⼤功能,但我们需要确保所有的配置设置正确。上⽂介绍的这些配置、代码⽰例和详细建议,可帮助您避免最常见的K8S错误配置相关的安全风险。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688057230a72431.html
评论列表(0条)