Administración de grupos de seguridad con AWS CloudFormation - AWS CloudFormation

Administración de grupos de seguridad con AWS CloudFormation

Los siguientes fragmentos muestran cómo usar AWS CloudFormation para administrar los grupos de seguridad y las instancias de EC2 para controlar el acceso a sus recursos de AWS.

Asociación de una instancia de Amazon EC2 con un grupo de seguridad

Los siguientes fragmentos de ejemplo muestran cómo asociar una instancia de Amazon EC2 a un grupo de seguridad de Amazon VPC predeterminado mediante AWS CloudFormation.

Asociación de una instancia de Amazon EC2 con un grupo de seguridad de VPN predeterminado

El siguiente fragmento crea una VPC de Amazon, una subred dentro de la VPC y una instancia de Amazon EC2. La VPC se crea con un recurso AWS::EC2::VPC. El rango de direcciones IP de la VPC se define en la plantilla más grande y el parámetro MyVPCCIDRRange hace referencia a él.

Se crea una subred dentro de la VPC con un recurso de subred AWS::EC2::Subnet. La subred está asociada a la VPC, a la que se hace referencia como MyVPC.

Se lanza una instancia de EC2 dentro de la VPC y la subred mediante un recurso AWS::EC2::Instance. Este recurso especifica la imagen de máquina de Amazon (AMI) que se utilizará para lanzar la instancia, la subred en la que se ejecutará la instancia y el grupo de seguridad que se asociará a la instancia. La función Fn::FindInMap se utiliza para recuperar valores de la asignación de AWSRegionToAMI definida en la plantilla a fin de determinar el ImageId para el recurso AWS::EC2::Instance.

El ID del grupo de seguridad se obtiene mediante la función Fn::GetAtt, que recupera el grupo de seguridad predeterminado del recurso MyVPC.

La instancia se coloca dentro del recurso MySubnet definido en el fragmento.

Al crear una VPC con AWS CloudFormation, AWS crea automáticamente recursos predeterminados dentro de la VPC, incluido un grupo de seguridad predeterminado. Sin embargo, al definir una VPC dentro de una plantilla de AWS CloudFormation, es posible que no tenga acceso a los ID de estos recursos predeterminados al crear la plantilla. Para acceder a los recursos predeterminados especificados en la plantilla y utilizarlos, puede utilizar funciones intrínsecas, como Fn::GetAtt. Esta función le permite trabajar con los recursos predeterminados que AWS CloudFormation crea automáticamente.

JSON

"MyVPC": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": { "Ref": "MyVPCCIDRRange" }, "EnableDnsSupport": false, "EnableDnsHostnames": false, "InstanceTenancy": "default" } }, "MySubnet": { "Type": "AWS::EC2::Subnet", "Properties": { "CidrBlock": { "Ref": "MyVPCCIDRRange" }, "VpcId": { "Ref": "MyVPC" } } }, "MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Fn::FindInMap": [ "AWSRegionToAMI", { "Ref": "AWS::Region" }, "64" ] }, "SecurityGroupIds": [ { "Fn::GetAtt": [ "MyVPC", "DefaultSecurityGroup" ] } ], "SubnetId": { "Ref": "MySubnet" } } }

YAML

MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: Ref: MyVPCCIDRRange EnableDnsSupport: false EnableDnsHostnames: false InstanceTenancy: default MySubnet: Type: AWS::EC2::Subnet Properties: CidrBlock: Ref: MyVPCCIDRRange VpcId: Ref: MyVPC MyInstance: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - AWSRegionToAMI - Ref: AWS::Region - "64" SecurityGroupIds: - Fn::GetAtt: - MyVPC - DefaultSecurityGroup SubnetId: Ref: MySubnet

Creación de una instancia de Amazon EC2 con un volumen y un grupo de seguridad adjuntos

El siguiente fragmento de código crea una instancia de Amazon EC2 con un recurso AWS::EC2::Instance, que se inicia desde una AMI designada. La instancia está asociada a un grupo de seguridad que permite el tráfico SSH entrante en el puerto 22 desde una dirección IP específica, mediante un recurso AWS::EC2::SecurityGroup. Crea un volumen de Amazon EBS de 100 GB mediante un recurso AWS::EC2::Volume. El volumen se crea en la misma zona de disponibilidad que la instancia, según lo especifique la función GetAtt, y se monta en la instancia del dispositivo /dev/sdh.

