AWS Güvenlik Grubunu Kopyalamak Mümkün mü?


17

İçinde çok az kuralı olan bazı güvenlik gruplarımız var. Sadece küçük farklılıkları barındıracak bir dizi güvenlik grubu için aynı kuralları yeniden oluşturmak yerine, bir güvenlik grubunu başlangıç ​​noktası olarak kullanmak veya miras vb. Kullanmak kopyalamak mümkün mü?


2
Tek bir kaynağa birden fazla güvenlik grubu uygulayabilirsiniz. Bir güvenlik grubunun kopyasını çıkarmak kötü bir fikir gibi görünüyor. Yeni kuralları yeni bir gruba eklemeniz ve doğru örneklere uygulamanız yeterlidir.
Ladadadada

Ben sadece bu bilgi için arama denedim ama tek bir EC2 örneğine nasıl ek güvenlik grupları eklemek gösteren bir şey bulamıyorum. Bir bağlantı sağlayabilir misiniz?
Bill Rosmus

Yavaş yavaş eklediğim Python Boto sınıf kütüphanesine yeni bir fonksiyon yazdım. Bir PITA ile uğraşmamalıydım (birçok şey gibi) ama en azından şimdi bunu yapmak için gördüğüm her şeyden daha basit ve daha basit bir arayüze sahibim.
Bill Rosmus

Yanıtlar:


17

Güvenlik gruplarını web arayüzünden kopyalayabileceğiniz gibi görünmüyor. Ancak güvenlik grupları oluşturmak için AWS CLI'yi kullanabilirsiniz :

Komut:

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

Çıktı :

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

Ve komutu kullanarak kurallar ekleyin:

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

Çıktı:

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

Buradan, güvenlik gruplarınızın oluşturulmasını nasıl basitleştirebileceğinizi anlayabilmelisiniz.


evet bunun izlenmesi gereken yol olduğunu düşündüm ... boto kullanarak buna benzer bir şey yapmayı düşünüyordum. Örnek için teşekkürler ... bunun için size başparmak verecek. Teşekkürler.
Bill Rosmus

Btw bölgesini belirtmelisiniz. örneğinaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie

7

AWS EC2 Konsolu, Güvenlik Grubunu seçmenize ve şimdi kullanıcı arayüzünde "Yeniye kopyala" işlemini gerçekleştirmenize olanak tanır.


4

Gönderen AWS Güvenlik Grubu Oluşturma dokümanlar, sen konsolunu kullanarak bir güvenlik grubu kopyalayabilirsiniz.

  1. Kopyalamak istediğiniz güvenlik grubunu seçin
  2. Eylem seçin
  3. Yeni kopyala

AWS Güvenlik Grubu - Yeniye Kopyala


Bir kopya yapmak için gidilecek en sezgisel yer. Teşekkürler. EC2 Konsolu'na işaret ederseniz daha iyi olur.
Michael McGarrah

4
Aynı bölgeye kopyalama yaptığınız sürece bu işe yarar. Başka bir bölgeye çoğaltmanız gerekiyorsa, yine de EC2 CLI kullanmanız gerekir.
Dale Anderson

Bu seçenek VPC Kontrol Panelinde mevcut değildir.
evan.bovie


3

İşte bu tür şeyleri kolaylaştırmak / otomatikleştirmek için yazdığım özel bir kütüphaneden 'güvenlik gruplarını kopyala' python / boto yöntemi .. Sonuçta bu çözüm ortaya çıktı.

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

Gerisi, anlayabilmek için düz ileri olmalıdır.

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 

Kod girintisi, vuruntunun dışında görünüyor. Bunu düzeltebilir misin?
Shoan

@Shoan - Üzgünüm çok uzun zaman oldu. Aslında şu an bununla çalışmıyorum. Bu, yazdığım bir kitaplıktan kestiğim bir yöntem ve onu kullanırken düzenli olarak kullandım. Bu yüzden buraya gönderdiğim zaman işe yaradığını biliyorum. Girintili bir şeyse, onu anlamak çok zor olmamalıdır (ancak şu anda onunla uğraşmak için bir ortam inşa etmek için zamanım yok, ama yapabilirsiniz;)). Belki de kütüphanenin sürümü ile ilgili bir sorun olabilir? Her halükarda, bunu Boto ile programlı olarak yapmak isteyen herkes için hala iyi bir başlangıç ​​noktasıdır.
Bill Rosmus

1
lib nedir? nereden içe aktarmalıyım?
Suncatcher

2

İşte bunu gerçekleştirmek için yaptığım komut dosyası: aws_sg_migrate

Örnek kullanım

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

Bu dayanmaktadır bu bir ve Python3 için uyarlanmış.


Kullanımı ilginç görünüyor, ancak ekli komut dosyası yok mu?
JJarava

Üzgünüz, = :) Bağlantı eklendi
Suncatcher

1

Aynı AWS bölgesinde, çevrimiçi GUI'yi kullanarak bir güvenlik ilkesi kopyalayabilirsiniz. Ancak, bazen işleri programlı olarak kopyalamak istersiniz. Örneğin, kopyalamak için çok fazla güvenlik politikanız varsa veya bölgeler arasında kopyalamak istiyorsanız.

İşte bunu yapmak için basit bir pasaj.

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

EC2 konsolundan, Örneği Başlat'a tıklayın ve güvenlik grubu bölümüne gelene kadar sahte bilgi girmeye devam edin.

Buradan "Mevcut bir Güvenlik Grubu Seçin" i tıklayın ve aşağıda söz konusu VPC için sahip olduğunuz tüm güvenlik gruplarını göreceksiniz. "İşlemler" altında bir "Yeniye Kopyala" bağlantısı görmelisiniz, bunu tüm EKL'lerinizi yeni bir SG'ye kopyalamak için kullanın.

Veya bir komut dosyası kullanabileceğinizi varsayalım - bu daha hızlı IMO.


0

Benzer bir sorun yaşadım ama SG'yi farklı hesaplara kopyaladım.

Sadece başında bazı SABİT belirtin ve copy_sg işlevi bunları kopyalar.

Hata kontrolü yoktur, bu nedenle hedef SG zaten var demektir, başarısız olur.

Hesap içi de kullanılabilecek genel bir çözümü izleyin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.