云原生安全与 Kubernetes
Kubernetes 基于云原生架构,并借鉴了 CNCF 关于云原生信息安全的良好实践。
请继续阅读,了解 Kubernetes 的设计如何帮助您部署安全的云原生平台。
云原生信息安全
CNCF 的 白皮书 关于云原生安全,定义了适用于不同生命周期阶段的安全控制和实践。
开发生命周期阶段
- 确保开发环境的完整性。
- 根据您的环境,按照良好的信息安全实践设计应用程序。
- 在解决方案设计中考虑最终用户安全。
为此,您可以
- 采用一种架构,例如 零信任,以最大限度地减少攻击面,甚至针对内部威胁。
- 定义一个代码审查流程,该流程考虑安全问题。
- 构建系统的威胁模型或应用程序,以识别信任边界。使用该威胁模型来识别风险并确定如何处理它们。
- 在合理的情况下,结合高级安全自动化,例如模糊测试和 安全混沌工程。
分发生命周期阶段
- 确保您执行的容器镜像供应链的安全。
- 确保集群和其他组件的供应链安全,这些组件执行您的应用程序。例如,这可能包括您的云原生应用程序用于持久性的外部数据库。
为此,您可以
- 扫描容器镜像和其他工件是否存在已知漏洞。
- 确保软件分发使用传输中的加密,并对软件源进行信任链。
- 采用并遵循流程,以便在提供更新(尤其是响应安全公告)时更新依赖项。
- 使用验证机制,例如数字证书,以确保供应链。
- 订阅源和其他机制,以提醒您有关安全风险。
- 限制对工件的访问。将容器镜像放在 私有注册表 中,该注册表仅允许授权客户端拉取镜像。
部署生命周期阶段
确保对可以部署的内容、谁可以部署以及可以在哪里部署进行适当的限制。您可以强制执行来自分发阶段的措施,例如验证容器镜像工件的加密身份。
您可以将不同的应用程序和集群组件部署到不同的 命名空间 中。容器和命名空间都提供了与信息安全相关的隔离机制。
部署 Kubernetes 时,您还为应用程序的运行时环境奠定了基础:Kubernetes 集群(或多个集群)。该基础设施必须提供更高层期望的安全保证。
运行时生命周期阶段
运行时保护:访问
Kubernetes API 是使您的集群正常运行的关键。保护此 API 是提供有效集群安全的关键。
Kubernetes 文档的其他页面提供了有关如何设置访问控制特定方面的更多详细信息。安全检查清单 提供了集群的基本建议检查。
除此之外,保护您的集群意味着实施有效的 身份验证和 授权 以进行 API 访问。使用 ServiceAccounts 来提供和管理工作负载和集群组件的安全身份。
Kubernetes 使用 TLS 来保护 API 流量;确保使用 TLS 部署集群(包括节点和控制平面之间的流量)并保护加密密钥。如果您使用 Kubernetes 自己的 API 进行 证书签名请求,请特别注意限制滥用。
运行时保护:计算
容器 提供两件事:应用程序之间的隔离以及将这些隔离的应用程序组合在同一台主机计算机上运行的机制。这两个方面——隔离和聚合——意味着运行时安全涉及识别权衡并找到适当的平衡。
Kubernetes 依赖于 容器运行时 来设置和运行容器。Kubernetes 项目不推荐特定的容器运行时,您应该确保您选择的运行时满足您的信息安全需求。
为了保护您的运行时计算,您可以
强制执行 Pod 安全标准 以用于应用程序,以帮助确保它们仅使用必要的权限运行。
在您的节点上运行专门的操作系统,该操作系统专为运行容器化工作负载而设计。这通常基于只读操作系统(不可变镜像),仅提供运行容器所需的必要服务。
容器特定的操作系统有助于隔离系统组件,并在发生容器逃逸时提供缩减的攻击面。
定义 资源配额 以公平地分配共享资源,并使用诸如 LimitRanges 之类的机制来确保 Pod 指定其资源需求。
将工作负载分配到不同的节点,以提高隔离性。使用 Kubernetes 本身或生态系统中的 节点隔离 机制,以确保具有不同信任上下文的 Pod 运行在单独的节点集上。
使用提供安全限制的 容器运行时。
运行时保护:存储
为了保护集群和运行于其上的应用程序的存储,您可以
- 将您的集群与提供卷静态加密的外部存储插件集成。
- 为 API 对象启用 静态加密。
- 使用备份保护数据持久性,并验证您可以在需要时恢复它们。
- 验证集群节点与它们依赖的任何网络存储之间的连接。
- 在您自己的应用程序中实施数据加密。
对于加密密钥,在专用硬件中生成这些密钥可以提供最佳的泄露风险保护。硬件安全模块 允许您执行加密操作,而无需允许将安全密钥复制到其他位置。
网络和安全
您还应该考虑网络安全措施,例如 NetworkPolicy 或 服务网格。Kubernetes 的一些网络插件使用虚拟专用网络 (VPN) 覆盖等技术为您的集群网络提供加密。Kubernetes 的设计允许您为集群使用自己的网络插件。如果您使用托管 Kubernetes,提供商可能已经为您选择了网络插件。
您选择的网络插件以及您集成它的方式会对传输中信息的安全性产生重大影响。
可观察性和运行时安全
Kubernetes 允许您使用额外的工具扩展集群。您可以设置第三方解决方案来帮助您监控或排查应用程序以及它们运行的集群。Kubernetes 本身也提供了一些基本的可观察性功能。在容器中运行的代码可以生成日志、发布指标或提供其他可观察性数据;在部署时,您需要确保您的集群提供适当级别的保护。
如果您设置了指标仪表板或类似工具,请检查将数据填充到该仪表板的组件链,以及仪表板本身。确保整个链条都设计了足够的弹性和完整性保护,以便即使在集群可能降级的情况下也能依赖它。
在适当的情况下,在 Kubernetes 层下方部署安全措施,例如密码学度量的启动或经过身份验证的时间分发(这有助于确保日志和审计记录的真实性)。
对于高保证环境,部署加密保护以确保日志既防篡改又保密。
接下来
云原生安全
- CNCF 白皮书 关于云原生安全。
- CNCF 白皮书 关于保护软件供应链的最佳实践。
- 修复 Kubernetes 集群混乱:从内核到上理解安全 (FOSDEM 2020)
- Kubernetes 安全最佳实践 (Kubernetes Forum Seoul 2019)
- 迈向开箱即用的度量启动 (Linux Security Summit 2016)