É possível copiar um grupo de segurança da AWS?


17

Temos alguns grupos de segurança que possuem algumas regras. Em vez de ter que recriar as mesmas regras para vários grupos de segurança apenas para acomodar pequenas diferenças, é possível copiar um grupo de segurança para usar como ponto de partida ou usar herança etc.?


2
Você pode aplicar vários grupos de segurança a um único recurso. Fazer uma cópia de um grupo de segurança parece uma má ideia. Basta adicionar as novas regras a um novo grupo e aplicá-las às instâncias corretas.
Ladadadada

Eu apenas tentei procurar essas informações, mas não consigo encontrar nada que mostre como adicionar grupos de segurança adicionais a uma única instância do EC2. Você pode fornecer um link?
Bill Rosmus

Acabei de escrever uma nova função em uma biblioteca de classes Python Boto à qual adiciono lentamente. Uma PITA com a qual eu não deveria ter lidado (como muitas outras coisas), mas pelo menos agora tenho uma interface mais simples e direta para fazer isso do que qualquer outra coisa que já vi.
Bill Rosmus

Respostas:


17

Não parece que você pode copiar grupos de segurança da interface da web. No entanto, você pode usar a CLI da AWS para criar grupos de segurança :

Comando:

$ aws ec2 describe-security-groups --group-id MySecurityGroupID

Resultado :

{
    "securityGroupInfo": [
        {
            "ipPermissionsEgress": [],
            "groupId": "sg-903004f8",
            "ipPermissions": [],
            "groupName": "MySecurityGroup",
            "ownerId": "803981987763",
            "groupDescription": "AWS-CLI-Example"
        }
    ],
    "requestId": "afb680df-d7b1-4f6a-b1a7-344fdb1e3532"
}

E adicione regras usando o comando:

aws ec2 authorize-security-group-ingress --group-id MySecurityGroupID --ip-protocol tcp --from-port 22 --to-port 22 --cidr-ip 0.0.0.0/0

Resultado:

{
    "return": "true",
    "requestId": "c24a1c93-150b-4a0a-b56b-b149c0e660d2"
}

A partir daí, você deve descobrir como simplificar a criação de seus grupos de segurança.


Sim, eu imaginei que esse era o caminho que precisaria ser seguido ... estava pensando em fazer algo semelhante a isso usando boto também. Obrigado pelo exemplo ... você vai gostar disso. Obrigado.
Bill Rosmus

Você deve especificar a região entre. por exemploaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie 15/08/19

7

O AWS EC2 Console permite selecionar o grupo de segurança e executar a operação "Copiar para novo" na interface do usuário agora.


4

Na documentação da AWS Criando um grupo de segurança , você pode copiar um grupo de segurança usando o console.

  1. Selecione o grupo de segurança que você deseja copiar
  2. Escolher ação
  3. Copiar para novo

AWS Security Group - Copiar para novo


O lugar mais contra-intuitivo para fazer uma cópia. Obrigado. Seria melhor se você apontasse para o console do EC2.
Michael McGarrah

4
Contanto que você esteja copiando na mesma região, isso funcionará. Se você precisar duplicar para outra região, ainda precisará usar a CLI do EC2.
Dale Anderson

Esta opção não existe no painel da VPC.
precisa saber é o seguinte

3

Aqui está o método python / boto de 'copiar grupos de segurança' de uma biblioteca personalizada que escrevi para facilitar / automatizar esses tipos de coisas. Por fim, essa foi a solução que eu encontrei.

vpcId is the Virtual Private Cloud Id
keys is a dictionary with your AWS keys

O resto deve ser direto para descobrir.

def copyEC2SecurityGroup(self, keys, region, securityGroupName, newSecurityGroupName = None, newRegion = None, vpcId = None):


newEc2Connection = None
print("Creating ec2Connection for source region: " + region)
ec2Connection = lib.getEc2Connection(region, keys)

if newRegion is None:
    newRegion = region
else:
    print("New Region Detected, creating for New region: " + newRegion)
    newEc2Connection = lib.getEc2Connection(newRegion, keys)
    newRegionInfo = newEc2Connection.region

