Chapter 07

보안 그룹 최적화

학습 목표

  • 보안 그룹(Security Group)의 역할과 중요성을 이해한다
  • SSH(포트 22) 접근을 내 IP로만 제한하여 보안을 강화한다
  • RDS 보안 그룹이 EC2 보안 그룹만 허용하는지 확인한다
  • 아웃바운드 규칙의 개념을 이해하고 검토한다

왜 보안 그룹이 중요한가?

Chapter 01~06에서 ShopEasy 애플리케이션을 성공적으로 배포했습니다. 이제 보안 강화(Security Hardening) 단계입니다. 가장 먼저 점검해야 할 것은 보안 그룹(Security Group)입니다.

현재 EC2 인스턴스의 보안 그룹에는 SSH(포트 22)가 0.0.0.0/0으로 열려 있습니다. 이것은 인터넷의 모든 사람이 SSH로 접속을 시도할 수 있다는 뜻입니다. 이것은 매우 위험합니다!

비유로 이해하기: 건물 경비원

보안 그룹은 건물 경비원과 같습니다. 경비원은 방문자를 확인하고, 허용된 사람만 건물에 들여보냅니다.

현재 상황: 경비원이 "SSH 문(22번 문)"에는 누구나 들어오세요!라고 안내하고 있습니다. 전 세계 누구든 SSH 문을 두드릴 수 있습니다.

목표: 경비원에게 "SSH 문은 우리 직원(내 IP)만 출입 가능합니다"라고 지시를 변경하는 것입니다. 5000번 문(API)은 고객(사용자)이 사용해야 하니 열어둡니다.

SSH 0.0.0.0/0이 위험한 이유

인터넷에는 자동화된 봇이 24시간 SSH 포트를 스캔하며 침입을 시도합니다. 실제로 EC2 인스턴스를 생성하고 몇 분 안에 SSH 접속 시도가 시작됩니다. 비밀번호가 약하거나, 키 파일이 유출되면 서버를 탈취당할 수 있습니다.

  • 암호화폐 채굴에 악용
  • 다른 서버 공격의 경유지로 사용
  • 데이터베이스의 고객 정보 유출
  • AWS 계정의 과도한 요금 발생
핵심 개념: 보안 그룹 = 가상 방화벽

보안 그룹(Security Group)은 AWS에서 제공하는 가상 방화벽입니다. 인바운드(들어오는 트래픽)와 아웃바운드(나가는 트래픽)를 규칙으로 제어합니다.

인바운드 규칙: 어떤 트래픽이 EC2로 들어올 수 있는지 결정합니다. 예: "포트 22에 내 IP에서만 접속 허용"

아웃바운드 규칙: EC2에서 나가는 트래픽을 제어합니다. 기본값은 모든 트래픽 허용입니다.

상태 저장(Stateful): 인바운드로 허용된 트래픽의 응답은 아웃바운드 규칙과 관계없이 자동으로 허용됩니다.

현재 상태 vs 목표 상태

현재 EC2 보안 그룹 (문제 있는 상태)

현재 EC2 보안 그룹 - 인바운드 규칙
인터넷 전체
0.0.0.0/0
(전 세계 누구나)
EC2 인스턴스
포트 22 (SSH) 열림
포트 5000 (API) 열림
타입포트소스상태
SSH220.0.0.0/0 (전체)위험!
Custom TCP50000.0.0.0/0 (전체)서비스용 (필요)

목표 EC2 보안 그룹 (최적화 후)

목표 EC2 보안 그룹 - 인바운드 규칙
내 PC
xxx.xxx.xxx.xxx/32
(내 IP만)
포트 22 (SSH)
사용자 브라우저
0.0.0.0/0
(전체 허용)
포트 5000 (API)
EC2 인스턴스
SSH: 내 IP만 허용
API: 전체 허용
타입포트소스상태
SSH22내 IP/32 (나만)안전
Custom TCP50000.0.0.0/0 (전체)서비스용 (필요)
/32란? CIDR 표기법

/32는 IP 주소 하나만 의미합니다. 예를 들어 203.0.113.50/32203.0.113.50 딱 하나의 IP만 의미합니다.

/0은 모든 IP를 의미합니다. 0.0.0.0/0은 인터넷의 모든 IP 주소입니다.

