Kubernetes 安全防护

138 阅读7分钟

编排安全

容器技术的成熟推动着微服务的发展和落地,越来越多的企业开始采用微服务架构来组建自己的应用,其中, 容器编排工具管理着承载各类服务的容器集群。可以说,在各类采用微服务架构的项目中,容器编排工具支撑了 其核心业务。接下来以社区热度最高的编排工具 Kubernetes 为例,说明目前编排工具需要做的安全防护措施。

Kubernetes 安全防护

无论是 Kubernetes 社区还是第三方 安全机构均针对 Kubernetes 中组件和资源的安全进行了相应改善和安全 加固,以下为主要改进措施:1. 计算资源安全 Kubernetes 社区提供 PodSecurityPolicy[61],在 Kubernetes 中 PodSecurityPolicy 是一个集群级别的资源,用 于控制 Pod 规范以及管理 Pod 安全,PodSecurityPolicy 对象定义了一组必须运行的条件以及相关字段的默认值, 集群管理员 通过 PodSecurityPolicy 可以控制以下内容。

控制方面字段名
特权模式运行privileged
使用 root 命名空间hostPID hostIPC
使用主机网络和端口hostNetwork hostPorts
使用卷类型Volumes
使用主机文件系统all
owedHostPathsFlexVolume 驱动程序白名单allowedFlexVolumes
分配拥有 Pods 卷的 FSGroupfsGroup
要求 root 文件系统为只读readOnlyRootFilesystem
容器的用户和组 IDrunAsUser supplementalGroups
限制 root 特权升级allowPrivilegeEsca
lationdefault AllowPrivilegeEscalationLinux功能defaultAddCapabilities requiredDropCapabilities allowedCapabilities
容器的 SELinuxSELinux
容器使用的 AppArmor 配置文件annotations
容器使用的 Seccomp 配置文件annotations
容器使用的 Sysctl 配置文件annotations
  1. 集群安全 (1)控制 Kubernetes API 的访问 Kubernetes 的 API Server 针对所有 API流量使用了安全传输协议(TLS)以确保服务间访问的安全性,另外 又提供了访问认证、访问授权、Admission Control 等访问控制机制。 (2)控制对 Kubelet 的访问 Kubelet 的 HTTPS 端点公开了 API,这些 API授予了节点上容器强大的控制权,默认情况下 Kubelet 允许对 此 API进行未经认证的访问。生产环境集群中建议开启 Kubelet 身份验证和授权。 (3)控制集群运行时工作负载和用户的能力
  • 限制集群中的资源使用 资源配额(Resource Quota)限制了授予命名空间的资源数量,通常是用于限制命名空间可以分配的 CPU、 内存或持久性磁盘的数量,或是通过控制命名空间中 Pod、Service、Volume 的数量来限制资源使用。
  • 控制 root 权限运行容器 Pod 在 yaml 文件中的定义包含一个安全的上下文(security context),用于描述此 Pod 请求访问某个节点 上的特定用户(如 root)、获得特权或访问主机所在网络以及 Pod 在主机节点上不受约束的运行其它控件。而 Kubernetes 的 Pod 安全策略(PodSecurityPolicy)可以限制用户或服务账户(Service Count)提供安全上下文设置, 比如 Pod 的安全策略可以限制卷的挂载等。
  • 限制网络访问 首先 Kubernetes 中基于命名空间的网络策略(Network Policy)允许用户限制集群中其它命名空间的哪些 Pod 可以访问它们命名空间内的 Pod 和端口,另外通过配额和限制范围的方法也可以控制用户是否可以请求节点 端口和负载均衡服务,最后基于插件式的控制网络规则方法可以增加额外的保护措施,比如节点防火墙、物理分 离集群节点等。
  • 控制 Pod 访问 默认情况下,对在节点上访问 Pod 没做任何限制,但 Kubernetes 为用户提供了一组丰富的策略用于控制 Pod 运行节点的位置,这些策略典型的有 NodeSelector,Affinity 和 Anti-affinity等。 (4)保护集群中各组件
  • 限制对 Etcd 的访问 对于 API来说,拥有 Etcd 服务器后端的写权限相当于获得了整个集群的 root 权限。在 API Server 访问 Etcd 服务器时,管理员应该使用广受信任的凭证,比如通过 TLS客户端证书的相互认证。通常建议将 Etcd 服务器隔 离到只有 API Server 可以访问的防火墙后面。
  • 启用审计日志 Kubernetes 启用审计日志来记录 API发生破坏时进行后续的分析操作。
  • 限制对 Alpha 或 Beta 的访问 Kubernetes 的 α 和 β 特性还处在积极开发阶段,所以可能会有限制或是 Bug,从而导致安全漏洞,所以在 使用时可以禁用那些不需要的特性。
  • 实时关注安全更新和漏洞报告 加入 Kubernetes-announce 组 [62],能够获得有关安全公告的邮件,有关如何报告漏洞相关信息,可以参考安 全报告页面 [63]。
  • 对 Etcd 数据进行加密 一般情况下,Etcd 数据库包含了通过 Kubernetes API 可以访问到的所有信息,并且可以给予攻击者对集群 状态的可见性。所以要使用经过良好审查的备份和加密解决方案来进行数据加密,并且考虑在可能的情况下使用 全磁盘加密。 Kubernetes 1.7 包含了静态敏感信息加密(encryption at rest),它是一个 α 特性,会加密 Etcd 里面的 Secret 资源,以防止某一方通过查看这些 Secret 内容获取 Etcd 备份。虽然目前只是测试阶段,但是在关键时可 以提供额外防御层级。
  • 开启集成前审查第三方 许多集成至 Kubernetes 的第三方插件都可以改变集群的安全配置,所以在启用第三方插件时,应当检查扩 展请求的权限,Kubernetes 中的 Pod 安全策略(PodSecurityPolicy)可以提高其安全性。
  • 频繁回收基础证书 Kubernetes 中一个 Secret 或凭据的寿命越短,攻击者就越难使用该凭据,所以在证书上设置短生命周期并 实现自动回收证书是安全防护的一个好办法。因此使用身份验证机制时,应该设置发布令牌的可用时间,尽量缩 短寿命。 4.7.1.3 小结 在使用编排工具时注意以下几个风险项。 (1)编排工具中认证和授权机制是否合规 可为编排工具的各个访问接口提供独立的权限控制策略。比如 Kubernetes 的访问接口 API Server,由于 Kubernetes 各组件通信全部由 API驱动,控制用户访问集群以及允许用户执行哪些操作是第一道防线。类似的还 有 Docker CLI。 (2)编排工具对用户输入的合法性校验是否完善 可为编排工具自定义一个过滤用户输入内容的正则列表,以确保将非法的用户内容阻挡在外。 (3)编排工具对运行时的异常处理是否全面 运行时的异常处理流程是确保工具稳定运行的必要工作,目前 Kubernetes 集群内部各组件都有其各自的日 志可供查看,组件运行时异常可直接查看日志。当集群中部署的应用在集群中运行异常时,首先要查看是否是集 群的问题导致,若不是则排查是否是应用本身的问题。 (4)编排工具所依赖的运行环境是否安全

外部运行环境的安全是编排工具安全的前提,可以使用针对主机系统的安全防护工具来对编排的外部运行环 境进行安全加固。另外需要加固容器宿主机以缓解主机安全配置错误。更新容器引擎至最新版本避免旧版本存在 漏洞对主机造成危害。最后还有一些权限及审计的问题同样需受到重视。

参考资料

绿盟 容器安全技术报告

友情链接

CSA 基于个人信息保护法的企业个人信息保护合规风险控制验证框架1.0