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

14

Temos alguns grupos de segurança que possuem algumas regras neles. 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.?

    
por Bill Rosmus 22.05.2013 / 23:55

10 respostas

2

Aqui está o método python / boto de 'copiar grupos de segurança' de uma biblioteca personalizada que escrevi para tornar esse tipo de coisa mais fácil / automatizá-los. Por fim, essa foi a solução que eu criei.

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 
    
por 25.10.2014 / 23:27
16

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

Comando:

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

Saída:

{
    "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

Saída:

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

De lá, você deve saber como simplificar a criação de seus grupos de segurança.

    
por 23.05.2013 / 00:51
7

O AWS EC2 Console permite que você selecione o Grupo de segurança e execute a operação "Copiar para novo" na interface do usuário agora.

    
por 12.08.2016 / 23:58
4

Em AWS Criando uma segurança Agrupe docs, 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

    
por 12.09.2016 / 18:39
2

Considere dar uma olhada neste blog. Pode ser útil para o que você está olhando.

link

    
por 22.08.2013 / 17:25
1

Aqui está o script que fiz para conseguir isso: aws_sg_migrate

O uso da amostra é

python3 aws_sg_migrate.py --vpc=vpc-05643b6c --shell --src=us-east-1 --dest=us-west-1 sg-111111

Baseia-se neste e adaptado para Python3.

    
por 13.08.2017 / 17:14
1

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

Aqui está um pequeno trecho 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'])
    
por 06.11.2018 / 23:07
0

Devido à falta de uma maneira correta de fazer isso online, criei um script super simples para lidar com isso. Dê uma olhada se você estiver interessado.

link

    
por 22.05.2014 / 17:18
0

No console do EC2, clique em Iniciar instância e prossiga para inserir informações simuladas 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ê tem para esse 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 eu suponho que você poderia usar um script - isso é mais rápido IMO ..

    
por 26.10.2014 / 04:11
0

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

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

Nenhuma verificação de erro está em vigor, portanto, se o SG de destino já existir, ele 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)

    
por 12.04.2019 / 17:44