Apakah Mungkin untuk Menyalin Grup Keamanan AWS?

17

Kami memiliki beberapa grup keamanan yang memiliki beberapa aturan di dalamnya. Daripada harus membuat ulang aturan yang sama untuk sejumlah grup keamanan hanya untuk mengakomodasi perbedaan kecil, apakah mungkin untuk menyalin grup keamanan untuk digunakan sebagai titik awal, atau menggunakan warisan, dll?

Bill Rosmus
sumber
2
Anda dapat menerapkan beberapa grup keamanan ke satu sumber daya. Membuat salinan grup keamanan sepertinya ide yang buruk. Cukup tambahkan aturan baru ke grup baru dan terapkan ke instance yang tepat.
Ladadadada
Saya baru saja mencoba mencari info ini tetapi tidak dapat menemukan apa pun yang menunjukkan cara menambahkan grup keamanan tambahan ke instance EC2 hangus. Dapatkah Anda menyediakan sebuah sambungan?
Bill Rosmus
Saya baru saja menulis fungsi baru di perpustakaan kelas Python Boto yang perlahan saya tambahkan. PITA Saya seharusnya tidak harus berurusan dengan (seperti banyak hal) tapi setidaknya sekarang saya memiliki antarmuka yang lebih sederhana dan lebih lurus ke depan untuk melakukan ini daripada hal lain yang saya lihat.
Bill Rosmus

Jawaban:

17

Sepertinya Anda tidak dapat menyalin grup keamanan dari antarmuka web. Namun Anda dapat menggunakan AWS CLI untuk membuat grup keamanan :

Perintah:

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

Keluaran:

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

Dan tambahkan aturan menggunakan perintah:

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

Keluaran:

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

Dari sana Anda harus bisa mengetahui cara menyederhanakan pembuatan grup keamanan Anda.

Tanner Faulkner
sumber
ya saya pikir ini adalah rute yang perlu diambil ... sedang berpikir untuk melakukan sesuatu yang mirip dengan menggunakan boto juga. Terima kasih untuk contohnya ... akan memberi Anda acungan jempol untuk itu. Terima kasih.
Bill Rosmus
Anda harus menentukan wilayah btw. misaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie
7

Konsol AWS EC2 memungkinkan Anda untuk memilih Grup Keamanan dan melakukan operasi "Salin ke baru" di UI sekarang.

Luis
sumber
4

Dari AWS Membuat dokumen Grup Keamanan , Anda dapat menyalin grup keamanan menggunakan konsol.

  1. Pilih grup keamanan yang ingin Anda salin
  2. Pilih Aksi
  3. Salin ke yang baru

AWS Security Group - Salin ke Baru

Mike D
sumber
Tempat paling kontra-intuitif untuk membuat salinan. Terima kasih. Akan lebih baik jika Anda menunjuk Konsol EC2.
Michael McGarrah
4
Selama Anda menyalin di wilayah yang sama ini berfungsi. Jika Anda perlu menggandakan ke wilayah lain, Anda masih perlu menggunakan CLI EC2.
Dale Anderson
Opsi ini tidak ada di Dasbor VPC.
evan.bovie
3

Pertimbangkan untuk melihat blog ini. Mungkin bermanfaat untuk apa yang Anda lihat.

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

Sri
sumber
Saya menulis beberapa hal Python Boto untuk melakukan ini. Lebih mudah digunakan daripada apa pun yang pernah saya lihat.
Bill Rosmus
tolong rangkum isi tautan Anda
Ward - Reinstate Monica
1
Tidak bekerja Use of uninitialized value $type in string eq at create-firewall-script.pl line 43, <> line 1 (#1)
Suncatcher
3

Berikut adalah metode python / boto 'kelompok salinan keamanan' dari perpustakaan khusus yang saya tulis untuk membuat hal-hal ini lebih mudah / mengotomatiskan mereka .. Pada akhirnya ini adalah solusi yang saya buat.

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

Sisanya harus lurus ke depan untuk mencari tahu.

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
sumber
Kode indentasi terlihat rusak. Bisakah kamu memperbaikinya?
Shoan
@ Shoan - Maaf sudah terlalu lama. Saya sebenarnya tidak bekerja dengan ini sekarang. Ini adalah metode yang saya potong dari perpustakaan yang saya tulis, dan saya menggunakannya secara teratur ketika saya menggunakannya. Jadi saya tahu itu berfungsi pada saat saya mempostingnya di sini. Jika itu adalah indentasi, maka seharusnya tidak terlalu sulit untuk mengetahuinya (tapi saya tidak punya waktu sekarang untuk membangun sebuah lingkungan untuk bermain-main dengannya, tetapi Anda bisa;)). Mungkin juga bisa menjadi masalah dengan versi perpustakaan mungkin? Bagaimanapun, itu masih merupakan titik awal yang baik bagi siapa pun yang ingin melakukan ini secara programatik dengan Boto.
Bill Rosmus
1
Apa itu Lib? dari mana saya harus mengimpornya?
Suncatcher
2

Berikut ini skrip yang saya buat untuk mencapai ini: aws_sg_migrate

Penggunaan sampel adalah

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

Ini didasarkan pada yang satu ini dan diadaptasi untuk Python3.

Suncatcher
sumber
Penggunaannya tampak menarik tetapi tidak ada skrip yang terlampir?
JJarava
Maaf, = :) Menambahkan tautan
Suncatcher
1

Di dalam wilayah AWS yang sama, Anda dapat menyalin kebijakan keamanan menggunakan GUI online. Namun, terkadang Anda ingin menyalin sesuatu secara terprogram. Misalnya, jika Anda memiliki banyak kebijakan keamanan untuk disalin atau jika Anda ingin menyalin di seluruh wilayah.

Berikut cuplikan sederhana untuk melakukannya.

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
sumber
0

Karena kurangnya cara yang tepat untuk melakukan ini secara online, saya membuat skrip super sederhana untuk menanganinya. Coba lihat jika Anda tertarik.

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

Pedro Pregueiro
sumber
Ini sebenarnya bukan kandidat yang baik untuk pengiriman "jawaban". Mungkin bermanfaat sebagai komentar ketika Anda memiliki cukup perwakilan untuk mempostingnya.
Andrew B
0

Dari konsol EC2, klik Luncurkan Instance dan lanjutkan untuk memasukkan info boneka hingga Anda masuk ke bagian grup keamanan ..

Dari sini klik pada "Pilih Grup Keamanan yang Ada", dan di bawah ini Anda akan melihat semua grup keamanan yang Anda miliki untuk VPC tertentu. Anda akan melihat tautan "Salin ke Baru" di bawah "Tindakan", gunakan ini untuk menyalin semua ACL Anda ke SG baru.

Atau saya kira Anda bisa menggunakan skrip - ini IMO lebih cepat ..

Scott Moore
sumber
0

Saya memiliki masalah yang serupa tetapi menyalin SG di akun yang berbeda.

Cukup tentukan beberapa KONSTAN di awal dan fungsi copy_sg akan menyalinnya.

Tidak ada pengecekan error karena itu target SG sudah ada akan gagal.

Ikuti solusi umum yang dapat digunakan juga antar akun:

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