เป็นไปได้ไหมที่จะคัดลอก AWS Security Group


17

เรามีกลุ่มความปลอดภัยที่มีกฎค่อนข้างน้อย แทนที่จะต้องสร้างกฎเดียวกันขึ้นใหม่สำหรับกลุ่มความปลอดภัยจำนวนหนึ่งเพื่อรองรับความแตกต่างเล็ก ๆ น้อย ๆ มันเป็นไปได้ไหมที่จะคัดลอกกลุ่มความปลอดภัยเพื่อใช้เป็นจุดเริ่มต้นหรือใช้การสืบทอดเป็นต้น


2
คุณสามารถใช้กลุ่มความปลอดภัยหลายกลุ่มกับทรัพยากรเดียว การทำสำเนาของกลุ่มรักษาความปลอดภัยดูเหมือนจะเป็นความคิดที่ไม่ดี เพียงเพิ่มกฎใหม่ให้กับกลุ่มใหม่และนำไปใช้กับอินสแตนซ์ที่เหมาะสม
Ladadadada

ฉันลองค้นหาข้อมูลนี้ แต่ไม่พบสิ่งใดที่แสดงวิธีเพิ่มกลุ่มความปลอดภัยเพิ่มเติมให้กับอินสแตนซ์ singe EC2 คุณสามารถให้ลิงค์หรือไม่
Bill Rosmus

ฉันเพิ่งเขียนฟังก์ชันใหม่ในไลบรารีคลาส Python Boto ที่ฉันค่อยๆเพิ่มเข้าไป PITA ที่ฉันไม่ควรจะต้องรับมือกับ (อย่างเช่นมีอะไรมากมาย) แต่อย่างน้อยตอนนี้ฉันก็มีอินเตอร์เฟสที่เรียบง่ายและตรงไปตรงมามากขึ้นเพื่อทำสิ่งนี้มากกว่าสิ่งอื่นที่ฉันเคยเห็น
Bill Rosmus

คำตอบ:


17

ดูเหมือนคุณจะไม่สามารถคัดลอกกลุ่มความปลอดภัยจากเว็บอินเตอร์เฟส อย่างไรก็ตามคุณสามารถใช้AWS CLIเพื่อสร้างกลุ่มความปลอดภัย :

คำสั่ง:

$ 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 เช่นกัน ขอบคุณสำหรับตัวอย่าง ... จะช่วยยกนิ้วให้คุณ ขอบคุณ
Bill Rosmus

คุณต้องระบุภูมิภาค btw เช่นaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie

7

AWS EC2 Console ช่วยให้คุณสามารถเลือกกลุ่มการรักษาความปลอดภัยและดำเนินการ "คัดลอกไปใหม่" ใน UI ตอนนี้


4

จากAWS การสร้างเอกสารกลุ่มความปลอดภัยคุณสามารถคัดลอกกลุ่มความปลอดภัยโดยใช้คอนโซล

  1. เลือกกลุ่มความปลอดภัยที่คุณต้องการคัดลอก
  2. เลือกการกระทำ
  3. คัดลอกไปที่ใหม่

AWS Security Group - คัดลอกไปที่ใหม่


สถานที่ที่ต่อต้านได้ง่ายที่สุดสำหรับการทำสำเนา ขอบคุณ คงจะดีกว่านี้ถ้าคุณชี้ไปที่คอนโซล EC2
Michael McGarrah

4
ตราบใดที่คุณคัดลอกภายในภูมิภาคเดียวกันก็ใช้งานได้ หากคุณต้องการทำซ้ำไปยังภูมิภาคอื่นคุณยังคงต้องใช้ EC2 CLI
เดลเดอร์สัน

ตัวเลือกนี้ไม่มีอยู่ใน VPC Dashboard
evan.bovie

3

ลองพิจารณาดูบล็อกนี้ มันอาจมีประโยชน์สำหรับสิ่งที่คุณกำลังดู

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


ฉันเขียน Python Boto เพื่อทำสิ่งนี้ ใช้ง่ายกว่าทุกอย่างที่ฉันเคยเห็น
Bill Rosmus

โปรดสรุปเนื้อหาในลิงค์ของคุณ
วอร์ด - Reinstate Monica

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

@Shoan - ขออภัยนานเกินไป ตอนนี้ฉันไม่ได้ทำงานด้วย นี่เป็นวิธีที่ฉันตัดจากห้องสมุดที่ฉันเขียนและฉันใช้มันเป็นประจำเมื่อฉันใช้มัน ดังนั้นฉันรู้ว่ามันทำงานในเวลาที่ฉันโพสต์ไว้ที่นี่ ถ้ามันเป็นสิ่งเยื้องมันก็ไม่ควรยากเกินกว่าที่จะคิดออก (แต่ตอนนี้ฉันไม่มีเวลาแล้วที่จะสร้างสภาพแวดล้อมเพื่อทำซอกับมัน แต่คุณทำได้;) มันอาจเป็นปัญหากับเวอร์ชันของห้องสมุดด้วยหรือเปล่า ไม่ว่าในกรณีใดก็ยังคงเป็นจุดเริ่มต้นที่ดีสำหรับทุกคนที่ต้องการทำสิ่งนี้กับ Boto โดยทางโปรแกรม
Bill Rosmus

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 เดียวกันคุณสามารถคัดลอกนโยบายความปลอดภัยโดยใช้ GUI ออนไลน์ อย่างไรก็ตามบางครั้งคุณต้องการคัดลอกสิ่งต่าง ๆ โดยทางโปรแกรม ตัวอย่างเช่นหากคุณมีนโยบายความปลอดภัยจำนวนมากที่จะคัดลอกหรือหากคุณต้องการคัดลอกข้ามภูมิภาค

นี่เป็นตัวอย่างง่ายๆที่จะทำเช่นนั้น

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


นี่ไม่ใช่ผู้สมัครที่ดีสำหรับการส่งคำตอบ อาจมีประโยชน์ในฐานะที่เป็นความคิดเห็นเมื่อคุณมีตัวแทนเพียงพอที่จะโพสต์เหล่านั้น
Andrew B

0

จากคอนโซล EC2 คลิกเปิดใช้อินสแตนซ์และดำเนินการป้อนข้อมูลดัมมีจนกว่าคุณจะไปที่ส่วนกลุ่มความปลอดภัย

จากที่นี่คลิกที่ "เลือกกลุ่มความปลอดภัยที่มีอยู่" และด้านล่างคุณจะเห็นกลุ่มความปลอดภัยทั้งหมดที่คุณมีสำหรับ VPC นั้น คุณควรเห็นลิงค์ "คัดลอกไปที่ใหม่" ใต้ "การกระทำ" ใช้สิ่งนี้เพื่อคัดลอก ACL ของคุณทั้งหมดไปยัง SG ใหม่

หรือฉันคิดว่าคุณสามารถใช้สคริปต์ได้ - นี่คือ IMO ที่เร็วขึ้น ..


0

ฉันมีปัญหาที่คล้ายกัน แต่คัดลอก SG ไปยังบัญชีต่างๆ

เพียงระบุค่าเริ่มต้นและฟังก์ชัน copy_sg จะคัดลอก

ไม่มีการตรวจสอบข้อผิดพลาดดังนั้นจึงมี 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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.