Có thể sao chép một nhóm bảo mật AWS không?


17

Chúng tôi có một số nhóm bảo mật có khá nhiều quy tắc trong đó. Thay vì phải tạo lại các quy tắc tương tự cho một số nhóm bảo mật chỉ để phù hợp với những khác biệt nhỏ, có thể sao chép một nhóm bảo mật để sử dụng làm điểm bắt đầu hoặc sử dụng kế thừa, v.v.?


2
Bạn có thể áp dụng nhiều nhóm bảo mật cho một tài nguyên. Tạo một bản sao của một nhóm bảo mật có vẻ như là một ý tưởng tồi. Chỉ cần thêm các quy tắc mới vào một nhóm mới và áp dụng nó cho các trường hợp phù hợp.
Ladadadada

Tôi vừa thử tìm kiếm thông tin này nhưng không thể tìm thấy bất cứ điều gì chỉ ra cách thêm các nhóm bảo mật bổ sung vào một ví dụ EC2 đơn lẻ. bạn có thể cung cấp một liên kết?
Bill Rosmus

Tôi vừa viết một hàm mới trong thư viện lớp Python Boto mà tôi từ từ thêm vào. Một Pita tôi không cần phải xử lý (cũng như nhiều thứ khác) nhưng ít nhất bây giờ tôi có một giao diện đơn giản và đơn giản hơn để làm điều này hơn bất kỳ thứ gì tôi từng thấy.
Bill Rosmus

Câu trả lời:


17

Không giống như bạn có thể sao chép các nhóm bảo mật từ giao diện web. Tuy nhiên, bạn có thể sử dụng AWS CLI để tạo các nhóm bảo mật :

Chỉ huy :

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

Đầu ra:

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

Và thêm quy tắc sử dụng lệnh:

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

Đầu ra:

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

Từ đó bạn sẽ có thể tìm ra cách đơn giản hóa việc tạo các nhóm bảo mật của mình.


vâng tôi đoán đây là con đường cần phải đi ... đã suy nghĩ về việc làm một cái gì đó tương tự như thế này bằng cách sử dụng boto. Cảm ơn ví dụ ... sẽ cung cấp cho bạn ngón tay cái cho nó. Cảm ơn.
Bill Rosmus

Bạn phải chỉ định vùng btw. ví dụaws ec2 describe-security-groups --group-id MySecurityGroupID --region us-west-2
evan.bovie

7

Bảng điều khiển AWS EC2 cho phép bạn chọn Nhóm bảo mật và thực hiện thao tác "Sao chép sang mới" trong giao diện người dùng ngay bây giờ.


4

Từ AWS Tạo tài liệu Nhóm bảo mật , bạn có thể sao chép nhóm bảo mật bằng bàn điều khiển.

  1. Chọn nhóm bảo mật bạn muốn sao chép
  2. Chọn hành động
  3. Sao chép sang mới

Nhóm bảo mật AWS - Sao chép sang mới


Nơi phản trực quan nhất để tạo một bản sao. Cảm ơn. Sẽ tốt hơn nếu bạn chỉ vào Bảng điều khiển EC2.
Michael McGarrah

4
Miễn là bạn sao chép trong cùng một khu vực, công việc này sẽ hoạt động. Nếu bạn cần sao chép sang một khu vực khác, bạn vẫn cần sử dụng EC2 CLI.
Dale Anderson

Tùy chọn này không tồn tại trong Bảng điều khiển VPC.
evan.bovie

3

Đây là phương pháp python / boto của nhóm bảo mật sao chép từ một thư viện tùy chỉnh mà tôi đã viết để làm cho những thứ này dễ dàng hơn / tự động hóa chúng .. Cuối cùng, đây là giải pháp tôi nghĩ ra.

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

Phần còn lại nên thẳng về phía trước để tìm ra.

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 

Các mã thụt lề trông ra khỏi whack. Bạn có thể sửa nó không?
Shoan

@Shoan - Xin lỗi đã quá lâu. Tôi không thực sự làm việc với điều này ngay bây giờ. Đây là một phương pháp tôi cắt từ thư viện tôi đã viết và tôi đã sử dụng nó thường xuyên khi tôi đang sử dụng nó. Vì vậy, tôi biết nó hoạt động tại thời điểm tôi đăng nó ở đây. Nếu đó là một thứ thụt lề, thì nó không quá khó để tìm ra nó (nhưng tôi không có thời gian để xây dựng một môi trường để nghịch phá nó, nhưng bạn có thể;)). Nó cũng có thể là một vấn đề với phiên bản của thư viện? Trong mọi trường hợp, nó vẫn có khả năng là điểm khởi đầu tốt cho bất kỳ ai muốn làm điều này theo chương trình với Boto.
Bill Rosmus

1
lib là gì Tôi nên nhập nó từ đâu?
Suncatcher

2

Xem xét có một cái nhìn vào blog này. Nó có thể hữu ích cho những gì bạn đang xem.

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


Tôi đã viết một số công cụ Python Boto để làm điều này. Dễ sử dụng hơn bất cứ thứ gì tôi thấy.
Bill Rosmus

vui lòng tóm tắt nội dung liên kết của bạn
Ward - Rebstate Monica

Không hoạt động. Use of uninitialized value $type in string eq at create-firewall-script.pl line 43, <> line 1 (#1)
Suncatcher

1

Đây là kịch bản tôi đã thực hiện để thực hiện điều này: aws_sg_migrate

Sử dụng mẫu là

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

Nó dựa trên cái này và được điều chỉnh cho Python3.


Việc sử dụng có vẻ thú vị nhưng không có kịch bản đính kèm?
JJarava

Xin lỗi, = :) Đã thêm liên kết
Suncatcher

1

Trong cùng khu vực AWS, bạn có thể sao chép chính sách bảo mật bằng GUI trực tuyến. Tuy nhiên, đôi khi bạn muốn sao chép mọi thứ theo chương trình. Chẳng hạn, nếu bạn có nhiều chính sách bảo mật cần sao chép hoặc nếu bạn muốn sao chép giữa các vùng.

Đây là một đoạn đơn giản để làm điều đó.

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

Do thiếu một cách thích hợp để thực hiện việc này trực tuyến, tôi đã tạo ra một kịch bản siêu đơn giản để xử lý nó. Có một cái nhìn nếu bạn quan tâm.

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


Đây không thực sự là một ứng cử viên tốt cho bài nộp "câu trả lời". Có thể hữu ích như một bình luận khi bạn có đủ đại diện để đăng những cái đó.
Andrew B

0

Từ bảng điều khiển EC2, nhấp vào Launch Instance và tiến hành nhập thông tin giả cho đến khi bạn đến phần nhóm bảo mật ..

Từ đây, nhấp vào "Chọn nhóm bảo mật hiện có" và bên dưới bạn sẽ thấy tất cả các nhóm bảo mật bạn có cho VPC cụ thể đó. Bạn sẽ thấy liên kết "Sao chép sang mới" trong "Hành động", sử dụng liên kết này để sao chép tất cả các ACL của bạn sang SG mới.

Hoặc tôi cho rằng bạn có thể sử dụng tập lệnh - đây là IMO nhanh hơn ..


0

Tôi gặp vấn đề tương tự nhưng sao chép SG trên các tài khoản khác nhau.

Chỉ cần chỉ định một số CONSTANTS ở đầu và hàm copy_sg sẽ sao chép chúng.

Không có kiểm tra lỗi tại chỗ do đó SG mục tiêu đã tồn tại, nó sẽ thất bại.

Thực hiện theo một giải pháp chung có thể được sử dụng trong tài khoản:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.