容器优化 OS - 使用 Bottlerocket 强化容器主机的安全与运维
详解使用 AWS Bottlerocket 优化容器主机。介绍最小化 OS 设计、自动更新、不可变基础设施以及与 ECS/EKS 的集成。
容器主机 OS 的挑战
使用 EC2 实例作为 ECS 或 EKS 的工作节点时,主机 OS 的选择会对安全和运维产生重大影响。Amazon Linux 2 或 Ubuntu 等通用 OS 包含大量运行容器所不需要的软件包(包管理器、外壳程序、各种辅助工具),这些软件包扩大了攻击面(Attack Surface)。OS 的补丁应用也存在按软件包更新时产生依赖关系问题的风险。Bottlerocket 是 AWS 开发的基于 Linux 的容器专用 OS,从根本上解决了这些问题。仅包含容器运行时(containerd)、Kubernetes kubelet(EKS 用)或 ECS 代理,以及最小限度的系统组件,彻底排除了不需要的软件。
安全设计与不可变基础设施
Bottlerocket 的安全设计是多层次的。根文件系统以只读方式挂载,并通过 dm-verity 验证块级完整性。检测到篡改时,系统会拒绝启动。SELinux 默认启用,将容器进程的权限限制在最小范围。由于不存在包管理器,运行时无法安装软件,从而降低了供应链攻击的风险。SSH 访问默认禁用,管理通过 API(经由 SSM 代理)进行。OS 的更新是基于镜像的原子更新,用新镜像替换整个 OS。更新采用 A/B 分区方式进行,如果使用新镜像启动失败,会自动回滚到之前的版本。
| 观察点 | 通用 OS | Bottlerocket |
|---|---|---|
| 内置软件 | 包含包管理器、shell 和各种实用工具 | 只有 containerd、kubelet 或 ECS 代理,以及最小限度的系统组件 |
| 根文件系统 | 可读写 | 只读,并用 dm-verity 校验完整性;检测到篡改就拒绝启动 |
| 运行中安装软件 | 随时可以通过包管理器安装 | 没有包管理器,无法安装 |
| 管理访问 | 以 SSH 登录后手工修改为前提 | 默认关闭 SSH,通过 SSM 代理的 API 进行管理 |
| 强制访问控制 | 取决于发行版与配置 | 默认启用 SELinux |
| OS 更新粒度 | 按软件包更新,可能出现依赖问题 | 按镜像原子更新;A/B 分区在新镜像启动失败时自动回滚 |
| 排查故障的入口 | 直接登录主机 | 从专用容器临时访问 |
与 ECS/EKS 的集成与运维
Bottlerocket 提供同时支持 ECS 和 EKS 的 AMI。在 EKS 中,只需在托管节点组的 AMI 类型中选择 Bottlerocket 即可使用。Karpenter(节点自动扩缩器)也可以指定 Bottlerocket AMI。在 ECS 中,使用 ECS 优化的 Bottlerocket AMI 启动容器实例。配置通过 TOML 格式的用户数据进行,指定 Kubernetes 的集群信息或 ECS 的集群名称。使用 Bottlerocket Update Operator(EKS 用),可以将依次更新集群内节点的滚动更新自动化。自动执行节点排空(Pod 的驱逐)→ 更新 → 重新加入的循环,在不中断服务的情况下更新 OS。Bottlerocket 可免费使用,只收取 EC2 实例的费用。
Bottlerocket 的费用
Bottlerocket 可免费使用。即使选择 Bottlerocket AMI 作为 EC2 实例的 OS,也只收取与 Amazon Linux 2 相同的 EC2 实例费用。不产生 OS 许可证费用。引入 Bottlerocket 不会直接降低成本,但通过自动应用安全补丁减少运维工时、通过缩小攻击面降低安全事件的应对成本,是间接的成本优势。
最小化配置 OS 的优势
Bottlerocket 是专门用于运行容器的最小化配置 OS。通用 OS 包含运行容器所不需要的许多软件包和工具,存在成为攻击目标和漏洞温床的可能性。Bottlerocket 通过削减不需要的要素,把攻击面控制得很小。由于配置轻量,启动也快,横向扩展时的启动很敏捷。使用只具备容器主机所需功能的专用 OS,与沿用通用 OS 相比,可以在安全和运维效率两方面获得优势。
自动更新与回滚
Bottlerocket 具备安全进行 OS 更新的机制。更新采用将新版本写入与运行中区域不同的区域,然后整体切换的方式。这样可以防止更新停留在不完整的状态,确保保持在新旧其中一种状态。更新后出现问题时,可以自动恢复到以前的版本,因此能够抑制更新导致故障的风险。与逐个少量更新软件包的传统方式不同,由于整体替换整个 OS,也不会产生配置上的差异。安全的更新机制使主机保持最新且稳定的状态。
运维模式的差异
Bottlerocket 采用了与通用 OS 不同的运维模式。配置不是通过直接登录服务器手工修改,而是通过 API 或管理工具进行。由于默认不具备用于登录的外壳程序,因此不以人员进入服务器单独修改为前提。这样,配置得以声明式管理,服务器之间的差异变得不易产生。需要调查时,使用专用容器临时访问。摒弃手工变更、习惯于将其作为不可变基础设施来对待的运维,是活用 Bottlerocket 的前提。
采用时的考虑事项
Bottlerocket 适合作为在 ECS 或 EKS 上运行容器的主机,并分别准备了对应的版本。考虑采用时,要确认自己的工作负载是否完全在容器内完成。不适合在主机 OS 上直接安装自有软件来使用的运维方式。将监控和日志收集设计为通过容器的机制而非主机来进行。从通用 OS 迁移时,由于运维流程会发生变化,团队也需要做好适应新模式的准备。如果与以容器为中心的运维相契合,就能获得安全与效率方面的巨大优势。
总结 - Bottlerocket 的活用指南
Bottlerocket 是针对容器工作负载优化的最小化 Linux OS。不可变文件系统、SELinux、dm-verity、原子更新带来的高安全性,以及与 ECS/EKS 的原生集成是其主要优势。在 ECS 或 EKS 中运行基于 EC2 的工作节点时,从 Amazon Linux 2 迁移到 Bottlerocket,可以实现安全性的强化和 OS 管理的简化。使用 Fargate 时无需管理主机 OS,因此 Bottlerocket 没有用武之地。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。