Kubernetes 作为云原生生态系统的关键,为容器化应用的自动化、部署、扩展和管理提供了多层级系统,但也带来了新的复杂性和安全风险。本指南探讨了 Kubernetes 为云原生应用安全性提供的独特注意事项,以及如何在其内置安全基础上构建以采用 DevSecOps。
Kubernetes 的基本安全注意事项
Kubernetes 安全的挑战性在于其多层次的复杂框架,每个层级都具有一系列安全挑战,且各层级相互关联。需要解决的基本问题包括:集群、控制平面、Pod、容器和代码等层级的 безопасности。
内置 Kubernetes 安全功能
Kubernetes 提供了多种内置安全功能,包括:
- 基于角色的 Kubernetes 访问控制 (RBAC)
- 网络策略
- 准入控制器
- Kubernetes 入口的传输层安全 (TLS)
- Pod 安全策略 (PSP)
Kubernetes 和 IaC
手动配置 Kubernetes 集群及其附加组件既耗时又容易出错。IaC 利用机器可读文件以编程方式管理资源,实现版本控制、可审核性以及更轻松的协作和测试。Kubernetes 清单文件是 IaC 的一个示例,以 JSON 或 YAML 格式编写,指定 Kubernetes 维护的对象的期望状态。
Kubernetes 的基本安全最佳实践
- Kubernetes 主机基础架构安全:使用 IaC 模板配置节点,实施安全最佳实践,排除无关软件,采用内核级安全强化框架,并加密所有关联存储。
- Kubernetes 集群的 IAM 安全:使用外部云服务管理 Kubernetes 环境的访问控制,如 AWS IAM,并使用 IaC 扫描工具捕获过度宽松或未使用的 IAM 角色和策略。
- 容器注册表安全:确保只有需要访问容器映像的注册表用户才能访问,并阻止未经授权的用户将映像上传到注册表。
- 避免上传“最新”容器映像:指定映像版本,避免依赖“最新”标记,从而更难跟踪容器的特定版本和安全漏洞。
- 避免特权容器和升级:使用 IaC 拒绝权限升级,不使用“特权”标志或直接授予特权。
- 网络级别的孤立 Pod:使用网络策略隔离 Pod,阻止横向移动。
- 加密内部流量:设置
kubelet-https=true,对 API 服务器和 kubelets 之间的流量进行加密。
- 指定资源限制:限制 Pod 使用的内存和 CPU 数量,降低拒绝服务 (DoS) 攻击的风险。
- 避免使用默认命名空间:为独立的工作负载创建单独的命名空间,避免安全问题和缺乏分段。
- 启用审核日志记录:在 kube-apiserver 策略文件中添加配置,记录 API 服务器的每个请求及其结果。
- 保护开源 Kubernetes 组件:扫描 Helm charts 和容器映像,识别易受攻击的组件。
DevOps 生命周期的 Kubernetes 安全
- 开发:避免 IaC 文件中的错误配置、容器映像中的漏洞和硬编码机密,通过 IDE 或 CLI 工具集成安全反馈。
- 构建并部署:在部署前运行安全扫描,自动解决安全问题,确保部署阶段的安全性。
- 运行时:连续扫描生产环境,检测安全上下文、网络策略和其他配置数据的更新,强化和监控托管集群的节点。
- 反馈和规划:记录生产过程中的安全问题,找到阻止类似问题再次出现的方法,建立规则或限制访问控制。
云原生应用的 DevSecOps 技巧
- 人员:提高效率的技巧、平衡个人关注点和更大的目标、持续学习。
- 进程:在开发、构建和部署、运行时、反馈和规划等阶段优先考虑安全性,设置正确的流程和防护措施。
- 工具:选择代码级别的可视性工具,集成到开发人员工具和工作流程中,实现代码到云的统一策略和可视性,并考虑合规性。
关键性能指标 (KPI)
- 一段时间内的生产问题数量和严重程度
- 平均修复时间 (MTTR)
- 部署速度和频率
结论
Kubernetes 安全性需要多管齐下的方法来解决各层中的安全风险。通过利用基于 IaC 的方法定义安全规则,并利用 Kubernetes 的内置安全功能及整体 IaC 安全策略,可以从一开始就构建安全性。DevSecOps 策略能够让团队在共同目标的指导下部署安全的应用,不受安全最佳实践的阻碍。使用 Prisma Cloud 可以找到并修复云资源和 IaC 中的错误配置,跨安全性及合规性基准强制执行策略,并通过多种集成嵌入保护措施。