AWS CloudFormation: domyślna grupa zabezpieczeń VPC

16

Mam stos cfn, który (między innymi) tworzy VPC, kilka grup zabezpieczeń i garść instancji EC2. Trywialne jest przypisywanie grup zabezpieczeń tworzonych w stosie do instancji, które są również tworzone przez stos. Jestem jednak zainteresowany domyślnym VPC SG.

Kiedy tworzony jest VPC (ręcznie przez GUI, w formie chmury lub w jakikolwiek inny sposób), AWS tworzy domyślną grupę zabezpieczeń z regułą „zezwól na wszystko” dla dowolnego wystąpienia w tej grupie.

Usiłuję przypisać tę domyślną grupę zabezpieczeń wraz z kilkoma innymi SG do instancji utworzonych przez stos. Jest to o wiele trudniejsze niż się spodziewałem. Oto kilka fragmentów pokazujących, co się dzieje:

"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"} ]
      }
}

W powyższym fragmencie tworzę grupę zabezpieczeń „zezwól na ssh” i przypisuję ją do instancji. Jak wspomniano, mój stos tworzy również VPC (w którym ta instancja jest uruchamiana), co z kolei tworzy domyślną grupę zabezpieczeń. Niestety, ponieważ ta grupa jest tworzona automatycznie przez AWS, jej identyfikator grupy jest niedostępny dla stosu, co uniemożliwia odwołanie się do niej przez identyfikator. Początkowo uważano, że SecurityGroupsnieruchomość będzie opcja, jako że pozwoli mi odwołać domyślny SG według jego nazwy, default. To jednak nie działa, ponieważ SecurityGroupswłaściwość dotyczy tylko grup zabezpieczeń EC2, a nie grup zabezpieczeń VPC.

Więc utknąłem. I nie otworzyła sprawę ze wsparciem AWS na ten temat, ale do tej pory nie byli pomocni. Jakieś pomysły na to, jak to osiągnąć?

EEAA
źródło

Odpowiedzi:

19

Odwołanie do domyślnej grupy zabezpieczeń jest możliwe przy użyciu:

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

Gdzie „VPC” to nazwa Twojego zasobu VPC.

Za pomocą AWS::EC2::SecurityGroupIngressi AWS::EC2::SecurityGroupEgressmożesz zwiększyć uprawnienia tej domyślnej grupy zabezpieczeń.

Myślę, że tego właśnie chcesz:

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

Jak wspomniano przez @artbristol i @gabriel, pozwala to na dodanie reguł Ingress / Egress do domyślnej grupy zabezpieczeń dla VPC w pojedynczym stosie.

Jestem prawie pewien, że problem autoreferencji nadal wpływa na wszelkie próby zmiany jakichkolwiek innych właściwości domyślnej grupy zabezpieczeń VPC. Dobrym przykładem może być dodanie tagów lub opisu. Jeśli chcesz to zmienić, będziesz musiał poradzić sobie z leżącymi wokół grupami bezpieczeństwa.

IanBlenke
źródło
6

Jak się okazuje, obsługa AWS odpowiedziała i poinformowała mnie, że uznają, że jest to luka w funkcji w CloudFormation, i została przesłana do zespołu programistów jako prośba o funkcję.

Tak więc, dopóki ta funkcja nie zostanie wdrożona, obejściem tego problemu jest utworzenie własnej „domyślnej” grupy zabezpieczeń, która replikuje to samo zachowanie, co „rzeczywista” domyślna SG. Niestety, ze względu na samoreferencyjny aspekt tej konfiguracji, nadal nie można tego zrobić w ramach wdrożenia pojedynczego stosu. Alternatywą jest jednorazowe wdrożenie stosu bez przypisywania domyślnej grupy zabezpieczeń do instancji. Następnie po utworzeniu stosu (i gdy miałeś okazję zobaczyć domyślny identyfikator grupy zabezpieczeń), możesz dodać ten identyfikator SG do swoich instancji.

EEAA
źródło
2
Uważam, że jeśli podążasz za tym forums.aws.amazon.com/thread.jspa?messageID=466960 i utworzysz SecurityGroupIngress, odnosząc się do swojej syntetycznej domyślnej grupy zabezpieczeń, możesz uzyskać odnośnik, który chcesz, w ramach wdrożenia pojedynczego stosu
artbristol
To jest poprawne. Na przykład, jeśli uruchomisz stos CloudFormer na istniejącym VPC zawierającym domyślne, samoreferencyjne grupy bezpieczeństwa, wygeneruje szablon, w którym SecurityGroupIngress jest podzielony jako własny zasób z obydwoma GroupIdi SourceSecurityGroupIdustawiony na{ "Ref": "<SecurityGroupResource>" }
Gabriel
2
Czy wiesz, czy to zostało zaktualizowane? Konieczność zduplikowania domyślnej grupy zabezpieczeń jest denerwująca.
Paul MacDougall,
FWIW: „Usuń domyślną regułę” docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Jakub M.