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