在亚马逊 ECS 实例上安装安全更新的最佳方法

在亚马逊 ECS 实例上安装安全更新的最佳方法

我们正在使用Ansible对运行有状态服务(例如数据库、搜索引擎等)的所有 EC2 实例推出安全更新。这很有效。

我想知道对 ECS 实例(在 Docker 容器中运行无状态 Web 应用程序)进行安全更新的最佳方法是什么。由于自动扩展,实例数量及其 IP 地址具有很大的动态性。Ansible使用硬编码的 IP 地址列表(hosts 文件),因此它似乎并不真正适合目的。

更新这些实例是否是个好主意,或者我们应该时不时地拆除它们并生成新的实例?

有没有来自 DevOps 人员的最佳实践?

更新:

我发现 Ansible 支持动态清单。脚本它从 AWS 获取有关主机的信息并为 Ansible 生成动态库存,这可以正常工作。

但是还有一个问题,每当有我之前没有连接过的新主机时,就会显示以下消息,必须手动确认。

The authenticity of host '10.0.1.247 (10.0.1.247)' can't be established.
ECDSA key fingerprint is SHA256:GSogs6P6CzbOzLm9ByWsXkfz7/2A4qwj4PDvczApS/I.
Are you sure you want to continue connecting (yes/no)? yes

这很烦人,因为我想实现一个完全自动化的更新机制。有办法解决这个问题吗?

答案1

每当有我之前没有连接过的新主机时,就会显示以下消息,必须手动确认。[ ] 这个问题有解决办法吗?

修改ssh_connectionansible.cfg,以便它包含-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null参数。

例如:

[ssh_connection]
ssh_args = -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s

答案2

就地升级容器完全是反模式。这很麻烦,因为你需要升级每个容器,甚至可能需要提交每个容器。

相反,更新用于生成容器的镜像。这通常是通过在您的镜像上设置一个部分来Dockerfile确保镜像是最新的,因此修补过程基本上就是重建镜像。例如:

FROM centos:7.2.1511
MAINTAINER Jane Doe <[email protected]>

RUN yum update -y && \
    yum install -y \
      bar \
      foo && \
    yum clean all
# The rest of your Dockerfile

不过,我发现 ECS 的不足之处在于推出新镜像。您需要自己制定策略以确保不停机。

让服务扫描注册表中的图像以查找漏洞也是最佳做法。

我发现 ECS 缺乏编排功能的另一个方面是无需停机即可修补主机操作系统(可能需要重新启动),因为除了节点之间的 ELB 平衡之外,产品中没有内置任何开箱即用的功能。

其他容器平台(如 OpenShift)具有从节点撤离容器(pod,因为这是 Kubernetes)的能力并将其调度到其他地方。负载均衡器知道这些变化,确保零停机时间。此外,通常与 OpenShift 一起使用的操作系统有一个改进的修补机制RPM OSTree这大大降低了修补主机操作系统的复杂性。

相关内容