print("new region is: %s" % newRegion)

if newSecurityGroupName is None:
    newSecurityGroupName = securityGroupName

print ("new security group is: %s" % newSecurityGroupName)

# if copying in the same region the new security group cannot have the same name.
if newRegion == region:
    if newSecurityGroupName == securityGroupName:
        print ("Old and new security groups cannot have the same name when copying to the same region.")
        exit(1)

groups = [group for group in ec2Connection.get_all_security_groups() if group.name == securityGroupName]
print"got groups count " + str(len(groups))
if groups:
    theOldGroup = groups[0]
    print theOldGroup.rules
else:
    print("Can't find security group by the name of: %s" % securityGroupName)
    exit(1)
print groups
pprint(theOldGroup)

if newEc2Connection is not None:
    print("Creating new security group in new region")
    sg = newEc2Connection.create_security_group(newSecurityGroupName, newSecurityGroupName, vpcId)
    sleep(5)
else:
    print("Creating new security group in current region")
    sg = ec2Connection.create_security_group(newSecurityGroupName, newSecurityGroupName, vpcId)
    sleep(5)

source_groups = []
for rule in theOldGroup.rules:
    for grant in rule.grants:
        strGrant = str(grant)
        print(strGrant)
        if strGrant.startswith("sg"):
            print("Cannot copy 'security group rule' (%s)... only cidr_ip's e.g. xxx.xxx.xxx.xxx/yy." % strGrant)
            continue
        grant_nom = grant.name or grant.group_id
        if grant_nom:
            if grant_nom not in source_groups:
                source_groups.append(grant_nom)
                sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port, grant)
        else:
            sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port, grant.cidr_ip)
return sg 

O recuo do código parece fora de sintonia. Você pode consertar isso?
Shoan

@ Shoan - Desculpe por muito tempo. Na verdade, não estou trabalhando com isso agora. Este é um método que recortei de uma biblioteca que escrevi e o usei regularmente quando o estava usando. Então eu sei que funcionou no momento em que postei aqui. Se é uma coisa de recuo, não deve ser muito difícil descobrir isso (mas não tenho tempo agora para criar um ambiente para mexer com ela, mas você pode;)). Também pode ser um problema com a versão da biblioteca? De qualquer forma, ainda é provavelmente um bom ponto de partida para quem deseja fazer isso programaticamente com o Boto.
Bill Rosmus

11
o que é lib? de onde devo importá-lo?
Suncatcher



1

Na mesma região da AWS, você pode copiar uma política de segurança usando a GUI online. No entanto, às vezes você deseja copiar as coisas programaticamente. Por exemplo, se você possui muitas políticas de segurança para copiar ou se deseja copiar entre regiões.

Aqui está um trecho simples para fazer isso.

import boto3
from os import environ as env


def copy_security_groups(src_region, tgt_region, grp_names):

    # Initialize client connections for regions
    src_client = boto3.client('ec2', region_name=src_region,
                              aws_access_key_id=env['AWS_ACCESS_KEY_ID'],
                              aws_secret_access_key=env['AWS_SECRET_ACCESS_KEY'])
    tgt_client = boto3.client('ec2', region_name=tgt_region,
                              aws_access_key_id=env['AWS_ACCESS_KEY_ID'],
                              aws_secret_access_key=env['AWS_SECRET_ACCESS_KEY'])

    # Get info for all security groups and copy them one-by-one
    g_info = src_client.describe_security_groups(
        GroupNames=grp_names)['SecurityGroups']
    for g in g_info:
        resp = tgt_client.create_security_group(
            GroupName=g['GroupName'], Description=g['Description'])
        new_grp_id = resp['GroupId']
        tgt_client.authorize_security_group_ingress(
            GroupId=new_grp_id, IpPermissions=g['IpPermissions'])
        tgt_client.authorize_security_group_egress(
            GroupId=new_grp_id, IpPermissions=g['IpPermissionsEgress'])


if __name__ == '__main__':
    copy_security_groups('us-east-1', 'ap-south-1', ['rds-public'])


