AWS 보안 그룹을 복사 할 수 있습니까?


17

보안 규칙이 상당히 많은 보안 그룹이 있습니다. 사소한 차이점을 수용하기 위해 여러 보안 그룹에 대해 동일한 규칙을 다시 작성하지 않고 시작점으로 사용하기 위해 보안 그룹을 복사하거나 상속 등을 사용할 수 있습니까?


2
단일 리소스에 여러 보안 그룹을 적용 할 수 있습니다. 보안 그룹의 사본을 만드는 것은 나쁜 생각처럼 보입니다. 새 규칙을 새 그룹에 추가하고 올바른 인스턴스에 적용하면됩니다.
Ladadadada

방금이 정보를 검색하려고 시도했지만 단일 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"
}

그리고 command를 사용하여 규칙을 추가하십시오.

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 콘솔을 사용하면 이제 보안 그룹을 선택하고 UI에서 "새로 복사"작업을 수행 할 수 있습니다.


4

에서 AWS는 보안 그룹 만들기 문서를, 당신은 콘솔을 사용하여 보안 그룹을 복사 할 수 있습니다.

  1. 복사하려는 보안 그룹을 선택하십시오.
  2. 행동을 선택하십시오
  3. 새로운 것으로 복사

AWS 보안 그룹-새로 복사


사본을 만들기 위해 가장 반 직관적 인 장소. 감사. EC2 콘솔을 지적하면 더 좋습니다.
Michael McGarrah

4
동일한 지역 내에서 복사하는 한 작동합니다. 다른 리전으로 복제해야하는 경우에도 EC2 CLI를 사용해야합니다.
데일 앤더슨

이 옵션은 VPC 대시 보드에 없습니다.
evan.bovie

3

이 블로그를 살펴보십시오. 보고있는 내용에 유용 할 수 있습니다.

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


이 작업을 수행하기 위해 Python Boto를 작성했습니다. 내가 본 것보다 사용하기 쉽습니다.
Bill Rosmus

링크의 내용을 요약하십시오
Ward-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

@ 쇼안-너무 오래 죄송합니다. 나는 실제로이 작업을 지금하고 있지 않습니다. 이것은 내가 작성한 라이브러리에서 잘라낸 방법이며, 그것을 사용할 때 정기적으로 사용했습니다. 그래서 여기에 게시 할 때 효과가 있음을 알고 있습니다. 들여 쓰기 인 경우 알아 내기가 너무 어렵지 않아야합니다 (그러나 지금은 바이올린을 피울 수있는 환경을 만들 시간이 없지만;) 할 수 있습니다). 라이브러리 버전에 문제가있을 수도 있습니다. 어쨌든 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

EC2 콘솔에서 인스턴스 시작을 클릭하고 보안 그룹 섹션에 도달 할 때까지 더미 정보를 입력하십시오.

여기에서 "기존 보안 그룹 선택"을 클릭하면 아래에 해당 특정 VPC에 대한 모든 보안 그룹이 표시됩니다. "Actions (작업)"아래에 "Copy to New (새로 복사)"링크가 표시되며이를 사용하여 모든 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.