AWS CloudFormation: группа безопасности по умолчанию VPC

16

У меня есть стек cfn, который (помимо прочего) создает VPC, несколько групп безопасности и несколько экземпляров EC2. Тривиально назначить группы безопасности, созданные в стеке, экземплярам, ​​которые также создаются в стеке. Однако меня интересует стандартный VPC SG.

Когда создается VPC (вручную, через графический интерфейс пользователя, с помощью облачной информации или любым другим способом), 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"} ]
      }
}

В приведенном выше фрагменте я создаю группу безопасности «allow ssh» и назначаю ее экземпляру. Как уже упоминалось, мой стек также создает VPC (в котором запускается этот экземпляр), который, в свою очередь, создает группу безопасности по умолчанию. К сожалению, поскольку эта группа создается AWS автоматически, ее идентификатор группы недоступен для стека, что делает невозможным обращение по идентификатору. Сначала я подумал, что это SecurityGroupsбудет опция, так как это позволит мне ссылаться на SG по умолчанию по его имени default. Однако это не работает, поскольку это SecurityGroupsсвойство предназначено только для групп безопасности EC2, но не для групп безопасности VPC.

Так что я застрял. Я уже открыл дело с поддержкой AWS на этом, но до сих пор они не были полезны. Любые идеи о том, как я могу сделать это?

EEAA
источник

Ответы:

19

Ссылка на группу безопасности по умолчанию возможна с помощью:

{ "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, это позволяет добавлять правила Ingress / Egress в группу безопасности по умолчанию для VPC при развертывании в одном стеке.

Я почти уверен, что проблема с самоссылкой по-прежнему влияет на любые попытки изменить какие-либо другие свойства в группе безопасности по умолчанию VPC. Хорошим примером этого будет добавление тегов или описание. Если вы хотите изменить эти вещи, вам придется иметь дело с посторонними группами безопасности, расположенными вокруг.

IanBlenke
источник
6

Как выяснилось, служба поддержки AWS ответила и сообщила мне, что они признают, что это пробел в CloudFormation, и он был передан команде разработчиков в виде запроса на функцию.

Поэтому до тех пор, пока эта функция не будет реализована, обходной путь - создать собственную группу безопасности «по умолчанию», которая будет повторять то же поведение, что и «настоящий» SG по умолчанию. К сожалению, из-за самореферентного аспекта этой установки все еще невозможно выполнить в одном развертывании одного стека. Альтернативой является развертывание стека один раз, без назначения группы безопасности по умолчанию для ваших экземпляров. Затем, когда стек создан (и у вас была возможность увидеть, что такое ID группы безопасности по умолчанию), вы можете добавить этот SG ID в свои экземпляры.

EEAA
источник
2
Я полагаю, что если вы будете следовать этому forum.aws.amazon.com/thread.jspa?messageID=466960 и создать SecurityGroupIngress, ссылаясь на свою синтетическую группу безопасности по умолчанию, вы сможете получить необходимую ссылку на себя в рамках развертывания в один стек
artbristol
Это верно. Например, если вы запустите стек CloudFormer в существующем VPC, содержащем группы ссылок по умолчанию, которые ссылаются по умолчанию, он сгенерирует шаблон, в котором SecurityGroupIngress выделен как собственный ресурс с обоими GroupIdи SourceSecurityGroupIdустановлен на{ "Ref": "<SecurityGroupResource>" }
Gabriel
2
Вы случайно не знаете, было ли это обновлено? Необходимость дублировать группу безопасности по умолчанию раздражает.
Пол Макдугалл
FWIW: «Удалить правило по умолчанию» docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Якуб М.