Para más información sobre la creación de una instantánea en EBS, consulte Creación de un volumen de Amazon EBS.

JSON

"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "192.0.2.0/24" } ] } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Properties": { "Size": "100", "AvailabilityZone": { "Fn::GetAtt": [ "Ec2Instance", "AvailabilityZone" ] } } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Properties": { "InstanceId": { "Ref": "Ec2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }

YAML

Ec2Instance: Type: AWS::EC2::Instance Properties: SecurityGroups: - !Ref InstanceSecurityGroup ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 192.0.2.0/24 NewVolume: Type: AWS::EC2::Volume Properties: Size: 100 AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone] MountPoint: Type: AWS::EC2::VolumeAttachment Properties: InstanceId: !Ref Ec2Instance VolumeId: !Ref NewVolume Device: /dev/sdh

Creación de grupos de seguridad con reglas de entrada

En los siguientes fragmentos de ejemplo, se muestra cómo configurar grupos de seguridad con reglas de entrada específicas mediante AWS CloudFormation.

Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP

Este fragmento de código muestra un recurso AWS::EC2::SecurityGroup que describe dos reglas de entrada del grupo de seguridad. La primera regla de entrada permite el acceso SSH (puerto 22) desde un grupo de seguridad existente denominado MyAdminSecurityGroup, que es propiedad de la cuenta de AWS con el número de cuenta 1111-2222-3333. La segunda regla de entrada permite el acceso HTTP (puerto 80) desde un grupo de seguridad diferente denominado MySecurityGroupCreatedInCFN, que se crea en la misma plantilla. La función Ref se utiliza para hacer referencia al nombre lógico del grupo de seguridad creado en la misma plantilla.

En la primera regla de entrada, debe agregar un valor para las propiedades SourceSecurityGroupName y SourceSecurityGroupOwnerId. En la segunda regla de entrada, MySecurityGroupCreatedInCFNTemplate hace referencia a un grupo de seguridad diferente, que se crea en la misma plantilla. Compruebe que el nombre lógico MySecurityGroupCreatedInCFNTemplate coincide con el nombre lógico real del recurso del grupo de seguridad que especificó en la plantilla más grande.

Para obtener más información sobre los grupos de seguridad, consulte Grupos de seguridad de Amazon EC2 para instancias de Linux) o Grupos de seguridad de Amazon EC2 para instancias de Windows.

JSON

"SecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Allow connections from specified source security group", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "SourceSecurityGroupName": "MyAdminSecurityGroup", "SourceSecurityGroupOwnerId": "1111-2222-3333" }, { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "SourceSecurityGroupName": { "Ref": "MySecurityGroupCreatedInCFNTemplate" } } ] } }

YAML

SecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Allow connections from specified source security group SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' SourceSecurityGroupName: MyAdminSecurityGroup SourceSecurityGroupOwnerId: '1111-2222-3333' - IpProtocol: tcp FromPort: '80' ToPort: '80' SourceSecurityGroupName: Ref: MySecurityGroupCreatedInCFNTemplate

Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP a partir de rangos CIDR especificados

El siguiente fragmento crea un grupo de seguridad para una instancia de Amazon EC2 con dos reglas de entrada. Las reglas de entrada permiten el tráfico TCP entrante en los puertos especificados desde los rangos de CIDR designados. Se utiliza un recurso AWS::EC2::SecurityGroup para especificar las reglas. Debe especificar un protocolo para cada regla. En el caso de TCP, también debe especificar un puerto o intervalo de puertos. Si no especifica un grupo de seguridad de origen o un rango de CIDR, la pila se iniciará correctamente, pero la regla no se aplicará al grupo de seguridad.

Para obtener más información sobre los grupos de seguridad, consulte Grupos de seguridad de Amazon EC2 para instancias de Linux) o Grupos de seguridad de Amazon EC2 para instancias de Windows.

JSON

"ServerSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Allow connections from specified CIDR ranges", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "CidrIp": "192.0.2.0/24" }, { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "192.0.2.0/24" } ] } }

