青藤最全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中的进程获得高权限
在遵循最小权限原则的前提下,将Lux功能限制为最低权限
,一些Pod属性也可以通过securityContext来控制。
3、利用K8S命名空间正确隔离K8S资源
通过命名空间可以创建逻辑分区、强制分离资源以及限制用户权限范围。在一个命名空间内的资源名称必须是唯一的,且不能相互嵌套,每个K8S资源只能位于一个命名空间中。在创建命名空间时,要避免使用前缀kube-,因为kube-用于K8S系统的命名空间。
4、利用网络策略限制容器和Pod通信
网络策略功能规定了Pod群组之间相互通信以及Pod群组与其他网络端点间进行通信的方式,可以理解为K8S的防火墙。虽然Kuberes支持对NetworkPolicy资源的操作,但如果没有实现该资源的插件,仅创建该资源是没有效果的,可以通过使用支持网络策略的网络插件,比如Calico、Cilium、Kube-router、Romana和Weave Net等。
如果有一个适用于Pod的网络策略被允许,那么与Pod的连接就会被允许。要明确可以允许哪些Pod访问互联网,如果在每个命名空间内使用了default-deny-all命令,那所有的Pod都不能相互连接或接收来自互联网的流量。对于大多数应用程序来说,可以通过设置指定标签的方式,创建针对这些标签的网络策略来允许一些Pod接收来自外部的流量。
5、利用ImagePolicyWebhook策略管理镜像来源
可以通过准入控制器ImagePolicyWebhook来防止使用未经验证的镜像,从而拒绝使用未经验证的镜像来创建Pod,这些镜像包括近期未扫描过的镜像、未列入白名单的基础镜像、来自不安全的镜像仓库的镜像。
6、安全配置K8S API服务器
Kuberes API 服务器处理来自集群内运行的用户或应用程序的 REST API 调用,以启用集群管理。在主节点运行ps -ef | grep kube-apiserver命令,并检查输出中的推火网以下信息
7、安全配置Kube-scheduler
Kube-scheduler作为K8S的默认编排器,负责监视未分配节点的新创建的Pod,从而将该Pod调度到合适的Node上运行。在主节点上运行ps -ef | grep kube-scheduler命令,并检查输出中的推火网以下信息
--profilg设置为false,以大大减少攻击面。当遇到系统性能瓶颈的时候,profilg可以通过识别定位瓶颈来发挥作用,对性能调优有显著帮助。
--address设置为127.0.0.1,防止将编排器绑定到一个非回环的不安全地址。
8、安全配置Kube-controller-manager
在主节点上运行ps -ef | grep kube-controller-manager命令,并检查输出中的推火网以下信息
--termated-pod-gc-threshold设置为一个适合的值,以确保拥有足够可用的资源,并不会导致性能降低。
--profilgargument 设置为false。
--use-service-aount-credentials设置为true。这种设置可以配合RBAC使用,确保控制环路以最小权限原则运行。
--service-aount-private-key-file设置为单独的公钥/私钥对,用于签署服务账户令牌。
--root-ca-file设置为一个适合的值,在包含API服务器的服务证书的根证书中进行设置,这样Pod会先验证API服务器的服务证书,然后再建立连接。
--RotateKubeletServerCertificate设置为true,并且只适用于Kubelets从API服务器获得其证书的情况下。
--address argument设置为127.0.0.1,确保控制管理器服务不会与非回环的不安全地址绑定。
9、安全配置Etcd
Etcd是一种分布式键值存储,实现跨集群存储数据。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与Kuberes使用相同的授权证书,可以通过验证API服务器的--client-ca-file引用的文件与Etcd使用的--trusted-ca-file之间的差别来确保这种区分情况。
10、安全配置Kubelet
网络推广
- 5g网络有多快:5g网络网速有多快
- dota2无法连接至steam网络 为什么无法连接dota2网络
- 无线网络信号接收器 无线网络信号接收器怎么用
- 网络延时是什么意思 网络延时是什么原因
- 无线网络不可用:无线网络不可用是什么原因
- 网络广告销售技巧 网络广告销售技巧有哪些
- 智能手机网络设置 智能手机网络设置在哪里
- 为什么找不到无线网络 为什么找不到无线网络信
- 网络这么赚钱:网络怎么能赚到钱
- 为什么无线网络连接不上 为什么无线网连不起来
- 网络上的人际交往 网络上人际交往的优势
- 支付宝网络系统异常 支付宝显示网络异常什么时
- 营销软件:营销软件有哪些
- 无法访问您要使用的功能所在的网络位置
- 网络安全基本知识 网络安全基本知识有哪些
- 什么网络电话最好用 什么网络电话最好用最便宜