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