क्या AWS सिक्योरिटी ग्रुप को कॉपी करना संभव है?


17

हमारे पास कुछ सुरक्षा समूह हैं जिनके पास काफी कुछ नियम हैं। केवल मामूली अंतर को समायोजित करने के लिए कई सुरक्षा समूहों के लिए समान नियमों को फिर से बनाने के बजाय, क्या शुरुआती बिंदु के रूप में उपयोग करने के लिए सुरक्षा समूह की प्रतिलिपि बनाना संभव है, या विरासत का उपयोग करना, आदि?


2
आप एक ही संसाधन में कई सुरक्षा समूह लागू कर सकते हैं। सुरक्षा समूह की प्रतिलिपि बनाना एक बुरे विचार की तरह लगता है। बस नए नियमों को एक नए समूह में जोड़ें और इसे सही उदाहरणों पर लागू करें।
लादादादा

मैंने अभी इस जानकारी को खोजने की कोशिश की, लेकिन ऐसा कुछ भी नहीं मिला जिससे पता चले कि अतिरिक्त सुरक्षा समूहों को एक singe EC2 उदाहरण में कैसे जोड़ा जाए। क्या आप लिंक प्रदान कर सकते हैं?
बिल रोसमस

मैंने अभी-अभी पायथन बोटो क्लास लाइब्रेरी में एक नया फंक्शन लिखा है जिसे मैं धीरे-धीरे जोड़ता हूं। एक पीआईटीए से मुझे निपटना नहीं चाहिए था (जैसा कि बहुत सारी चीजें हैं) लेकिन कम से कम अब मेरे पास एक सरल और अधिक सीधे फॉरवर्ड इंटरफ़ेस है जो मैंने देखा है और कुछ भी नहीं है।
बिल रोज़्मस 17

जवाबों:


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"
}

वहां से आपको यह पता लगाने में सक्षम होना चाहिए कि आपके सुरक्षा समूहों के निर्माण को कैसे सरल बनाया जाए।


हाँ, मुझे लगा कि यह मार्ग है जिसे लेने की आवश्यकता होगी ... इस तरह से बोटो का उपयोग करने के बारे में भी सोच रहा था। उदाहरण के लिए धन्यवाद ... आपको इसके लिए अंगूठा देगा। धन्यवाद।
बिल रोसमस

आपको क्षेत्र 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 कंसोल पर इंगित करते हैं तो बेहतर होगा।
माइकल मैकगर्हा

4
जब तक आप एक ही क्षेत्र में काम कर रहे हैं, तब तक यह काम करता है। यदि आपको किसी अन्य क्षेत्र में डुप्लिकेट करने की आवश्यकता है, तो आपको अभी भी EC2 CLI का उपयोग करने की आवश्यकता है।
डेल एंडरसन

यह विकल्प VPC डैशबोर्ड में मौजूद नहीं है।
evan.bovie

3

इस ब्लॉग पर एक नज़र रखने पर विचार करें। आप जो देख रहे हैं, उसके लिए यह उपयोगी हो सकता है।

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


मैंने ऐसा करने के लिए कुछ पायथन बोटो सामान लिखा। मैंने जो कुछ भी देखा है, उससे अधिक उपयोग करना आसान है।
बिल रोज़्मस

कृपया अपनी लिंक की सामग्री को संक्षिप्त करें
वार्ड - मोनिका

1
काम नहीं करता है। Use of uninitialized value $type in string eq at create-firewall-script.pl line 43, <> line 1 (#1)
सनकैचर

3

यहाँ एक कस्टम लाइब्रेरी से 'कॉपी सिक्योरिटी ग्रुप्स' पायथन / बोटो विधि है, मैंने इस प्रकार की चीज़ों को आसान बनाने / उन्हें स्वचालित करने के लिए लिखा है .. अंततः यही वह समाधान था जिसके साथ मैं आया था।

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 

कोड इंडेंटिंग अजीब से बाहर दिखता है। क्या आप इसे ठीक कर सकते हैं?
शॉन

@ शॉन - सॉरी बहुत लंबा हो गया। मैं वास्तव में अभी इसके साथ काम नहीं कर रहा हूं। यह एक विधि है जिसे मैंने एक पुस्तकालय से काटा है, जो मैंने लिखा था, और जब मैं इसका उपयोग कर रहा था तो मैंने इसे नियमित रूप से उपयोग किया। इसलिए मुझे पता है कि यह उस समय काम किया था जब मैंने इसे यहां पोस्ट किया था। यदि यह एक इंडेंट चीज़ है, तो इसे समझ पाना बहुत मुश्किल नहीं होना चाहिए (लेकिन मेरे पास अभी समय नहीं है कि आप इसके साथ फील कर सकें, लेकिन आप कर सकते हैं)। यह पुस्तकालय के संस्करण के साथ भी एक मुद्दा हो सकता है? किसी भी मामले में, यह अभी भी किसी के लिए एक अच्छा प्रारंभिक बिंदु होने की संभावना है, जो इस कार्यक्रम को बोटो के साथ करना चाहते हैं।
बिल रोसमस

1
क्या है? मुझे इसे कहां से आयात करना चाहिए?
सनकैचर

2

इस स्क्रिप्ट को मैंने इसे पूरा करने के लिए बनाया है: aws_sg_migrate

नमूना उपयोग है

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

यह इस पर आधारित है और पायथन 3 के लिए अनुकूलित है।


उपयोग दिलचस्प लगता है लेकिन कोई स्क्रिप्ट संलग्न नहीं है?
जजाराव

क्षमा करें, = :) लिंक जोड़ा गया
सनकैचर

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


यह वास्तव में "उत्तर" प्रस्तुत करने के लिए एक अच्छा उम्मीदवार नहीं है। एक टिप्पणी के रूप में उपयोगी हो सकता है जब आप उन पोस्ट करने के लिए पर्याप्त प्रतिनिधि है।
एंड्रयू बी

0

EC2 कंसोल से, लॉन्च इंस्टेंस पर क्लिक करें और डमी जानकारी दर्ज करने के लिए तब तक आगे बढ़ें जब तक कि आप सुरक्षा समूह अनुभाग पर न पहुंच जाएं।

यहां से "एक मौजूदा सुरक्षा समूह का चयन करें" पर क्लिक करें, और नीचे आपको उस विशेष वीपीसी के लिए सभी सुरक्षा समूह दिखाई देंगे। आपको "क्रियाएँ" के तहत एक "कॉपी टू न्यू" लिंक देखना चाहिए, अपने सभी एसीएल को नए एसजी में कॉपी करने के लिए इसका उपयोग करें।

या मुझे लगता है कि आप एक स्क्रिप्ट का उपयोग कर सकते हैं - यह तेजी से IMO है ..


0

मुझे एक समान समस्या थी लेकिन विभिन्न खातों में एसजी की प्रतिलिपि बनाना।

बस शुरुआत में कुछ CONSTANTS निर्दिष्ट करें और फ़ंक्शन 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)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.