AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 544439
Accepted
EEAA
EEAA
Asked: 2013-10-08 13:06:24 +0800 CST2013-10-08 13:06:24 +0800 CST 2013-10-08 13:06:24 +0800 CST

AWS CloudFormation:VPC 默认安全组

  • 772

我有一个 cfn 堆栈(除其他外),它创建了一个 VPC、几个安全组和一些 EC2 实例。将在堆栈中创建的安全组分配给也由堆栈创建的实例很简单。但是,我对默认的 VPC SG 很感兴趣。

创建 VPC 时(无论是通过 GUI 手动、通过 cloudformation 还是任何其他方式),AWS 都会为该组中的任何实例创建一个带有“全部允许”规则的默认安全组。

我要做的是将此默认安全组与其他几个 SG 一起分配给堆栈创建的实例。事实证明,这比我预期的要困难得多。以下是一些片段,显示了我正在做的事情:

"AllowSSHSecGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Allow SSH from anywhere",
        "VpcId":{
          "Ref":"DevVPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":"22",
            "ToPort":"22",
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
},
"Instance001" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-7eab224e",
        "InstanceType" : "m1.large",
        "AvailabilityZone" : "us-west-2a",
        "PrivateIpAddress" : "10.22.0.110",
        "SecurityGroupIds" : [ {"Ref" : "AllowSSHSecGroup"} ],
        "SubnetId" : { "Ref" : "PublicSubnet" },
        "KeyName" : "erik-key",
        "DisableApiTermination" : "false",
        "Tags" : [ { "Key": "Name", "Value": "Instance001"} ]
      }
}

在上面的代码片段中,我创建了一个“允许 ssh”安全组并将其分配给一个实例。如前所述,我的堆栈还创建了一个 VPC(此实例在其中启动),这反过来又创建了一个默认安全组。不幸的是,由于这个组是由 AWS 自动创建的,它的组 ID 对堆栈不可用,因此无法通过 ID 引用。我最初认为该SecurityGroups属性将是一个选项,因为这将允许我通过其名称引用默认 SG default,. 但是,这不起作用,因为该SecurityGroups属性仅适用于 EC2 安全组,而不适用于 VPC 安全组。

所以我被困住了。我已经在这方面向 AWS 支持提出了一个案例,但到目前为止,他们并没有提供帮助。关于我如何做到这一点的任何想法?

amazon-ec2
  • 3 3 个回答
  • 21750 Views

3 个回答

  • Voted
  1. IanBlenke
    2015-06-28T10:30:01+08:002015-06-28T10:30:01+08:00

    可以使用以下方式引用默认安全组:

    { "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] }
    

    其中“VPC”是您的 VPC 资源名称。

    使用AWS::EC2::SecurityGroupIngress和AWS::EC2::SecurityGroupEgress,您可以增加此默认安全组的权限。

    我认为这就是你想要的:

    "VPCDefaultSecurityGroupIngress": {
      "Type" : "AWS::EC2::SecurityGroupIngress",
      "Properties" : {
        "GroupId": { "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] },
        "IpProtocol":"tcp",
        "FromPort":"22",
        "ToPort":"22",
        "CidrIp":"0.0.0.0/0"
      }
    },
    

    正如@artbristol 和@gabriel 所提到的,这允许在单个堆栈部署中将入口/出口规则添加到VPC 的默认安全组。

    我很确定自引用问题仍然会影响任何尝试更改 VPC 的默认安全组上的任何其他属性的尝试。一个很好的例子是添加标签或描述。如果您希望更改这些内容,则必须处理周围存在的无关安全组。

    • 25
  2. Best Answer
    EEAA
    2013-10-09T06:44:03+08:002013-10-09T06:44:03+08:00

    好吧,事实证明,AWS 支持人员回复并通知我,他们认识到这是 CloudFormation 中的一个功能差距,并且它已作为功能请求提交给开发团队。

    因此,在实施此功能之前,解决方法是创建您自己的“默认”安全组,复制与“真实”默认 SG 相同的行为。不幸的是,由于这种设置的自引用方面,仍然不可能在一个单一的堆栈部署中进行。另一种方法是部署一次堆栈,而不为您的实例分配默认安全组。然后,一旦创建了堆栈(并且您有机会看到默认的安全组 ID 是什么),您可以将该 SG ID 添加到您的实例中。

    • 10
  3. apollowebdesigns
    2020-12-09T03:20:03+08:002020-12-09T03:20:03+08:00

    在撰写 2020 年 12 月更新/扩展时,

    扩展一下这个答案

    对于一些参考资料,获取默认安全组,您现在可以使用AWS Cloudformation VPC 文档中引用的 get 属性

    我个人使用 yaml,所以如果这有助于其他人想知道如何在 yaml 中引用 VPC 的默认安全组,这就是:

    !GetAtt VPC.DefaultSecurityGroup
    

    还显示了一个取自此答案的 yaml 格式的示例,以便在上下文中查看它:

    myELBIngressGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: ELB ingress group
        SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 22
            ToPort: 22
            GroupId: !GetAtt VPC.DefaultSecurityGroup
            CidrIp: "0.0.0.0/0"
    
    • 0

相关问题

  • 权限被拒绝(公钥)。从本地 Ubuntu 到 Amazon EC2 服务器的 SSH

  • 管理员如何管理他们的 EC2 EBS 和快照?

  • 云有多大?[关闭]

  • EC2 映像启动

  • 如何将安全组添加到正在运行的 EC2 实例?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve