Gerenciar grupos de segurança com o AWS CloudFormation
Os snippets a seguir demonstram como usar o AWS CloudFormation para gerenciar grupos de segurança e instâncias do Amazon EC2 para controlar o acesso aos seus recursos da AWS.
Categorias de snippets
Associar uma instância do Amazon EC2 com um grupo de seguranç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 AWS CloudFormation.
Trechos de exemplo
Associar uma instância do Amazon EC2 a um grupo de segurança padrão da VPC
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. 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. 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. 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. A função Fn::FindInMap
é usada para recuperar valores do mapeamento AWSRegionToAMI
definido no modelo para determinar o ImageId
para o recurso AWS::EC2::Instance.
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 AWS 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 AWS 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 AWS CloudFormation.
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
Criar uma instância do Amazon EC2 com um grupo de segurança e um volume anexado
O snippet a seguir cria uma instância do Amazon EC2 usando um recurso AWS::EC2::Instance, 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. Ele cria um volume do Amazon EBS de 100 GB usando um recurso AWS::EC2::Volume. 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.
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
Criar grupo de segurança com regras de entrada
Os snippets de exemplo a seguir demonstram como configurar grupos de segurança com regras de entrada específicas usando o AWS CloudFormation.
Snippets
Criar um grupo de segurança com regras de entrada para acesso SSH e HTTP
Esse snippet descreve duas regras de entrada do grupo de segurança usando um recurso AWS::EC2::SecurityGroup. 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 chamadoMySecurityGroupCreatedInCFN
, 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 instâncias do Linux ou Grupos de segurança do Amazon EC2 para instâncias do 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
Criar um grupo de segurança com regras de entrada para acesso HTTP e SSH de intervalos CIDR especificados
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 é 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 instâncias do Linux ou Grupos de segurança do Amazon EC2 para instâncias do 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
Criar grupos de segurança de referência cruzada com regras de entrada
O snippet a seguir usa o recurso AWS::EC2::SecurityGroup 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. 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
"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
Criar um Elastic Load Balancer com uma regra de entrada de grupos de segurança
O modelo a seguir cria um recurso AWS::ElasticLoadBalancing::LoadBalancer na zona de disponibilidade especificada. O recurso AWS::ElasticLoadBalancing::LoadBalancer 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 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.
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