Est-il possible de copier un groupe de sécurité AWS?

17

Nous avons des groupes de sécurité qui ont pas mal de règles. Plutôt que d'avoir à recréer les mêmes règles pour un certain nombre de groupes de sécurité juste pour tenir compte de différences mineures, est-il possible de copier un groupe de sécurité pour l'utiliser comme point de départ, ou utiliser l'héritage, etc.?

Bill Rosmus
la source
2
Vous pouvez appliquer plusieurs groupes de sécurité à une seule ressource. Faire une copie d'un groupe de sécurité semble être une mauvaise idée. Ajoutez simplement les nouvelles règles à un nouveau groupe et appliquez-les aux bonnes instances.
Ladadadada
J'ai juste essayé de rechercher cette information, mais je ne trouve rien qui montre comment ajouter des groupes de sécurité supplémentaires à une seule instance EC2. Pouvez-vous fournir un lien?
Bill Rosmus
Je viens d'écrire une nouvelle fonction dans une bibliothèque de classes Python Boto à laquelle j'ajoute lentement. Un PITA auquel je n'aurais pas dû faire face (comme beaucoup de choses) mais au moins maintenant, j'ai une interface plus simple et plus simple pour faire cela que tout ce que j'ai vu.
Bill Rosmus

Réponses:

17

Il ne semble pas que vous puissiez copier des groupes de sécurité à partir de l'interface Web. Vous pouvez cependant utiliser l' AWS CLI pour créer des groupes de sécurité :

Commande:

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

Production :

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

Et ajoutez des règles à l'aide de la commande:

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

Production:

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

De là, vous devriez être en mesure de comprendre comment simplifier la création de vos groupes de sécurité.

Tanner Faulkner
la source
Oui, je pensais que c'était la voie à suivre ... pensais à faire quelque chose de similaire à ça en utilisant aussi Boto. Merci pour l'exemple ... vous donnera le coup de pouce. Merci.
Bill Rosmus
Vous devez spécifier la région btw. par exempleaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie
7

La console AWS EC2 vous permet de sélectionner le groupe de sécurité et d'effectuer maintenant l'opération "Copier vers nouveau" dans l'interface utilisateur.

Luis
la source
4

Depuis la documentation AWS Création d'un groupe de sécurité , vous pouvez copier un groupe de sécurité à l'aide de la console.

  1. Sélectionnez le groupe de sécurité que vous souhaitez copier
  2. Choisir une action
  3. Copier vers nouveau

AWS Security Group - Copier vers nouveau

Mike D
la source
L'endroit le plus contre-intuitif où faire une copie. Merci. Ce serait mieux si vous montriez la console EC2.
Michael McGarrah
4
Tant que vous copiez dans la même région, cela fonctionne. Si vous devez effectuer une duplication dans une autre région, vous devez toujours utiliser la CLI EC2.
Dale Anderson
Cette option n'existe pas dans le tableau de bord VPC.
evan.bovie
3

Pensez à jeter un œil à ce blog. Cela pourrait être utile pour ce que vous regardez.

http://ry4an.org/unblog/post/ec2_security_group_tools/

Sri
la source
J'ai écrit quelques trucs Python Boto pour ce faire. Plus facile à utiliser que tout ce que j'ai vu.
Bill Rosmus
veuillez résumer le contenu de votre lien
Ward - Reinstate Monica
1
Ça ne marche pas. Use of uninitialized value $type in string eq at create-firewall-script.pl line 43, <> line 1 (#1)
Suncatcher
3

Voici la méthode python / boto «copier les groupes de sécurité» à partir d'une bibliothèque personnalisée que j'ai écrite pour faciliter ce genre de choses / les automatiser. En fin de compte, c'est la solution que j'ai trouvée.

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

Le reste devrait être simple à comprendre.

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 
Bill Rosmus
la source
Le retrait du code semble hors de propos. Pouvez-vous résoudre ce problème?
Shoan
@Shoan - Désolé depuis trop longtemps. Je ne travaille pas vraiment avec ça en ce moment. C'est une méthode que j'ai découpée dans une bibliothèque que j'ai écrite, et je l'ai utilisée régulièrement lorsque je l'utilisais. Je sais donc que cela a fonctionné au moment où je l'ai publié ici. S'il s'agit d'une indentation, il ne devrait pas être trop difficile de le comprendre (mais je n'ai pas le temps pour l'instant de créer un environnement pour jouer avec, mais vous pouvez;)). Cela pourrait également être un problème avec la version de la bibliothèque? Dans tous les cas, c'est toujours un bon point de départ pour quiconque souhaite le faire par programme avec Boto.
Bill Rosmus
1
qu'est-ce que la lib? d'où dois-je l'importer?
Suncatcher
2

Voici le script que j'ai fait pour accomplir cela: aws_sg_migrate

Exemple d'utilisation est

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

Il est basé sur celui-ci et adapté pour Python3.

Suncatcher
la source
L'utilisation semble intéressante mais aucun script n'est attaché?
JJarava
Désolé, = :) Ajouté le lien
Suncatcher
1

Dans la même région AWS, vous pouvez copier une stratégie de sécurité à l'aide de l'interface graphique en ligne. Cependant, parfois, vous souhaitez copier des choses par programme. Par exemple, si vous avez beaucoup de politiques de sécurité à copier ou si vous souhaitez copier entre les régions.

Voici un extrait simple pour ce faire.

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'])
pir
la source
0

En raison d'un manque de manière appropriée de le faire en ligne, j'ai créé un script super simple pour le gérer. Jetez un œil si vous êtes intéressé.

https://github.com/pedropregueiro/migrate-ec2-secgroups

Pedro Pregueiro
la source
Ce n'est pas vraiment un bon candidat pour une soumission de "réponse". Cela pourrait être utile comme commentaire lorsque vous avez suffisamment de représentants pour les publier.
Andrew B
0

Depuis la console EC2, cliquez sur Lancer l'instance et continuez à entrer des informations factices jusqu'à ce que vous arriviez à la section du groupe de sécurité.

À partir d'ici, cliquez sur "Sélectionner un groupe de sécurité existant", et ci-dessous vous verrez tous les groupes de sécurité que vous avez pour ce VPC particulier. Vous devriez voir un lien "Copier vers nouveau" sous "Actions", utilisez-le pour copier toutes vos listes de contrôle d'accès dans un nouveau SG.

Ou je suppose que vous pourriez utiliser un script - c'est plus rapide IMO ..

Scott Moore
la source
0

J'ai eu un problème similaire mais j'ai copié SG sur différents comptes.

Spécifiez juste quelques CONSTANTES au début et la fonction copy_sg les copiera.

Aucune vérification d'erreur n'est en place, donc si le SG cible existe déjà, il échouera.

Suivez une solution générale qui peut être utilisée également intra-compte:

#!/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)

Alex
la source