

# Gerenciar grupos de segurança com o CloudFormation
<a name="quickref-ec2-sg"></a>

Os snippets a seguir demonstram como usar o CloudFormation para gerenciar grupos de segurança e instâncias do Amazon EC2 para controlar o acesso aos seus recursos da AWS.

**Topics**
+ [Associar uma instância do Amazon EC2 com um grupo de segurança](#quickref-ec2-instances-associate-security-group)
+ [Criar grupo de segurança com regras de entrada](#quickref-ec2-instances-ingress)
+ [Criar um Elastic Load Balancer com uma regra de entrada de grupos de segurança](#scenario-ec2-security-group-elbingress)

## Associar uma instância do Amazon EC2 com um grupo de segurança
<a name="quickref-ec2-instances-associate-security-group"></a>

Os snippets de exemplo a seguir demonstram como associar uma instância do Amazon EC2 a um grupo de segurança padrão da Amazon VPC usando o CloudFormation.

**Topics**
+ [Associar uma instância do Amazon EC2 a um grupo de segurança padrão da VPC](#using-cfn-getatt-default-values)
+ [Criar uma instância do Amazon EC2 com um grupo de segurança e um volume anexado](#scenario-ec2-volumeattachment)

### Associar uma instância do Amazon EC2 a um grupo de segurança padrão da VPC
<a name="using-cfn-getatt-default-values"></a>

O snippet a seguir cria uma Amazon VPC, uma sub-rede dentro da VPC e uma instância do Amazon EC2. A VPC é criada usando um recurso [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). O intervalo de endereços IP da VPC é definido no modelo maior e é referenciado pelo parâmetro `MyVPCCIDRRange`.

Uma sub-rede é criada dentro da VPC usando um recurso [AWS::EC2:: Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html). A sub-rede está associada à VPC, que é referenciada como `MyVPC`.

Uma instância do EC2 é executada dentro da VPC e na sub-rede usando um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). Esse recurso especifica a imagem de máquina da Amazon (AMI) a ser usada para executar a instância, a sub-rede em que a instância será executada e o grupo de segurança a ser associado à instância. O `ImageId` usa um parâmetro do Systems Manager para recuperar dinamicamente a AMI mais recente do Amazon Linux 2. 

O ID do grupo de segurança é obtido usando a função `Fn::GetAtt`, que recupera o grupo de segurança padrão do recurso `MyVPC`. 

A instância é colocada no recurso `MySubnet` definido no snippet. 

Quando você cria uma VPC usando o CloudFormation, a AWS cria automaticamente recursos padrão dentro da VPC, incluindo um grupo de segurança padrão. No entanto, ao definir uma VPC em um modelo do CloudFormation, você talvez não tenha acesso aos IDs desses recursos padrão ao criar o modelo. Para acessar e usar os recursos padrão especificados no modelo, você pode usar funções intrínsecas, como `Fn::GetAtt`. Essa função permite que você trabalhe com os recursos padrão que são criados automaticamente pelo CloudFormation.

#### JSON
<a name="quickref-ec2-example-15.json"></a>

```
"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": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "SecurityGroupIds": [
            {
                "Fn::GetAtt": [
                    "MyVPC",
                    "DefaultSecurityGroup"
                ]
            }
        ],
        "SubnetId": {
            "Ref": "MySubnet"
        }
    }
}
```

#### YAML
<a name="quickref-ec2-example-15.yaml"></a>

```
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: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    SecurityGroupIds:
      - Fn::GetAtt:
          - MyVPC
          - DefaultSecurityGroup
    SubnetId:
      Ref: MySubnet
```

### Criar uma instância do Amazon EC2 com um grupo de segurança e um volume anexado
<a name="scenario-ec2-volumeattachment"></a>

O snippet a seguir cria uma instância do Amazon EC2 usando um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html), que é executado de uma AMI designada. A instância está associada a um grupo de segurança que permite a entrada de tráfego SSH na porta 22 de um endereço IP especificado, usando um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html). Ele cria um volume do Amazon EBS de 100 GB usando um recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html). O volume é criado na mesma zona de disponibilidade da instância, conforme especificado pela função `GetAtt`, e é montado na instância no dispositivo `/dev/sdh`.

Para obter mais informações sobre criar volumes do Amazon EBS, consulte [Criar um volume do Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-14.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "SecurityGroups": [
 5.             {
 6.                 "Ref": "InstanceSecurityGroup"
 7.             }
 8.         ],
 9.         "ImageId": "ami-1234567890abcdef0"
10.     }
11. },
12. "InstanceSecurityGroup": {
13.     "Type": "AWS::EC2::SecurityGroup",
14.     "Properties": {
15.         "GroupDescription": "Enable SSH access via port 22",
16.         "SecurityGroupIngress": [
17.             {
18.                 "IpProtocol": "tcp",
19.                 "FromPort": "22",
20.                 "ToPort": "22",
21.                 "CidrIp": "192.0.2.0/24"
22.             }
23.         ]
24.     }
25. },
26. "NewVolume": {
27.     "Type": "AWS::EC2::Volume",
28.     "Properties": {
29.         "Size": "100",
30.         "AvailabilityZone": {
31.             "Fn::GetAtt": [
32.                 "Ec2Instance",
33.                 "AvailabilityZone"
34.             ]
35.         }
36.     }
37. },
38. "MountPoint": {
39.     "Type": "AWS::EC2::VolumeAttachment",
40.     "Properties": {
41.         "InstanceId": {
42.             "Ref": "Ec2Instance"
43.         },
44.         "VolumeId": {
45.             "Ref": "NewVolume"
46.         },
47.         "Device": "/dev/sdh"
48.     }
49. }
```

#### YAML
<a name="quickref-ec2-example-14.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     SecurityGroups:
 5.       - !Ref InstanceSecurityGroup
 6.     ImageId: ami-1234567890abcdef0
 7. InstanceSecurityGroup:
 8.   Type: AWS::EC2::SecurityGroup
 9.   Properties:
10.     GroupDescription: Enable SSH access via port 22
11.     SecurityGroupIngress:
12.       - IpProtocol: tcp
13.         FromPort: 22
14.         ToPort: 22
15.         CidrIp: 192.0.2.0/24
16. NewVolume:
17.   Type: AWS::EC2::Volume
18.   Properties:
19.     Size: 100
20.     AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
21. MountPoint:
22.   Type: AWS::EC2::VolumeAttachment
23.   Properties:
24.     InstanceId: !Ref Ec2Instance
25.     VolumeId: !Ref NewVolume
26.     Device: /dev/sdh
```

