Чи можливо скопіювати групу безпеки AWS?


17

У нас є групи безпеки, які мають у них досить багато правил. Чи замість того, щоб відтворювати одні й ті ж правила для ряду груп безпеки лише для усунення незначних відмінностей, чи можливо скопіювати групу безпеки, щоб використовувати її як вихідну точку, або використовувати спадщину тощо?


2
Ви можете застосувати кілька груп безпеки до одного ресурсу. Створення копії групи безпеки здається поганою ідеєю. Просто додайте нові правила до нової групи та застосуйте їх до потрібних примірників.
Ладададада

Я просто намагався шукати цю інформацію, але не можу знайти нічого, що показує, як додати додаткові групи безпеки до окремого екземпляру EC2. Чи можете ви надати посилання?
Білл Росмус

Я щойно написав нову функцію в бібліотеці класів Python Boto, до якої я повільно додаю. З PITA я не повинен був мати справу (як і багато речей), але принаймні зараз у мене є більш простий і прямий інтерфейс для цього, ніж все, що я бачив.
Білл Росмус

Відповіді:


17

Не схоже, що ви можете скопіювати групи безпеки з веб-інтерфейсу. Однак ви можете використовувати CLS AWS для створення груп безпеки :

Команда:

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

Вихід:

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

І додайте правила за допомогою команди:

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

Вихід:

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

Звідти ви зможете зрозуміти, як спростити створення своїх груп безпеки.


так, я подумав, що це маршрут, який потрібно було б пройти ... думав про те, щоб зробити щось подібне до цього, використовуючи також boto. Дякуємо за приклад ... дам вам великі пальці за це. Спасибі.
Білл Росмус

Ви повинні вказати регіон btw. напр.aws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie

7

Консоль AWS EC2 дозволяє вибрати групу безпеки та виконати операцію "Копіювати в нове" в інтерфейсі зараз.


4

З AWS Створення документів групи безпеки можна скопіювати групу безпеки за допомогою консолі.

  1. Виберіть групу безпеки, яку потрібно скопіювати
  2. Виберіть Дія
  3. Копіювати в нове

Група безпеки AWS - Копіювати в нове


Найбільш протиінтуїтивне місце для виготовлення копії. Спасибі. Було б краще, якби ви вказали на консоль EC2.
Майкл МакГарра

4
Доки ви копіюєте в одному регіоні, це працює. Якщо вам потрібно скопіювати копію в інший регіон, вам все одно потрібно використовувати CL2 EC2.
Дейл Андерсон

На панелі інформаційних панелей VPC ця опція не існує.
evan.bovie

3

Розгляньте цей блог. Це може бути корисним для того, що ви дивитесь.

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


Я написав кілька матеріалів Python Boto для цього. Простіше у використанні, ніж все, що я бачив.
Білл Росмус

підкажіть, будь ласка, вміст посилання
Уорд - Відновіть Моніку

1
Не працює. Use of uninitialized value $type in string eq at create-firewall-script.pl line 43, <> line 1 (#1)
Suncatcher

3

Ось метод python / boto "груп захисту безпеки" із спеціальної бібліотеки, яку я написав, щоб полегшити такі речі / автоматизувати їх. Зрештою, це було рішення, яке я придумав.

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

Решта має бути прямо вперед, щоб розібратися.

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 

Відступ коду виглядає невдало. Ви можете це виправити?
Шоан

@Shoan - Вибачте, задовго. Я зараз не працюю з цим. Це метод, який я вирізав із бібліотеки, яку я написав, і використовував її регулярно, коли я ним користувався. Тож я знаю, що це працювало в той час, коли я його розміщував тут. Якщо це відступ, то це не повинно бути надто важким для цього (але я зараз не маю часу створити середовище, щоб з ним поспілкуватися, але ви можете;)). Можливо, це також може бути проблемою з версією бібліотеки? У будь-якому випадку, все-таки це може бути хорошою відправною точкою для тих, хто хоче це зробити програмно з Boto.
Білл Росмус

1
що таке lib? звідки я повинен імпортувати його?
Suncatcher

2

Ось сценарій, який я створив для цього: aws_sg_migrate

Використання зразка є

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

Він заснований на цьому і адаптований для Python3.


Використання здається цікавим, але сценарій не додається?
JJarava

Вибачте, = :) Додано посилання
Suncatcher

1

У цьому ж регіоні AWS ви можете скопіювати політику безпеки, використовуючи онлайн-графічний інтерфейс. Однак іноді потрібно копіювати речі програмно. Наприклад, якщо у вас є багато правил безпеки для копіювання або якщо ви хочете скопіювати їх у різних регіонах.

Ось простий фрагмент для цього.

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

Через відсутність належного способу зробити це в Інтернеті, я створив надзвичайно простий скрипт, щоб впоратися з ним. Подивіться, якщо вам цікаво.

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


Це насправді не хороший кандидат для подання "відповіді". Може бути корисним як коментар, коли у вас є достатня кількість представників, щоб розмістити їх.
Андрій Б

0

На консолі EC2 натисніть кнопку "Запустити екземпляр" і перейдіть до введення відомостей про манекени, поки ви не перейдете до розділу групи безпеки.

Звідси натисніть на "Вибрати існуючу групу безпеки", і нижче ви побачите всі групи безпеки для конкретної VPC. У розділі "Дії" ви маєте побачити посилання "Копіювати в нове", скопіюйте це, щоб скопіювати всі ACL до нового SG.

Або я припускаю, що ви можете використовувати сценарій - це швидше IMO.


0

У мене була подібна проблема, але копіювання SG через різні облікові записи.

Просто вкажіть деякі CONSTANTS на початку, і функція copy_sg скопіює їх.

Перевірки помилок не встановлено, тому цільовий СГ вже існує, він не зможе.

Дотримуйтесь загального рішення, яке може бути використане також для внутрішніх рахунків:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.