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