보안 그룹 vs NACL, 초보자를 위한 설명
Source: Dev.to
보안 그룹 vs NACL: 초보자를 위한 설명
이전 글에서 우리는 다음을 배웠습니다.
- VPC
- 서브넷
- 인터넷 게이트웨이
- 라우트 테이블
이 구성 요소들은 AWS 리소스가 서로 그리고 인터넷과 통신하도록 도와줍니다.
하지만 아직 중요한 질문이 남아 있습니다.
서버에 접근할 수 있다면, 모든 사람이 그 서버에 접근해도 될까요?
답은 아니오입니다.
우리는 다음을 결정하는 보안 제어가 필요합니다.
- 누가 우리 리소스에 접근할 수 있는가
- 어떤 트래픽을 허용할 것인가
- 어떤 트래픽을 차단할 것인가
AWS는 이를 위해 두 가지 중요한 보안 레이어를 제공합니다.
- 보안 그룹
- 네트워크 액세스 제어 리스트(NACL)
처음에는 비슷해 보일 수 있지만, 두 기능은 서로 다른 레벨에서 작동하며 목적도 다릅니다.
이 글에서는 일상적인 예시를 통해 두 개념을 이해해 보겠습니다.
집을 예로 들어보세요
집으로 가는 도로가 있다고 해서 모든 사람이 집 안으로 들어갈 수 있는 것은 아닙니다.
여전히 필요합니다.
- 부지 주변의 게이트
- 현관문의 잠금 장치
AWS 네트워킹도 이와 비슷합니다.
- 라우트가 존재하고
- 인터넷이 서브넷에 도달할 수 있더라도
트래픽을 허용할지 차단할지를 결정하는 보안 규칙이 필요합니다.
바로 여기서 보안 그룹과 NACL이 등장합니다.
보안 그룹 (Security Group)
보안 그룹은 EC2 인스턴스에 직접 연결되는 가상 방화벽입니다.
쉽게 말해 인스턴스 수준에서 생성됩니다.
제어 대상
- 인바운드 규칙 (들어오는 트래픽)
- 아웃바운드 규칙 (나가는 트래픽)
보안 그룹을 집의 현관 앞에 서 있는 경비원에 비유할 수 있습니다.
모든 요청은 경비원을 통과해야 서버에 도달합니다.
예시: EC2 인스턴스에 웹 서버가 실행 중이고, HTTP 트래픽을 위해 포트 80을 사용한다고 가정합니다.
- 보안 그룹에 포트 80을 허용하도록 설정하면, 포트 80으로 들어오는 요청은 허용됩니다.
- 다른 포트로 들어오는 요청은 차단됩니다.
인터넷
↓
보안 그룹
↓
EC2 인스턴스
- 트래픽이 허용된 규칙과 일치하면 요청이 EC2 인스턴스로 전달됩니다.
- 일치하지 않으면 AWS가 요청을 차단합니다.
이 개념은 매우 중요합니다.
상태 유지 (Stateful)
사용자가 웹사이트에 접속하면 흐름은 다음과 같습니다.
사용자
↓
EC2 웹 서버
그리고 응답은 역방향으로 자동 전달됩니다.
EC2 웹 서버
↓
사용자
인바운드 트래픽이 허용되면, AWS는 자동으로 응답 트래픽을 허용합니다.
별도의 아웃바운드 규칙을 만들 필요가 없습니다.
이 동작을 상태 유지(stateful) 라고 부릅니다.
전화 통화를 생각해 보세요. 전화를 받으면 별도의 연결을 만들 필요 없이 대화를 이어갈 수 있습니다.
NACL (Network Access Control List)
NACL은 서브넷 수준에서 동작하는 방화벽입니다.
단일 EC2 인스턴스를 보호하는 것이 아니라, 해당 서브넷 전체를 보호합니다.
아파트 단지의 입구 게이트에 비유할 수 있습니다.
아파트에 들어오려면 먼저 게이트를 통과해야 합니다.
인터넷
↓
NACL
↓
서브넷
↓
보안 그룹
↓
EC2 인스턴스
NACL은 트래픽이 보안 그룹에 도달하기 전에 먼저 검사합니다.
예를 들어 서브넷에 다음과 같은 서버가 있다고 가정합니다.
- 웹 서버
- 애플리케이션 서버
- 모니터링 서버
각 서버마다 개별 규칙을 만들 필요 없이, 서브넷 수준에서 규칙을 정의할 수 있습니다.
- 포트 80 (HTTP)
- 포트 443 (HTTPS)
- 포트 22 (SSH) – 인터넷에서 허용
이 규칙들은 서브넷 전체에 적용됩니다.
무상태 (Stateless)
보안 그룹과 달리 NACL은 무상태(stateless) 입니다.
즉, AWS가 자동으로 반환 트래픽을 허용하지 않습니다.
반환 트래픽을 허용하려면 아웃바운드 규칙을 명시적으로 설정해야 합니다.
예시: 인바운드 HTTP 트래픽을 허용했을 때
인터넷
↓
서브넷
응답이 돌아가려면 다음과 같은 아웃바운드 규칙이 필요합니다.
서브넷
↓
인터넷
아웃바운드 규칙이 없으면 통신이 실패합니다.
이 동작을 무상태(stateless) 라고 부릅니다.
비교 표
| 기능 | 보안 그룹 | NACL |
|---|---|---|
| 적용 위치 | EC2 인스턴스 수준 | 서브넷 수준 |
| 상태 유지 | 예 | 아니오 |
| 트래픽 허용 | 예 | 예 |
| 트래픽 차단 | 아니오 | 예 |
| 적용 대상 | EC2 인스턴스 | 서브넷 |
| 보호 범위 | 개별 리소스 | 전체 서브넷 |
방어 깊이 (Defense in Depth)
AWS는 방어 깊이(Defense in Depth) 라는 보안 원칙을 따릅니다.
단일 보안 레이어에만 의존하지 않고, 여러 레이어를 겹쳐 보호합니다.
- NACL → 서브넷 보호
- 보안 그룹 → EC2 인스턴스 보호
하나의 레이어가 잘못 설정되더라도 다른 레이어가 보호 역할을 수행합니다.
실전 예시: 온라인 쇼핑 애플리케이션
구성 요소
- 로드 밸런서
- 애플리케이션 서버
- 데이터베이스
보안 흐름
- 사용자가 로드 밸런서에 접근하도록 허용
- 로드 밸런서가 애플리케이션 서버에 접근하도록 허용
- 애플리케이션 서버가 데이터베이스에 접근하도록 허용
- 서브넷 수준에서 불필요한 트래픽 차단 (필요한 포트만 허용)
이렇게 하면 여러 보안 레이어가 겹쳐져 보다 강력한 방어가 구현됩니다.
정리
- 보안 그룹: 개별 EC2 인스턴스를 보호, 상태 유지, 트래픽 허용/차단 가능
- NACL: 전체 서브넷을 보호, 무상태, 트래픽 허용/차단 가능
두 기능 모두 AWS 보안에서 중요한 역할을 하지만, 적용 레벨과 동작 방식이 다릅니다.
다음 글에서는 실제 실습을 통해 다음을 수행합니다.
- 커스텀 VPC 생성
- EC2 인스턴스 실행
- 보안 그룹으로 트래픽 허용
- NACL로 트래픽 차단
- 두 보안 레이어가 어떻게 함께 작동하는지 관찰
🚀 실습 구현을 기대해 주세요!