锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

K8S安全配置最佳实践

时间:2023-02-03 02:30:01 41s连接器

在容器环境中,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服务器

Kubernetes API 服务器处理运行的用户或应用程序的服务器处理 REST API 调用集群管理。在主节点运行ps -ef | grep kube-apiserver检查输出中的以下信息:

f5e3f2a5832fdf947a44381a0e621383.png

7.安全配置Kube-scheduler

Kube-scheduler作为K8S默认编排器负责监控未分配节点的新创建Pod,从而将该Pod调度到合适的Node运行在主节点上。ps -ef | grep kube-scheduler检查输出中的以下信息:

●--profiling设置为false,大大降低攻击面。遇到系统性能瓶颈时,profiling它可以通过识别和定位瓶颈来发挥作用,这显著有助于性能调整。

●--address设置为127.0.0.1.防止将编排器绑定到非回环不安全地址。

8.安全配置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.安全配置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与Kubernetes使用相同的授权证书可以验证API服务器的--client-ca-file参考文件和Etcd使用的--trusted-ca-file确保这种差异的区别。

10.安全配置Kubelet

Kubelet它是每个节点运行的主要节点代理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 如果使用默认配置值,则应确保有一个原因config如果要设置合适的值,指定的文件将被设置readOnlyPort设置为0。

●--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所指定的Kubeletconfig包含tlsCertFile和tlsPrivateKeyFile,确保Kubelet上的所有连接都是通过TLS进行的。

● 如果Kubelet从API服务器获得证书,将

RotateKubeletServerCertificate和--rotate-certificates设置为true,确保Kubelet只使用强密码。

11.确保主节点的配置文件安全

主节点上的配置文件安全主要涉及到确保API服务器的Pod规范文件权限和所有权、控制管理器Pod规范文件的权限和所有权、编排器Pod规范文件的权限和所有权、Etcd Pod规范文件的权限和所有权、容器网络接口文件的权限和所有权、Etcd数据目录的权限和所有权、admins.conf文件的权限和所有权、scheduler.conf文件的权限和所有权、controller-manager.conf文件权限和所有权、Kubernetes PKI目录&文件权限和所有权、Kubernetes PKI密钥文件权限等安全性。

以API服务器的Pod规范文件权限和所有权为例:

文件权限:在主节点上运行stat-c%a /etc/kubernetes/manifests/kube-apiserver.yaml 命令 (指定系统的文件位置),在输出中检查和确保权限是644或更多权限限制,并保持文件的完整性。

所有权:在主节点上运行stat-c%U:%G /etc/kubernetes/manifests/kube-apiserver.yaml命令 (指定系统的文件位置),在输出中检查和确保所有权权限设置为root:root。

12.确保工作节点的配置文件安全

保护工作节点的配置文件安全包括确保Kubelet服务文件权限、Kubelet.conf文件权限和所有权、Kubelet服务文件所有权、代理Kubeconfig文件的权限和所有权、证书管理中心的文件权限、客户端证书管理中心的文件所有权、Kubelet配置文件的权限和所有权。

以Kubelet服务文件权限为例:在主节点上运行stat-c%a /etc/systemd/system/kubelet.service.d/10-kubeadm.conf命令 (指定系统的文件位置),在输出中检查和确保权限是644或更多权限限制,并保持文件的完整性。

总结

K8S提供了创建安全应用的强大功能,但我们需要确保所有的配置设置正确。上文介绍的这些配置、代码示例和详细建议,可帮助您避免最常见的K8S错误配置相关的安全风险。

文章来源:青藤云安全,点击查看原文

推荐

Docker 安全最佳实践和备忘单

Kubernetes入门培训(内含PPT)


随手关注或者”在看“,诚挚感谢!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章