보안 규칙이 상당히 많은 보안 그룹이 있습니다. 사소한 차이점을 수용하기 위해 여러 보안 그룹에 대해 동일한 규칙을 다시 작성하지 않고 시작점으로 사용하기 위해 보안 그룹을 복사하거나 상속 등을 사용할 수 있습니까?
답변
웹 인터페이스에서 보안 그룹을 복사 할 수없는 것 같습니다. 그러나 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"
}
여기에서 보안 그룹 작성을 단순화하는 방법을 파악할 수 있어야합니다.
답변
AWS EC2 콘솔을 사용하면 이제 보안 그룹을 선택하고 UI에서 “새로 복사”작업을 수행 할 수 있습니다.
답변
답변
이 블로그를 살펴보십시오. 보고있는 내용에 유용 할 수 있습니다.
답변
다음은 이러한 종류의 작업을보다 쉽고 자동화하기 위해 작성한 사용자 지정 라이브러리의 ‘복사 보안 그룹’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
답변
이 작업을 수행하기 위해 만든 스크립트는 다음과 같습니다. aws_sg_migrate
샘플 사용법은
python3 aws_sg_migrate.py --vpc=vpc-05643b6c --shell --src=us-east-1 --dest=us-west-1 sg-111111
답변
동일한 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'])