본문 바로가기

Programming/Python

[Python] Boto3로 Security Group rule 추가 (csv 파일 이용)

반응형

개요

SG 정책 추가를 관리형 웹 콘솔에서 보안 그룹을 적용할 경우 수십분이 걸리는 작업이다.

CIDR 대역이 아닌 각 IP당 여러 Port를 요구하기 때문에 보안 그룹 규칙이 굉장히 번잡해진다.

보안 그룹 정책은 고객사를 따라서 해야 하기 때문에 요청대로 해줘야 하는데 굉장히 노가다성 작업이 심해서 파이썬 Boto3와 CSV 파일을 이용하여 수고를 덜면 어떨까라는 생각이 들었다.

 

과정은 다음과 같다.

 

(Python 스크립트를 돌리기 이전에 웹 콘솔에 접속하여 Rule이 이미 허용은 되어 있는지, 라우트 테이블 정책은 어떻게 이루어져 있는지, Site to Site VPN Static Route 혹은 Transit Gateway Route Table에 라우팅이 설정되어 있는지 등을 사전에 확인 후 10 ~ 200개 사이의 노가다성 작업이 예상되는 것만 스크립트를 돌리는게 나을 듯 하다. 10개 미만은 웹 콘솔로 작업해도 금방 함)

 

1. Excel로 SG Rule을 기입한다.

2. CSV 파일로 변환한다.

3. Python Code를 돌린다.

 

코드는 아래와 같다. 간단한 코드이기 때문에 따로 설명은 안함

import boto3
import csv

"""
#1. Variable

p_name : Profile name
r_name : Region name
csv_file : csv file name
sg_id : Security Group Id you want to add rule.

#2. How to use

1. 엑셀에 값을 기입한 이후 CSV 파일로 변환합니다. (자동으로 ,로 구분됨)
    FromPort, ToPort, IpProtocol, CIDR IP, Description
    1) 하나의 Port만 Open하고 싶을 경우
        : From port와 To Port에 같은 수 입력
        
    2) Port 범위를 적용하고 싶은 경우
        : From, To에 8080, 8090을 기입하면 8080 ~ 8090이 적용됩니다.
        : 모든 Port를 적용하고 싶은 경우 From, To에 0, 65535 혹은 0, 0을 기입해줍니다.
        
    3) IpProtocol
        : tcp, udp, icmp, -1 중 하나를 기입하면 되며, -1일 경우 모든 Protocol이 적용된다.
        
    4) CIDR IP
        : Source IP를 기입하는 란이며, /24, /32 등 CIDR 대역까지 지정해주어야 합니다.
        : ex) 192.168.10.0/24, 10.107.10.4/32, 54.32.48.19/32, ..
    
    5) Description
        : 설명을 기입하는 란이며, 없을 경우 - 처리가 됩니다.
    
    추가) ICMP를 허용하고 싶다면 From, To, IP Protocol에 -1, -1, icmp를 기입해주면 됩니다.

"""

# Set variables
p_name = 'default'              # Required
r_name = 'ap-northeast-2'       # Required
csv_file = 'CSVTest.csv'        # Required
sg_id = 'sg-07c883aad06868693'  # Required

# Session
session = boto3.session.Session(profile_name=p_name)

# EC2 Client
ec2_cli = session.client(service_name='ec2', region_name=r_name)

# Load csv file
f = open("CSVTest.csv")
csv_f = csv.reader(f)

# Add ingress rules from csv file
for idx, row in enumerate(csv_f):

    # 첫 번째 라인 건너뜀
    if idx == 0:
        continue
    try:
        response = ec2_cli.authorize_security_group_ingress(
            GroupId=sg_id,
            IpPermissions=[
                {
                    'FromPort': int(row[0]),
                    'ToPort': int(row[1]),
                    'IpProtocol': row[2],
                    'IpRanges': [
                        {
                            'CidrIp': row[3],
                            'Description': row[4]
                        }
                    ]
                }
            ]
        )
        # Status Code 200일 경우 성공 메시지 반환
        if response.get('ResponseMetadata').get('HTTPStatusCode') == 200:
            print(
                f'[Rule Success] Port : {row[0].ljust(5)} ~ {row[1].ljust(5)}, CIDR IP : {row[3].ljust(20)}, Desc: {row[4]}')
        # Status Code != 200일 경우 실패 메시지 반환
        else:
            print(
                f'[Rule Failed]  Port : {row[0].ljust(5)} ~ {row[1].ljust(5)}, CIDR IP : {row[3].ljust(20)}, Desc : {row[4]}')
    # 예외 처리
    except Exception as e:
        print(
            f"[Error 발생  ] Port : {row[0].ljust(5)} ~ {row[1].ljust(5)}, CIDR IP : {row[3].ljust(20)}, Desc : {row[4]} \n에러 내용 : {e}")

 

1. Excel에 적용할 보안 그룹 규칙을 기입해줌

2. CSV 파일로 변환

 

3. 변수 기입

p_name, r_name : 프로필 및 리전 ( ~/.aws/credentials 파일에 저장되어 있는 프로필 이름 )

csv_file : 위의 CSV 파일

sg_id : 적용할 보안 그룹 ID

 

4. 스크립트 실행

맨 아래줄은 일부로 에러 발생하도록 함

 

5. 결과

 

정리

EC2 이름 스크립트를 짜려고 했지만 EC2에는 여러 SG를 붙일 수 있기 때문에 SG ID로 하였음

 

좀 더 나은 스크립트가 있는지는 차차 구상해볼 예정

반응형