AWS CloudFormation: grupo de seguridad predeterminado de VPC

16

Tengo una pila de cfn que (entre otras cosas) crea una VPC, varios grupos de seguridad y un puñado de instancias de EC2. Es trivial asignar grupos de seguridad que se crean dentro de la pila a instancias que también son creadas por la pila. Sin embargo, estoy interesado en el VPC SG predeterminado.

Cuando se crea una VPC (ya sea manualmente a través de la GUI, por formación en la nube o por cualquier otro medio), AWS crea un grupo de seguridad predeterminado con una regla de "permitir todo" para cualquier instancia en ese grupo.

Lo que intento hacer es asignar este grupo de seguridad predeterminado junto con varias otras SG a instancias creadas por la pila. Esto está demostrando ser mucho más difícil de lo que esperaba. Aquí hay algunos fragmentos que muestran lo que estoy pasando:

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

En el fragmento anterior, estoy creando un grupo de seguridad "permitir ssh" y lo asigno a una instancia. Como se mencionó, mi pila también crea una VPC (en la que se inicia esta instancia), que a su vez crea un grupo de seguridad predeterminado. Desafortunadamente, dado que AWS crea este grupo automáticamente, su ID de grupo no está disponible para la pila, por lo que es imposible hacer referencia por ID. Al principio pensé que elSecurityGroups propiedad sería una opción, ya que eso me permitiría hacer referencia a la SG predeterminada por su nombre default,. Sin embargo, eso no funciona, ya que la SecurityGroupspropiedad es solo para Grupos de seguridad EC2, no para Grupos de seguridad VPC.

Entonces estoy atascado. Yo he abierto un caso con el apoyo de AWS en esto, pero hasta ahora, no he sido de ayuda. ¿Alguna idea sobre cómo puedo lograr esto?

EEAA
fuente

Respuestas:

19

Es posible hacer referencia al grupo de seguridad predeterminado utilizando:

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

Donde "VPC" es su nombre de recurso VPC.

Con AWS::EC2::SecurityGroupIngressyAWS::EC2::SecurityGroupEgress , puede aumentar los permisos de este grupo de seguridad predeterminado.

Creo que esto es lo que quieres:

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

Como lo mencionaron @artbristol y @gabriel, esto permite que se agreguen reglas de entrada / salida al grupo de seguridad predeterminado para la VPC en una implementación de pila única.

Estoy bastante seguro de que el problema autorreferencial aún afecta cualquier intento de cambiar cualquiera de las otras propiedades en el grupo de seguridad predeterminado de la VPC. Un buen ejemplo de esto sería agregar etiquetas o una descripción. Si desea cambiar estas cosas, tendrá que lidiar con grupos de seguridad extraños.

IanBlenke
fuente
6

Bueno, como resultado, el soporte de AWS respondió y me informó que reconocen que esta es una brecha de características en CloudFormation, y se ha enviado al equipo de desarrollo como una solicitud de características.

Por lo tanto, hasta que se implemente esta característica, la solución consiste en crear su propio grupo de seguridad "predeterminado" que reproduzca el mismo comportamiento que el SG predeterminado "real". Desafortunadamente, debido al aspecto autorreferencial de esta configuración, todavía no es posible hacerlo dentro de una sola implementación de pila. La alternativa es implementar la pila una vez, sin asignar el grupo de seguridad predeterminado a sus instancias. Luego, una vez que se haya creado la pila (y haya tenido la oportunidad de ver cuál es la ID de grupo de seguridad predeterminada), puede agregar esa ID de SG a sus instancias.

EEAA
fuente
2
Creo que si sigue estos foros.aws.amazon.com/thread.jspa?messageID=466960 y crea un SecurityGroupIngress, refiriéndose a su grupo de seguridad predeterminado sintético, puede obtener la autorreferencia que desea, dentro de una implementación de una sola pila
artbristol
Esto es correcto. Por ejemplo, si ejecuta la pila de CloudFormer en una VPC existente que contiene grupos de seguridad autorreferenciales predeterminados, generará una plantilla donde SecurityGroupIngress se desglosará como su propio recurso con ambos GroupIdy se SourceSecurityGroupIdconfigurará en{ "Ref": "<SecurityGroupResource>" }
Gabriel
2
¿Sabes si esto se ha actualizado? Tener que duplicar el grupo de seguridad predeterminado es molesto.
Paul MacDougall
FWIW: "Eliminar regla predeterminada" docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Jakub M.