0

No console do EC2, clique em Iniciar Instância e prossiga para inserir informações fictícias até chegar à seção do grupo de segurança.

A partir daqui, clique em "Selecionar um grupo de segurança existente" e abaixo você verá todos os grupos de segurança que você possui para essa VPC em particular. Você deve ver um link "Copiar para novo" em "Ações", use isso para copiar todas as suas ACLs para um novo SG.

Ou suponho que você possa usar um script - isso é IMO mais rápido.


0

Eu tive um problema semelhante, mas copiei o SG em contas diferentes.

Basta especificar alguns CONSTANTES no início e a função copy_sg irá copiá-los.

Nenhuma verificação de erro está em vigor; portanto, o SG de destino já existe, falhará.

Siga uma solução geral que também pode ser usada dentro da conta:

#!/usr/bin/env python3
# coding: utf-8

import boto3
from typing import Any,  List

# This profile needs to be able to assume the specified role in SRC/TGT account
appops_session = boto3.Session(profile_name='YOUR_PRECONFIGURE_PROFILE')

ROLE = "THE ROLE TO BE ASSUMED"  # I presume it is the same in SRC/TGT Account
SRC_ACCOUNT = "YOUR SRC ACCOUNT NUMBER"

TGT_REGION = "eu-central-1"
DST_ACCOUNT = "YOUR TARGET ACCOUNT NUMBER"
TGT_VPC = "vpc-XXXXXXXXXXXXXXX"

region = "ap-southeast-2"
dst_vpc_id = "vpc-XXXXXXXXXXXXXXX"
sg_list = ["sg-XXXXXXXX", "sg-YYYYYYYYY"]

def aws_sts_cred(account, role):
    """Get the STS credential.

    return  credential_object
    """
    sts_creds = {}
    sts_conn = appops_session.client('sts')

    role_arn = "arn:aws:iam::" + account + ":role/" + role
    assumed_role = sts_conn.assume_role(RoleArn=role_arn,
                                        RoleSessionName="TMPROLE")
    sts_creds["aws_access_key_id"] = assumed_role['Credentials']['AccessKeyId']
    sts_creds["aws_secret_access_key"] = assumed_role['Credentials']['SecretAccessKey']
    sts_creds["aws_session_token"] = assumed_role['Credentials']['SessionToken']
    return sts_creds


def aws_conn(service: str, region: str, **kwargs) -> Any:
    """Create a client object."""
    return boto3.client(service, region_name=region, **kwargs)


def dump_sg(client, vpcid: str = "", sgids: List = []) -> List:
    """Dump the specified SG."""
    print(sgids)
    sg_info = client.describe_security_groups(
            Filters = [{'Name': 'group-id', 'Values': sgids}])['SecurityGroups']
    return sg_info


def copy_sg(tgt_client, sgs, vpcid=""):
    for sg in sgs:
        # With no Vpc ID the SG is created in the default VPC.
        resp = tgt_client.create_security_group(
            GroupName=sg['GroupName'], Description=sg['Description'], VpcId=vpcid)
        new_grp_id = resp['GroupId']
        tgt_client.authorize_security_group_ingress(
            GroupId=new_grp_id, IpPermissions=sg.get('IpPermissions', list()))
        if sg.get('IpPermissionsEgress') != []:
            # It doesn't work with an empty list
            tgt_client.authorize_security_group_egress(
                GroupId=new_grp_id, IpPermissions=sg.get('IpPermissionsEgress'))
        print("Create SG {} - \"{}\" - \"{}\" in VPCID: {}".format(new_grp_id, sg['GroupName'], sg['Description'], vpcid))


STS_CRED = aws_sts_cred(SRC_ACCOUNT, ROLE)
STS_CRED_TGT = aws_sts_cred(DST_ACCOUNT, ROLE)

src_client = aws_conn("ec2", region, **STS_CRED)

sg_list = dump_sg(src_client, sgids=sg_list)

tgt_client = aws_conn("ec2", TGT_REGION, **STS_CRED_TGT)

copy_sg(tgt_client, sg_list)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.