## Criar grupo de segurança com regras de entrada
<a name="quickref-ec2-instances-ingress"></a>

Os snippets de exemplo a seguir demonstram como configurar grupos de segurança com regras de entrada específicas usando o CloudFormation.

**Topics**
+ [Criar um grupo de segurança com regras de entrada para acesso SSH e HTTP](#scenario-ec2-security-group-rule)
+ [Criar um grupo de segurança com regras de entrada para acesso HTTP e SSH de intervalos CIDR especificados](#scenario-ec2-security-group-two-ports)
+ [Criar grupos de segurança de referência cruzada com regras de entrada](#scenario-ec2-security-group-ingress)

### Criar um grupo de segurança com regras de entrada para acesso SSH e HTTP
<a name="scenario-ec2-security-group-rule"></a>

Esse snippet descreve duas regras de entrada do grupo de segurança usando um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html). A primeira regra de entrada permite o acesso SSH (porta 22) de um grupo de segurança existente chamado `MyAdminSecurityGroup`, que pertence à conta da AWS com o número de conta `1111-2222-3333`. A segunda regra de entrada permite o acesso HTTP (porta 80) de outro grupo de segurança chamado`MySecurityGroupCreatedInCFN`, que é criado no mesmo modelo. A função `Ref` é usada para fazer referência ao nome lógico do grupo de segurança criado no mesmo modelo. 

Na primeira regra de entrada, você deve adicionar um valor para as propriedades `SourceSecurityGroupOwnerId` e `SourceSecurityGroupName`. Na segunda regra de entrada, `MySecurityGroupCreatedInCFNTemplate` faz referência a outro grupo de segurança criado no mesmo modelo. Verifique se o nome lógico `MySecurityGroupCreatedInCFNTemplate` corresponde ao nome lógico real do recurso do grupo de segurança que você especifica no modelo maior. 

Para obter mais informações sobre grupos de segurança, consulte [Grupos de segurança do Amazon EC2 para suas instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-10.json"></a>

```
 1. "SecurityGroup": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "Allow connections from specified source security group",
 5.         "SecurityGroupIngress": [
 6.             {
 7.                 "IpProtocol": "tcp",
 8.                 "FromPort": "22",
 9.                 "ToPort": "22",
10.                 "SourceSecurityGroupName": "MyAdminSecurityGroup",
11.                 "SourceSecurityGroupOwnerId": "1111-2222-3333"
12.             },
13.             {
14.                 "IpProtocol": "tcp",
15.                 "FromPort": "80",
16.                 "ToPort": "80",
17.                 "SourceSecurityGroupName": {
18.                     "Ref": "MySecurityGroupCreatedInCFNTemplate"
19.                 }
20.             }
21.         ]
22.     }
23. }
```

#### YAML
<a name="quickref-ec2-example-10.yaml"></a>

```
 1. SecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified source security group
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: '22'
 8.         ToPort: '22'
 9.         SourceSecurityGroupName: MyAdminSecurityGroup
10.         SourceSecurityGroupOwnerId: '1111-2222-3333'
11.       - IpProtocol: tcp
12.         FromPort: '80'
13.         ToPort: '80'
14.         SourceSecurityGroupName:
15.           Ref: MySecurityGroupCreatedInCFNTemplate
```

### Criar um grupo de segurança com regras de entrada para acesso HTTP e SSH de intervalos CIDR especificados
<a name="scenario-ec2-security-group-two-ports"></a>

O snippet a seguir cria um grupo de segurança para uma instância do Amazon EC2 com duas regras de entrada. As regras de entrada permitem o tráfego TCP de entrada nas portas especificadas dos intervalos CIDR designados. Um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) é usado para especificar as regras. Você deve especificar um protocolo para cada regra. Para TCP, você deve especificar uma porta ou um intervalo de portas. Se você não especificar um grupo de segurança de origem ou um intervalo CIDR, a pilha será executada com êxito, mas a regra não será aplicada ao grupo de segurança. 

Para obter mais informações sobre grupos de segurança, consulte [Grupos de segurança do Amazon EC2 para suas instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-9.json"></a>

```
 1. "ServerSecurityGroup": {
 2.   "Type": "AWS::EC2::SecurityGroup",
 3.   "Properties": {
 4.     "GroupDescription": "Allow connections from specified CIDR ranges",
 5.     "SecurityGroupIngress": [
 6.       {
 7.         "IpProtocol": "tcp",
 8.         "FromPort": "80",
 9.         "ToPort": "80",
10.         "CidrIp": "192.0.2.0/24"
11.       },
12.       {
13.         "IpProtocol": "tcp",
14.         "FromPort": "22",
15.         "ToPort": "22",
16.         "CidrIp": "192.0.2.0/24"
17.       }
18.     ]
19.   }
20. }
```

#### YAML
<a name="quickref-ec2-example-9.yaml"></a>

```
 1. ServerSecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified CIDR ranges
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: 80
 8.         ToPort: 80
 9.         CidrIp: 192.0.2.0/24
10.       - IpProtocol: tcp
11.         FromPort: 22
12.         ToPort: 22
13.         CidrIp: 192.0.2.0/24
```

### Criar grupos de segurança de referência cruzada com regras de entrada
<a name="scenario-ec2-security-group-ingress"></a>

O snippet a seguir usa o recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) para criar dois grupos de segurança do Amazon EC2: `SGroup1` e `SGroup2`. As regras de entrada que permitem a comunicação entre os dois grupos de segurança são criadas usando o recurso [AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html). `SGroup1Ingress` estabelece uma regra de entrada para `SGroup1` que permite o tráfego TCP de entrada na porta 80 do grupo de segurança de origem, `SGroup2`. `SGroup2Ingress` estabelece uma regra de entrada para `SGroup2` que permite o tráfego TCP de entrada na porta 80 do grupo de segurança de origem, `SGroup1`. 

#### JSON
<a name="quickref-ec2-example-12.json"></a>

```
 1. "SGroup1": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "EC2 instance access"
 5.     }
 6. },
 7. "SGroup2": {
 8.     "Type": "AWS::EC2::SecurityGroup",
 9.     "Properties": {
10.         "GroupDescription": "EC2 instance access"
11.     }
12. },
13. "SGroup1Ingress": {
14.     "Type": "AWS::EC2::SecurityGroupIngress",
15.     "Properties": {
16.         "GroupName": {
17.             "Ref": "SGroup1"
18.         },
19.         "IpProtocol": "tcp",
20.         "ToPort": "80",
21.         "FromPort": "80",
22.         "SourceSecurityGroupName": {
23.             "Ref": "SGroup2"
24.         }
25.     }
26. },
27. "SGroup2Ingress": {
28.     "Type": "AWS::EC2::SecurityGroupIngress",
29.     "Properties": {
30.         "GroupName": {
31.             "Ref": "SGroup2"
32.         },
33.         "IpProtocol": "tcp",
34.         "ToPort": "80",
35.         "FromPort": "80",
36.         "SourceSecurityGroupName": {
37.             "Ref": "SGroup1"
38.         }
39.     }
40. }
```

#### YAML
<a name="quickref-ec2-example-12.yaml"></a>

```
 1. SGroup1:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: EC2 Instance access
 5. SGroup2:
 6.   Type: AWS::EC2::SecurityGroup
 7.   Properties:
 8.     GroupDescription: EC2 Instance access
 9. SGroup1Ingress:
10.   Type: AWS::EC2::SecurityGroupIngress
11.   Properties:
12.     GroupName: !Ref SGroup1
13.     IpProtocol: tcp
14.     ToPort: 80
15.     FromPort: 80
16.     SourceSecurityGroupName: !Ref SGroup2
17. SGroup2Ingress:
18.   Type: AWS::EC2::SecurityGroupIngress
19.   Properties:
20.     GroupName: !Ref SGroup2
21.     IpProtocol: tcp
22.     ToPort: 80
23.     FromPort: 80
24.     SourceSecurityGroupName: !Ref SGroup1
```

## Criar um Elastic Load Balancer com uma regra de entrada de grupos de segurança
<a name="scenario-ec2-security-group-elbingress"></a>

O modelo a seguir cria um recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) na zona de disponibilidade especificada. O recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) está configurado para receber tráfego HTTP na porta 80 e direcionar solicitações para instâncias também na porta 80. O Elastic Load Balancer é responsável pelo balanceamento de carga do tráfego HTTP de entrada entre as instâncias.

 Além disso, esse modelo gera um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) associado ao balanceador de carga. Esse grupo de segurança é criado com uma única regra de entrada, descrita como `ELB ingress group`, que permite o tráfego TCP de entrada na porta 80. A origem dessa regra de entrada é definida usando a função `Fn::GetAtt` para recuperar atributos do recurso do balanceador de carga. `SourceSecurityGroupOwnerId` usa `Fn::GetAtt` para obter o `OwnerAlias` do grupo de segurança de origem do balanceador de carga. `SourceSecurityGroupName` usa `Fn::Getatt` para obter o `GroupName` do grupo de segurança de origem do ELB. 

Essa configuração garante uma comunicação segura entre o ELB e as instâncias. 

Para mais informações sobre balanceamento de carga consulte o [Manual do usuário do Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/).

### JSON
<a name="quickref-ec2-example-11.json"></a>

```
{
    "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
<a name="quickref-ec2-example-11.yaml"></a>

```
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
```