如何使用安全组拒绝来自 AWS EC2 实例的所有出站流量?
How to deny all outbound traffic from an AWS EC2 Instance using a Security Group?
我正在尝试设置阻止所有出站流量的 AWS 安全组出口规则。众所周知,默认情况下,安全组允许所有出站流量。
我正在使用 AWS CloudFormation,我们应该如何定义适当的安全出口规则?
在您的 CloudFormation 脚本中,您可以在 'SecurityGroupEgress' 属性下包含自定义规则,如下所示。
"InstanceSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Allow http to client host",
"VpcId" : {"Ref" : "myVPC"},
"SecurityGroupIngress" : [{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}],
"SecurityGroupEgress" : [{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}]
}
}
有关详细信息,请查看 AWS UserGuide。
安全组总是定义允许流量。 安全组没有 DENY 的概念。
因此,如果您希望拒绝所有流量,只需要一个空的安全组。
但是,请注意安全组是 有状态的。这意味着,如果入站安全组允许连接(例如进入 Web 服务器的请求),响应将被自动允许退出 服务器。因此,只有在入站和出站安全组都为空(取决于您的配置)时才真正被阻止。
阻止服务器的其他选项是基于主机的防火墙规则(即操作系统中的配置)或使用在子网级别运行的网络访问控制列表 (NACL)。 NACL 具有可以阻止流量 in/out 子网(但不是特定实例)的拒绝规则。
更新
事实证明,如果没有提供 Egress 规则,则会将默认的 "Allow All" 规则应用于安全组。
因此,您需要提供一个不执行任何操作的规则,以便默认规则不适用。
例如:
"InstanceSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"CidrIp": "0.0.0.0/0"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "tcp",
"FromPort": "1",
"ToPort": "1",
"CidrIp": "0.0.0.0/32"
}
]
}
即使 CloudFormation 不允许空 SecurityGroupEgress
或 SecurityGroupIngress
属性,您也可以通过仅允许所有出站流量到本地主机来欺骗它:
AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template
Resources:
InstanceSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupName: block-outbound
GroupDescription: Allow http to client host
SecurityGroupEgress:
- IpProtocol: -1
CidrIp: 127.0.0.1/32
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
VpcId: !Ref myVPC
这将实现您阻止所有出站流量的目的。
我正在尝试设置阻止所有出站流量的 AWS 安全组出口规则。众所周知,默认情况下,安全组允许所有出站流量。
我正在使用 AWS CloudFormation,我们应该如何定义适当的安全出口规则?
在您的 CloudFormation 脚本中,您可以在 'SecurityGroupEgress' 属性下包含自定义规则,如下所示。
"InstanceSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Allow http to client host",
"VpcId" : {"Ref" : "myVPC"},
"SecurityGroupIngress" : [{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}],
"SecurityGroupEgress" : [{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}]
}
}
有关详细信息,请查看 AWS UserGuide。
安全组总是定义允许流量。 安全组没有 DENY 的概念。
因此,如果您希望拒绝所有流量,只需要一个空的安全组。
但是,请注意安全组是 有状态的。这意味着,如果入站安全组允许连接(例如进入 Web 服务器的请求),响应将被自动允许退出 服务器。因此,只有在入站和出站安全组都为空(取决于您的配置)时才真正被阻止。
阻止服务器的其他选项是基于主机的防火墙规则(即操作系统中的配置)或使用在子网级别运行的网络访问控制列表 (NACL)。 NACL 具有可以阻止流量 in/out 子网(但不是特定实例)的拒绝规则。
更新
事实证明,如果没有提供 Egress 规则,则会将默认的 "Allow All" 规则应用于安全组。
因此,您需要提供一个不执行任何操作的规则,以便默认规则不适用。
例如:
"InstanceSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"CidrIp": "0.0.0.0/0"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "tcp",
"FromPort": "1",
"ToPort": "1",
"CidrIp": "0.0.0.0/32"
}
]
}
即使 CloudFormation 不允许空 SecurityGroupEgress
或 SecurityGroupIngress
属性,您也可以通过仅允许所有出站流量到本地主机来欺骗它:
AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template
Resources:
InstanceSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupName: block-outbound
GroupDescription: Allow http to client host
SecurityGroupEgress:
- IpProtocol: -1
CidrIp: 127.0.0.1/32
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
VpcId: !Ref myVPC
这将实现您阻止所有出站流量的目的。