AWS 콘솔에서 "My IP"를 선택하면 자동으로 현재 내 공인 IP + /32가 입력됩니다.

RDS 보안 그룹 확인

EC2뿐만 아니라 RDS의 보안 그룹도 확인해야 합니다. RDS는 절대로 인터넷에서 직접 접근할 수 없어야 합니다. 오직 EC2 보안 그룹에서만 접근을 허용해야 합니다.

올바른 RDS 보안 그룹 설정
EC2 보안 그룹
sg-xxxxx (EC2 SG)
RDS 보안 그룹
포트 3306 (MySQL)
소스: EC2 SG만 허용
RDS 보안 그룹에 0.0.0.0/0이 있으면 안 됩니다!

RDS에 0.0.0.0/0이 소스로 설정되어 있다면, 인터넷에서 데이터베이스에 직접 접속할 수 있습니다. 이는 고객 정보, 주문 정보 등이 유출될 수 있는 심각한 보안 문제입니다. RDS의 소스는 반드시 EC2 보안 그룹 ID로 설정해야 합니다.

실습: 보안 그룹 최적화

실습: ShopEasy 보안 그룹 규칙 강화하기
비용 안내

보안 그룹 설정 변경은 추가 비용이 발생하지 않습니다. 보안 강화를 통해 오히려 해킹으로 인한 예상치 못한 비용을 방지할 수 있습니다.

  1. 현재 보안 그룹 규칙 확인

    먼저 EC2 인스턴스에 연결된 보안 그룹의 현재 인바운드 규칙을 확인합니다. 어떤 포트가 어떤 IP 범위에 열려 있는지 파악하는 것이 첫 번째 단계입니다.

    확인 사항

    • EC2 인스턴스에 연결된 보안 그룹 이름과 ID
    • 인바운드 규칙: 어떤 포트가 열려 있는지
    • 각 규칙의 소스(Source): 0.0.0.0/0인지, 특정 IP인지
    보안 그룹 확인 위치

    EC2 콘솔에서 인스턴스를 선택하면 하단의 Security 탭에서 연결된 보안 그룹을 확인할 수 있습니다. 보안 그룹 이름을 클릭하면 상세 규칙을 볼 수 있습니다.

    AWS 콘솔 → EC2 → Instances → ShopEasy 인스턴스 선택 → 하단 Security 탭 → Security groups에서 보안 그룹 링크를 클릭합니다. Inbound rules 탭에서 현재 규칙을 확인합니다.

    또는 EC2 → 왼쪽 메뉴의 Security Groups에서 직접 찾을 수도 있습니다.

  2. SSH 접근을 내 IP로 제한

    현재 SSH(포트 22)의 소스가 0.0.0.0/0(전체 인터넷)으로 되어 있다면, 이를 내 IP 주소(/32)로 변경합니다. 이렇게 하면 오직 나만 SSH로 EC2에 접속할 수 있습니다.

    변경 내용

    • 변경 전: SSH (포트 22), 소스: 0.0.0.0/0
    • 변경 후: SSH (포트 22), 소스: 내 IP/32 (예: 203.0.113.50/32)
    "My IP" 자동 입력

    AWS 콘솔의 보안 그룹 편집 화면에서 Source 드롭다운을 "My IP"로 선택하면, AWS가 현재 접속 중인 IP 주소를 자동으로 /32와 함께 입력해줍니다. 직접 IP를 찾을 필요가 없습니다!

    IP가 바뀌면 SSH 접속이 안 됩니다!

    카페, 학교, 집 등 네트워크 환경이 바뀌면 공인 IP가 변경됩니다. IP가 바뀌면 SSH 접속이 차단되므로, 보안 그룹에서 IP를 업데이트해야 합니다. AWS 콘솔은 웹 브라우저로 언제든 접속할 수 있으므로, 콘솔에서 보안 그룹 규칙을 수정하면 됩니다.

    EC2 → Security Groups → EC2 보안 그룹 선택 → Inbound rules 탭 → Edit inbound rules 클릭

    SSH 규칙의 Source를 "Custom"에서 "My IP"로 변경하고 Save rules를 클릭합니다.

  3. RDS 보안 그룹 확인

    RDS(MySQL)에 연결된 보안 그룹이 올바르게 설정되어 있는지 확인합니다. RDS 보안 그룹의 인바운드 규칙에서 소스가 EC2 보안 그룹 ID인지 확인합니다.

    올바른 설정

    • 타입: MySQL/Aurora
    • 포트: 3306
    • 소스: EC2 보안 그룹 ID (예: sg-0abc1234def56789)

    잘못된 설정 (위험!)

    • 소스: 0.0.0.0/0 ← 인터넷 전체에서 DB 접속 가능!
    보안 그룹 ID를 소스로 사용하는 이유

    RDS의 소스로 IP 주소 대신 EC2 보안 그룹 ID를 지정하면, 해당 보안 그룹에 속한 모든 인스턴스에서의 접근을 허용합니다. EC2의 IP가 바뀌더라도(인스턴스 재시작 등) 보안 그룹 ID는 변하지 않으므로 더 안전하고 편리합니다.

    EC2 → Security Groups에서 RDS에 연결된 보안 그룹을 찾습니다. (이름에 "RDS" 또는 "database"가 포함된 보안 그룹)

    Inbound rules 탭에서 포트 3306의 소스가 sg-로 시작하는 EC2 보안 그룹 ID인지 확인합니다.

    만약 0.0.0.0/0으로 되어 있다면, EC2 보안 그룹 ID로 변경해야 합니다.

  4. 불필요한 아웃바운드 규칙 검토

    EC2 보안 그룹의 아웃바운드(Outbound) 규칙도 확인합니다. 기본 설정은 모든 트래픽을 허용(All traffic, 0.0.0.0/0)합니다.

    확인 사항

    • EC2 보안 그룹의 Outbound rules 탭 확인
    • 기본 규칙: All traffic, 0.0.0.0/0 (모든 아웃바운드 허용)
    아웃바운드 규칙을 지금 제한하지 않는 이유

    아웃바운드를 제한하면 EC2에서 외부로 나가는 트래픽이 차단됩니다. 현재 EC2는 다음과 같은 외부 통신이 필요합니다:

    • RDS(MySQL): 포트 3306으로 데이터베이스 연결
    • DynamoDB: HTTPS(443)로 API 호출
    • S3: HTTPS(443)로 이미지 업로드/다운로드
    • npm/yum: 패키지 다운로드 (HTTPS 443, HTTP 80)

    아웃바운드를 잘못 제한하면 서비스가 중단될 수 있으므로, 이번 실습에서는 기본값(Allow All)을 유지합니다. 실무에서는 필요한 포트/대상만 허용하는 것이 모범 사례입니다.

    EC2 → Security Groups → EC2 보안 그룹 선택 → Outbound rules 탭을 확인합니다.

    기본적으로 "All traffic - 0.0.0.0/0" 규칙이 하나 있어야 합니다. 이 규칙을 수정하거나 삭제하지 마세요.

