AWS 的 Elastic Compute Cloud(通常称为 EC2)是一项服务,允许组织启动可用于托管和运行应用程序、数据库等的虚拟机。EC2 实例具有多种选项,从选择 CPU 内核数量到磁盘空间、内存和操作系统等等。EC2 服务还包含不同的配置选项和设置,供实例使用。本叔说过,“能力越大,责任越大”,在这种情况下,有很多设置可供选择,就会出现很多错误配置。因此,本文将介绍如何安全地配置我们的 EC2 实例。
尽管这不是为保护您的实例而采取的详尽操作列表,但这些配置是一个很好的起点,因为它们易于理解和实施。随着人们熟悉 AWS 及其各种其他服务,可以采取其他(高级)措施来进一步加强 EC2 实例的安全性。目前,我们将坚持直接适用于 EC2 实例的安全设置列表。
实例元数据服务 (IMDS) 提供有关实例的信息以及与其关联的各种参数,例如在启动时指定的用户数据。IMDSv1 将凭证存储在端点中,可以检索这些凭证,然后使用这些凭证通过 AWS CLI 执行操作。在凭据被渗透的情况下,这可能是毁灭性的。因此,引入了 IMDSv2 来阻止针对滥用元数据端点的各种攻击。IMDSv2 使用会话但不将会话令牌作为信息存储在端点本身中,因此在后续调用中生成令牌后无法检索令牌。
启动实例时,在“配置实例详细信息”页面下,导航到“高级详细信息”部分,然后:
要在使用 AWS CLI 启动实例时启用 IMDSv2,请在命令中使用以下标志:
aws ec2 run-instances --image-id \--metadata-options "HttpEndpoint=enabled,HttpTokens=required"
运行以下 AWS CLI 命令以修改实例并启用 IMDSv2:
aws ec2 modify-instance-metadata-options --instance-id --http-tokens required --http-endpoint enabled
安全组是定义允许的入站和出站可访问性以及从实例到各种其他资源、在公共互联网上以及在 VPC 内的防火墙。重要的是要确保我们只公开在实例上运行的那些需要的服务,并将访问权限限制在需要它的用户/组。为此,我们需要添加尽可能明确的安全组规则。例如,不使用 0.0.0.0/0 作为 SSH 协议的允许源,我们可以指定需要访问实例的团队明确使用的通用 VPN 作为源。
AWS 有大量文档用于创建和管理可用的安全组和规则。
修补是指将软件更新应用到操作系统以进行性能升级、错误修复和由维护操作系统的供应商发布的安全修复的活动。
修补的步骤因操作系统而异,但基本思路是相同的:使用操作系统的机制检查是否有可用的补丁/更新并应用它。某些补丁程序还需要重新启动系统,尽管情况并非总是如此。
例如,可以执行以下步骤来修补运行 Ubuntu 18.04 作为操作系统的 EC2 实例:
如果我们处理的实例数量很少,手动应用补丁就可以了;比如说,10。但在大多数现实生活中,这个数字通常比这个大,因此手动修补成为一项相当艰巨的任务。值得庆幸的是,AWS 有一项名为 Systems Manager 的服务,简称 SSM。SSM 可以同时在多台机器上执行命令,省去了一次手动访问一台机器的麻烦,使其成为一个非常有用的工具。
“如何在云上修补 Pwnkit 漏洞 (CVE-2021-4034)”在“使用 SSM 修补 AWS 和 GCP 上的多台机器 > AWS”部分下解释了如何使用 AWS SSM 修补多个 EC2 服务器。
存储在 EC2 实例上的数据应定期备份,以避免因磁盘故障、数据损坏等导致数据丢失问题。AWS Data Lifecycle Manager 是一项服务,可用于创建备份计划以自动备份我们的 EBS 卷.
要从控制台使用 Amazon Data Lifecycle Manager 启用定期备份,请执行以下步骤:
要使用带有 AWS CLI 的 Amazon Data Lifecycle Manager 启用定期备份,请执行以下步骤:
{“资源类型”:[“体积”],“目标标签”:[{"Key": "createdBy",“价值”:“阿尤什”}],“时间表”:[{"名称": "每日快照",“复制标签”:是的,“添加标签”:[{“键”:“类型”,“价值”:“我的每日快照”}],“创建规则”:{“间隔”:24,“间隔单位”:“小时”,《时代》:[“03:00”]},“保留规则”:{“计数”:5}}]}
aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn --policy-details file:///path/to/policy.json
EBS 卷应该被加密,以确保它们持有的数据不会被可能已获得该卷访问权限的未经授权的实体读取或滥用。我们可以启用配置以在创建时默认对所有 EBS 卷强制加密。
要使用 AWS CLI 为 AWS 账户启用默认加密,可以使用以下步骤:
要使用 AWS CLI 为 AWS 账户默认启用加密,可以使用以下命令:
aws ec2 enable-ebs-encryption-by-default
上述配置会加密在账户中创建的新 EBS 卷。要加密现有的卷,AWS 的文档可以作为参考。
EBS 快照用作 EBS 卷的备份,可用于恢复实例状态、从备份中启动新实例等。由于 EBS 快照本质上等同于 EBS 卷本身,因此确保快照及其加密对应的 EBS 卷是必要的。
EC2 快照的一个很好的特性是,当为加密卷创建快照时,默认情况下该快照也会被加密。这消除了对启用 EBS 加密设置后创建的快照的加密需求,我们在上一节中配置了加密 EBS 卷。话虽如此,可能存在我们需要加密的未加密旧快照,这可以通过创建未加密快照的副本来完成。对于新复制的快照,我们将启用加密。
要通过控制台为现有的未加密快照启用加密,可以执行以下步骤:
要使用 AWS CLI 为现有快照启用加密,可以运行以下命令:
aws ec2 copy-snapshot --source-region --source-snapshot-id --encrypted --kms-key-id
Amazon 系统映像或 AMI 是 EC2 实例的启动配置包,需要在启动实例时指定。这些 AMI 可以由任何人创建,并与特定的 AWS 账户共享,或者通过将其公开来与所有人共享。这可能导致共享恶意 AMI 的可能性。因此,作为一项安全措施,我们应该为我们的实例自己创建和使用 AMI,或者使用仅由受信任的供应商发布的公共 AMI。Amazon linux Image 就是这样一种受信任的 AMI,它由 Amazon 自己创建和维护。其他镜像也可以信任,尽管基于供应商,而不是名称,例如,可以创建镜像并将其命名为 Ubuntu,但发布者实际上可能与维护和发布 Ubuntu 操作系统的 Canonical Group 没有关联。
在启动映像时选择的 AMI 并不完全是与实例关联的配置,因此在此安全措施的情况下无需采取特定步骤。正在使用的 AMI 需要在使用前和启动实例时进行信任审查:
IAM 角色用于委派权限以对 AWS 资源执行操作并执行其所需角色。当 IAM 角色附加到 EC2 实例时,称为实例角色,服务器可以使用该实例角色执行允许的操作;例如,将本地备份上传到 S3 存储桶。
最小权限访问是一种安全最佳实践,我们添加角色(或在其他情况下,IAM 用户)执行其工作所需的确切权限。将此原则应用于附加到实例的 IAM 角色,仅应将实例执行其作业所需的权限添加到实例角色中,而不是其他任何内容。这可确保在凭据泄露的情况下,将损害降至最低。
为 IAM 角色配置最低权限是非常上下文相关的;即,它不能一概而论。因此,提供实例和各种用例可以使用的不同可能权限组合的详尽列表超出了本文的范围。
Virtual Private Cloud 或 VPC 是一种 AWS 服务,允许用户创建逻辑上相互隔离的虚拟网络。具体来说说EC2实例,举个例子,我们可以想到一些EC2实例只需要访问内部资源,不需要访问互联网的情况。对于此类实例,我们可以创建一个不允许来自 Inte.NET 的入站和出站连接的 VPC,因此只能在同一 VPC 中的资源之间进行通信。AWS 的文档可用于了解如何创建新的 VPC。
执行以下步骤以创建新的 VPC:
运行以下命令创建一个新的 VPC,指定的 CIDR 为 192.168.0.0/16:
aws ec2 create-vpc --cidr-block 192.168.0.0/16
子网是 VPC 中的子组件,可以在较小的虚拟网络中进一步隔离资源。例如,使用 CIDR 块 192.168.0.0/16 创建的 VPC 可以具有子网 192.168.1.0/24 和 192.168.2.0/24,其中两个子网位于同一个 VPC 中,但彼此隔离。
执行以下步骤以创建新的 VPC:
运行以下命令在 CIDR 块 192.168.1.0/24 内创建新子网:
aws ec2 create-subnet --vpc-id --cidr-block 192.168.1.0/24
默认情况下,EC2 实例从启动时就已进行基本监控。基本监控固然不错,但往往不够。这里提供了对 EC2 实例的详细监控,例如 CPU 信用指标、实例指标等。
执行以下步骤以通过控制台启用对 EC2 实例的详细监控:
运行以下 AWS CLI 命令以启用对现有实例的详细监控:
aws ec2 monitor-instances --instance-ids
运行以下 AWS CLI 命令以在启动新实例时启用详细监控:
aws ec2 run-instances --image-id --monitoring Enabled=true #Amongst other options/flags
EC2 是 AWS 提供的一项广泛使用的服务,用于运行我们的应用程序等等。凭借其广泛的可用性列表,还有一长串适用于这些实例的选项,这可能导致错误配置或使用不安全的默认配置。
在本文中,我们了解了我们可以采取的各种安全措施来保护我们的 EC2 实例,其中一些是通过直接在 EC2 实例上应用设置,例如使用受信任的 AMI 或启用 IMDSv2,还有一些与实例切线一致,例如使用 VPC 将各种实例相互隔离或加密 EBS 卷和快照。在所有这些情况下,我们看到了为什么强烈建议使用这些配置,如果不是完全强制应用的话。