amazon-web-services - 如何为 AWS 中的实例类正确创建安全组?
问题描述
所以现在每个可用区有 4 个子网:面向 Internet 的“入口点”子网(与负载均衡器相关联)、用于内部计算的通用“服务”子网、用于所有与数据相关的事物的“数据库”子网以及“外部请求”子网,用于向 Internet 发出请求。这基本上定义了 4 类 EC2 实例。
我现在应该为这 4 类 EC2 实例创建安全组。我想知道的是如何正确地做到这一点(我正在使用 terraform)。
我可以为每个类和每种连接类型创建 1 个用于“入口”(传入)流量的安全组,以及用于“出口”(传出)流量的第二个安全组吗?
所以基本上,我想要这个。我希望互联网入口点与服务对话。该服务只能响应来自互联网的请求,它本身不会发出任何外部互联网请求。该服务可以与数据库和外部请求类对话。数据库只能与服务对话,外部请求只能响应服务。入口点可以以 HTTP 或 HTTPS(或 websockets,仅仅是 HTTPS 吗?)的形式出现。它进入端口 443。这是负载平衡器。然后它将请求转换为 HTTP 并使用端口 3000 连接到计算。我是否应该为每种不同的连接类型设置一个单独的端口?(因此服务层将有 1 个端口供数据库响应,例如 4000,1 个端口供外部请求层响应,例如 5000,等等)。或者那部分重要吗?可以说我们有端口的东西。
- sg1(安全组 1):入口 443 -> 3000(负载均衡器 -> 服务)
- sg2:出口 3000 -> 互联网?那是 0.0.0.0/0 吗?我不希望它只向连接的客户端发出免费请求。
- sg3: ingress 3000 -> 4000 (service -> database),指定数据库子网
- sg3: egress 4000 -> 3000 (database -> service),指定服务子网等
我在正确的轨道上吗?我对此很陌生,并试图弄清楚。任何指导将不胜感激,过去一周我一直在阅读 AWS 文档,但在最佳实践和架构方面几乎没有。
解决方案
每个ENI(弹性网络接口)最多可以指定5 个单独的安全组。每当建立入站或出站入口规则时,都会评估所有可用规则。
关于通信,只要初始连接被安全组允许,安全组规则在任何允许双向通信的网络通信期间建立隧道(允许有状态通信)。
安全组是有状态的——如果您从实例发送请求,则无论入站安全组规则如何,都允许该请求的响应流量流入。无论出站规则如何,都允许对允许的入站流量的响应流出。
例如:
- 入站规则允许来自特定 IP 地址的端口 22 上的 SSH,不存在端口 22 的出站规则。用户可以安全地通过 SSH 连接到服务器而没有连接问题,但无法通过 SSH 连接到另一台服务器。如果服务器应该能够出站,则添加出站规则,默认情况下将允许所有。
从上面的示例中,这意味着如果您不允许 HTTP/HTTPS 的出站规则,则只有通过 HTTP/HTTPS 的入站连接将允许它返回。还要注意您将无法从 Internet 下载的修补程序。
关于源,也许您可以引用逻辑安全组名称而不是指定子网。这意味着如果任何子网中的资源都附加了该安全组,则目标资源将允许入站访问(这仅适用于私有主机到私有主机的连接)。
流量的来源和目标端口或端口范围。源可以是另一个安全组、IPv4 或 IPv6 CIDR 块、单个 IPv4 或 IPv6 地址或前缀列表 ID。
我建议尝试将资源领域保留在单个安全组中(即数据库服务器都在单个安全组中),主要是为了减少管理开销。
您的 VPC页面的安全组中提供了更多信息。
推荐阅读
- python - 如何调整/缩放python Seaborn条形图?
- apache-spark - Spark Structured Streaming 给我错误,因为 org.apache.spark.sql.AnalysisException: 'foreachBatch' 不支持分区;
- python - Django:在for循环中解压元组
- c# - 使用nolock读取的sql server导致等待并行执行的相同查询
- angular - cdk-virtual-scroll-viewport 渲染所有元素
- laravel - 视图中外键列中字段的回显值
- python - 我正在尝试学习 Flask,但 UserMixin 似乎不起作用
- react-native - Axios 总能赶上
- python-3.x - 如何将参数传递给 __init__.py?
- ios - OneSignal iOS 更新问题