디폴트로 생성되는 보안 그룹의 규칙을 자동으로 삭제하여 관리해 봤습니다.

디폴트로 생성되는 보안 그룹의 규칙을 자동으로 삭제하여 관리해 봤습니다.

디폴트로 생성되는 보안 그룹의 규칙을 자동으로 삭제하여 관리해 봤습니다.
Clock Icon2025.06.10

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 디폴트로 생성되는 보안 그룹의 규칙을 자동으로 삭제하여 관리해 봤습니다.

신경쓰이는 점

VPC를 생성하면 자동으로 [default] 라는 이름의 보안 그룹이 생성됩니다. 사실 삭제해도 상관이 없을 뿐더러 인바운드 규칙은 자기 자신을 설정하고 있기 때문에 보안상 문제는 없을 겁니다.

하지만, 사용자가 직접 생성한 리소스가 아니기 때문에 신경쓰이는 건 어쩔 수 없는 부분이라 생각하기 때문에 이번 블로그에서는 VPC가 생성될 때 해당 디폴트 보안 그룹의 인바운드 규칙, 아웃바운드 규칙을 자동으로 제거해 주는 구성을 만들어 봤습니다.

jw-blgsecurit1-1

IAM 정책 및 역할 생성

Lambda 함수에서 VPC와 보안 그룹에 접근하여 규칙을 수정하기 위한 권한을 할당합니다. 필요한 권한은 다음과 같습니다.

  • DescribeSecurityGroups
  • DescribeVpcs
  • RevokeSecurityGroupIngress
  • RevokeSecurityGroupEgress

이 권한들을 포함한 IAM 정책을 생성하고, IAM 역할에 연결하도록 합시다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeVpcs",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress"
            ],
            "Resource": "*"
        }
    ]
}

Lambda 함수 생성

이제 Lambda 함수를 생성합시다.

Lambda 함수에서는 디폴트로 생성된 보안 그룹(보안 그룹 이름이 default인 리소스)를 찾아서 인바운드 규칙과 아웃바운드 규칙을 삭제하는 코드입니다.

import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    print("=== 디폴트 보안 그룹 규칙 제거 시작 ===")

    # 1. 모든 VPC 조회
    vpcs = ec2.describe_vpcs()['Vpcs']

    for vpc in vpcs:
        vpc_id = vpc['VpcId']
        print(f"VPC 확인 중: {vpc_id}")

        # 2. 해당 VPC의 default 보안 그룹 찾기
        sgs = ec2.describe_security_groups(
            Filters=[
                {'Name': 'vpc-id', 'Values': [vpc_id]},
                {'Name': 'group-name', 'Values': ['default']}
            ]
        )['SecurityGroups']

        for sg in sgs:
            sg_id = sg['GroupId']
            print(f"디폴트 SG 발견: {sg_id}")

            # 3. Ingress (인바운드) 규칙 제거
            if sg.get('IpPermissions'):
                try:
                    ec2.revoke_security_group_ingress(
                        GroupId=sg_id,
                        IpPermissions=sg['IpPermissions']
                    )
                    print(f"  ✅ 인바운드 규칙 제거 완료: {sg_id}")
                except Exception as e:
                    print(f"  ❌ 인바운드 규칙 제거 실패: {e}")

            # 4. Egress (아웃바운드) 규칙 제거
            if sg.get('IpPermissionsEgress'):
                try:
                    ec2.revoke_security_group_egress(
                        GroupId=sg_id,
                        IpPermissions=sg['IpPermissionsEgress']
                    )
                    print(f"  ✅ 아웃바운드 규칙 제거 완료: {sg_id}")
                except Exception as e:
                    print(f"  ❌ 아웃바운드 규칙 제거 실패: {e}")

    print("=== 디폴트 보안 그룹 규칙 제거 종료 ===")

자동화하기 위해 EventBridge와 CloudTrail을 이용할 생각이지만, 수동으로 실행 시키면, 이 Lambda 함수 코드만으로도 디폴트 보안 그룹을 찾아내어 규칙들을 제거합니다. 하지만, 이번에는 자동화가 목적이므로 EventBridge와 CloudTrail을 활용헙사다.

EventBridge 규칙 생성

Lambda 함수를 생성했다면, EventBridge 규칙을 생성합니다. VPC가 생성될 때 디폴트 보안 그룹도 생성되므로 CloudTrail에서 VPC가 생성되는 이벤트가 발생했을 시 EventBridge → Lambda 함수가 트리거 되는 구조로 가야합니다.

이 때 필요한 이벤트는 [CreateVpc] 입니다.

{
  "source": ["aws.ec2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["ec2.amazonaws.com"],
    "eventName": ["CreateVpc"]
  }
}

결과 확인

VPC가 생성되고, 디폴트 보안 그룹이 생성되는데, 여기서 디폴트 보안 그룹의 규칙을 확인해 보면 인바운드 규칙과 아웃바운드 규칙이 제거된 것을 확인할 수 있습니다.

jw-blgsecurit1-2

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.