YAML

ServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow connections from specified CIDR ranges SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 192.0.2.0/24 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 192.0.2.0/24

Creación de grupos de seguridad de referencia cruzada con reglas de entrada

El siguiente fragmento de código utiliza el recurso AWS::EC2::SecurityGroup para crear dos grupos de seguridad de Amazon EC2, SGroup1 y SGroup2. Las reglas de ingreso que permiten la comunicación entre los dos grupos de seguridad se crean mediante el recurso AWS::EC2::SecurityGroupIngress. SGroup1Ingress establece una regla de entrada para SGroup1 que permite el tráfico TCP entrante en el puerto 80 desde el grupo de seguridad de origen, SGroup2. SGroup2Ingress establece una regla de entrada para SGroup2 que permite el tráfico TCP entrante en el puerto 80 desde el grupo de seguridad de origen, SGroup1.

JSON

"SGroup1": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "EC2 instance access" } }, "SGroup2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "EC2 instance access" } }, "SGroup1Ingress": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupName": { "Ref": "SGroup1" }, "IpProtocol": "tcp", "ToPort": "80", "FromPort": "80", "SourceSecurityGroupName": { "Ref": "SGroup2" } } }, "SGroup2Ingress": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupName": { "Ref": "SGroup2" }, "IpProtocol": "tcp", "ToPort": "80", "FromPort": "80", "SourceSecurityGroupName": { "Ref": "SGroup1" } } }

YAML

SGroup1: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Instance access SGroup2: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Instance access SGroup1Ingress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupName: !Ref SGroup1 IpProtocol: tcp ToPort: 80 FromPort: 80 SourceSecurityGroupName: !Ref SGroup2 SGroup2Ingress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupName: !Ref SGroup2 IpProtocol: tcp ToPort: 80 FromPort: 80 SourceSecurityGroupName: !Ref SGroup1

Creación de un equilibrador de carga elástica con una regla de ingreso de grupos de seguridad

La siguiente plantilla crea un recurso AWS::ElasticLoadBalancing::LoadBalancer en la zona de disponibilidad especificada. El recurso AWS::ElasticLoadBalancing::LoadBalancer está configurado para escuchar el tráfico HTTP en el puerto 80 y dirigir las solicitudes a las instancias también en el puerto 80. El equilibrador de carga elástico es responsable de equilibrar la carga del tráfico HTTP entrante entre las instancias.

Además, esta plantilla genera un recurso AWS::EC2::SecurityGroup asociado al equilibrador de carga. Este grupo de seguridad se crea con una única regla de entrada, descrita como ELB ingress group, que permite el tráfico TCP entrante en el puerto 80. El origen de esta regla de entrada se define mediante la función Fn::GetAtt para recuperar los atributos del recurso del equilibrador de carga. SourceSecurityGroupOwnerId utiliza Fn::GetAtt para obtener el grupo de seguridad OwnerAlias del equilibrador de carga. SourceSecurityGroupName utiliza Fn::Getatt para obtener el GroupName del grupo de seguridad de origen del ELB.

Esta configuración garantiza una comunicación segura entre el ELB y las instancias.

Para obtener más información sobre balanceadores de carga, consulte la Guía del usuario de Elastic Load Balancing.

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "MyELB": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": [ "aa-example-1a" ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ] } }, "MyELBIngressGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "ELB ingress group", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupOwnerId": { "Fn::GetAtt": [ "MyELB", "SourceSecurityGroup.OwnerAlias" ] }, "SourceSecurityGroupName": { "Fn::GetAtt": [ "MyELB", "SourceSecurityGroup.GroupName" ] } } ] } } } }

YAML

AWSTemplateFormatVersion: '2010-09-09' Resources: MyELB: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: - aa-example-1a Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP MyELBIngressGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: ELB ingress group SecurityGroupIngress: - IpProtocol: tcp FromPort: '80' ToPort: '80' SourceSecurityGroupOwnerId: Fn::GetAtt: - MyELB - SourceSecurityGroup.OwnerAlias SourceSecurityGroupName: Fn::GetAtt: - MyELB - SourceSecurityGroup.GroupName