【问题标题】:How to deny all outbound traffic from an AWS EC2 Instance using a Security Group?如何使用安全组拒绝来自 AWS EC2 实例的所有出站流量?
【发布时间】:2018-01-19 15:53:49
【问题描述】:

我正在尝试设置阻止所有出站流量的 AWS 安全组出口规则。众所周知,默认情况下,安全组允许所有出站流量。

我正在使用 AWS CloudFormation,我们应该如何定义适当的安全出口规则?

【问题讨论】:

  • 您在实例上运行什么以阻止所有出站访问?你还想连接到实例(例如登录)吗?如果是这样,那仍然需要一些出站访问来让您与实例进行交互。

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

在您的 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

【讨论】:

  • 您好,您可以在 SecurityGroupEgress 属性下添加规则。我的问题实际上要求制定一个规则,使我们能够阻止来自安全组的任何类型的出站流量。默认情况下,它允许所有出站流量。例如,如下所示的规则,允许所有出站流量。 SecurityGroupEgress: - IpProtocol: -1 FromPort: '0' ToPort: '0' CidrIp: 0.0.0.0/0
  • 上面的例子只打开了80端口,因为它定义了,是的,如果没有指定,它将默认允许所有出站流量。
  • 是的,我理解你的例子,但它仍然会打开端口 80。我正在寻找一个什么都不打开的规则。与未定义出口规则时的默认行为相反。请检查我的第一条评论,其中我定义了一个打开所有规则的规则。那种关闭一切的性质。
  • 目前,据我所知,没有办法否认一切。作为替代方案,您可以启用端口值为 -1 的 ICMP,以允许所有代码出站。
【解决方案2】:

安全组始终定义 ALLOW 流量。对于安全组,没有 DENY 的概念

因此,如果您希望拒绝所有流量,只需设置一个空的安全组

但是,请注意安全组是有状态的。这意味着,如果入站安全组允许连接(例如,请求进入 Web 服务器),响应将被自动允许退出服务器。因此,只有当入站和出站安全组都为空(取决于您的配置)时才会真正阻止它。

阻止服务器的其他选项是基于主机的防火墙规则(即操作系统内的配置)或使用在子网级别运行的网络访问控制列表 (NACL)。 NACL 具有 DENY 规则,可以阻止流量进出子网(但不能阻止特定实例)。

更新

事实证明,如果没有提供 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"
      }
    ]
  }

【讨论】:

  • 嗨,John,您能详细说明一下将安全组留空是什么意思吗?我尝试在未定义的情况下保留 SecurityGroupIngress 和 SecurityGroupEgress 属性,但我总是倾向于获得相同的默认行为,即不允许入站流量和允许所有出站流量。
【解决方案3】:

即使 CloudFormation 不允许空的 SecurityGroupEgressSecurityGroupIngress 属性,您也可以通过只允许所有出站流量到 localhost 来欺骗它:

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

这将实现您阻止所有出站流量的目标。

【讨论】:

  • 尽管@JohnRotenstein 的回答非常出色,并且更深入地了解了 CloudFormation 背后发生的事情,但我更喜欢这个作为技术解决方法。 127.0.0.1/32 显然是环回地址。我不得不查找 0.0.0.0/32 甚至意味着什么。 :-)
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2017-09-12
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多