关于使用 AWS Managed Prefix List 保护CloudFront 到 EC2 的连接安全
背景
在做公司的项目中,CloudFront 到 EC2 的直接连接时,我们通常需要限制只有来自 CloudFront 的请求才能访问 EC2 实例,拒绝其他未经授权的访问。传统上有以下两种实现方式:
- 使用自定义 HTTP 头
可以在 CloudFront 端设置添加自定义 HTTP 头,然后在 EC2 端校验这个头,只有包含预设头的请求才被允许。这种方式的缺点是需要保密自定义头的名称与内容,一旦泄露就可被绕过。
- 限制 CloudFront IP 段
可以仅允许 CloudFront 已知的 IP 段访问 EC2 实例。但由于 CloudFront 的 IP 段会不定期变更,维护起来非常麻烦。
所以CloudFront→EC2的流量普遍都是全开443端口的安全组。
然而经过一些学习,我发现了一个叫做Managed Prefix List 的东西,这是个什么玩意儿?我之前甚至都没听过,VPC的什么东西吗?
经过自己验证,发现通过这个东西真的可以轻松达到上面的目标。通过他的设置就可以限制只允许CloudFront的流量通过EC2。
AWS Managed Prefix List是什么
在AWS中管理安全组时,当需要设置多条针对不同IP地址的规则时,设置会变得非常麻烦。例如,对同一个IP地址设置不同协议的访问许可,就需要重复创建多条规则。
这时,Prefix List就可以大大简化这一设置过程。本文将介绍什么是Prefix List,以及如何使用它简化安全组的设置。
Prefix List是一组CIDR块的集合。
CIDR块是指表示IP地址范围的网络块(例如10.0.0.0/24)。可以简单理解为IP地址段。
通过提前创建Prefix List,可以简化路由表和安全组的设置和管理。
Prefix List的类型
Prefix List分为两种:
- 客户管理的Prefix List:用户自行创建和管理的Prefix List
- AWS管理的Prefix List:AWS预定义的Prefix List
客户管理的Prefix List使用规则
使用客户管理的Prefix List需要注意以下规则:
- 每个Prefix List只能包含IPv4或IPv6地址,不能同时包含两者
- Prefix List只在创建的区域中可用
- List中的前缀条目数量会计算在配额中
注意这几点,使用上不会遇到大的问题。因为配额非常大,所以一般不会达到限制。
下面我用AWS控制台示例展示如何创建和使用Prefix List。以这次的背景CloudFront→EC2为例
创建客户管理的Prefix List
-
在VPC控制台,选择“托管前缀列表”
-
找到前缀列表 ID:
pl-58a04531
的com.amazonaws.global.cloudfront.origin-facing
-
可以看到条目里面已经定义好了IP段
- 我们来到安全组设置设置他,最后点击保存即可
这样就可以通过选择Prefix List轻松批量添加规则,无需一个个IP地址配置,大大简化了安全组的管理。
AWS管理的Prefix List
AWS管理的Prefix List是AWS预先定义好的,用户无法修改。
不同的AWS管理Prefix List权重不同,会计算在安全组规则配额中。
例如:
- com.amazonaws.region.s3:权重1
- com.amazonaws.region.dynamodb:权重1
- com.amazonaws.global.cloudfront.origin-facing:权重55
权重即该List占用的规则数。安全组默认配额是60条规则。如果使用权重为55的CloudFront List,则剩余规则配额只有5条。
通过选择CloudFront的Prefix List,可以直接限制只允许CloudFront的访问。
总结
使用Prefix List可以大大简化安全组和路由表的管理。配合不同类型的Prefix List使用,可以实现灵活的网络访问控制。当然遇到很多IP段需要定义的时候使用这个功能你就可以不用一条一条去配置安全组了。
我开始也是好奇如何限制CloudFront→EC2的流量通过搜索发现这个的,实际在使用S3的VPC端点(网关型)时,也会使用AWS管理的Prefix List,通常不太会特意注意到。但它会自动添加到路由表中。看来AWS需要学习的东西还很多。
参考
https://dev.classmethod.jp/articles/amazon-cloudfront-managed-prefix-list/