확인 사항

  • EC2 보안 그룹의 인바운드 규칙을 확인했는가?
  • SSH(포트 22)의 소스가 0.0.0.0/0에서 내 IP(/32)로 변경되었는가?
  • 변경 후에도 SSH로 EC2에 정상 접속이 되는가?
  • 포트 5000(API)은 여전히 0.0.0.0/0으로 열려 있어 서비스가 정상 동작하는가?
  • RDS 보안 그룹의 소스가 EC2 보안 그룹 ID로 되어 있는가? (0.0.0.0/0이 아닌지 확인)
  • 아웃바운드 규칙이 기본값(All traffic 허용)으로 유지되어 있는가?
  • S3 웹사이트에서 전체 서비스(상품 조회, 리뷰 등)가 정상 동작하는가?
이번 챕터에서 달성한 것
  • 보안 그룹의 역할과 중요성을 이해
  • SSH 접근을 내 IP로만 제한하여 불필요한 외부 접근 차단
  • RDS 보안 그룹이 EC2 보안 그룹만 허용하는지 확인
  • 아웃바운드 규칙의 개념과 현재 설정 검토
  • 최소 권한 원칙(Least Privilege)의 첫 번째 적용!
보안은 여정입니다

보안 그룹 최적화는 보안 강화의 첫 번째 단계입니다. 다음 챕터에서는 IAM 역할의 권한을 최소화(Least Privilege)하여 보안을 더 강화합니다. 보안은 한 번에 완성하는 것이 아니라, 지속적으로 점검하고 개선하는 과정입니다.