AWS에서 환경 구축 시 VPC에서 가상 방화벽 역할을 하는 NACL과 보안 그룹에 대해 알아보았다.
Network ACL
VPC의 네트워크에 관여하는 접근 제어 목록(ACL)이다.
IP, Port, 프로토콜을 확인하여 네트워크 패킷을 허용 또는 거부한다.
서브넷 단위로 설정하며 다수의 서브넷에 같은 ACL을 적용은 가능하나 한 서브넷에 다수의 ACL 적용은 불가능하다.
규칙 번호를 이용해 낮은 번호부터 우선 순위를 갖고 적용된다.
요청한 트래픽을 저장하지 않는 Stateless 속성이므로 리턴 트래픽을 허용하지 않는다.
아웃바운드로 요청할 서비스의 응답을 받기 위해서는 상응하는 인바운드 규칙도 설정해야한다.
인바운드 규칙 : 외부에서 내부로 들어올 수 있는 규칙, 출발지 IP를 식별하며 위협/침입을 방지한다.
아웃바운드 규칙 : 내부에서 외부로 나갈 수 있는 규칙, 목적지 IP를 식별하며 정보 유출을 방지한다.
동작 예시
어떤 서브넷의 NACL이 다음과 같이 인/아웃 바운드가 설정되었다고 가정해보자.
인 바운드
첫번째 패킷은 외부에서 출발지 IP "10.10.3.100"에서 22번 포트로 접근하였다.
인바운드 규칙에서 포트 범위는 허용되었으나 IP 대역이 "10.10.1.x"가 아니므로 접근이 거부된다.
두번째 패킷은 외부에서 출발지 IP "10.10.1.200"에서 80번 포트로 접근하였다.
인바운드 규칙에서 IP 대역이 "10.10.1.x"를 만족하였으나 22번 포트가 아니므로 접근이 거부된다.
세번째 패킷은 외부에서 출발지 IP "10.10.1.220"에서 22번 포트로 접근하였다.
인바운드 규칙에서 IP 대역이 "10.10.1.x"를 만족하고 22번 포트이므로 접근이 허용된다.
아웃 바운드
첫번째 패킷은 내부에서 목적지 IP "8.8.8.8"의 53번 포트로 가려고 한다.
아웃바운드 규칙에서 IP, Port 모두 허용되는 항목이 없으므로 요청이 거부된다.
두번째 패킷은 내부에서 목적지 IP "10.10.2.30"의 3306번 포트로 가려고 한다.
아웃바운드 규칙에서 IP "10.10.2.x"대역을 만족하고 3306 포트도 만족하므로 요청이 허용된다.
세번째 패킷은 두번째 패킷에 대한 리턴 트래픽이다.
NACL은 stateless 속성을 가지기 때문에 예외없이 접근 제어를 적용시킨다.
인바운드 규칙에서 IP, Port가 허용되지 않으므로 접근이 거부된다.
보안 그룹(Security Group)
클라우드의 각 인스턴스(EC2, RDS, ELB, ECS 등)에 직접 설정하는 방화벽이다.
IP, Port를 확인하여 허용할 트래픽만 설정하며 설정하지 않은 트래픽은 기본적으로 거부된다.
한 인스턴스에 여러 보안 그룹을 적용할 수 있으며 하나의 보안 그룹을 여러 인스턴스에 적용도 가능하다.
순서나 우선 순위에 상관없이 규칙이 적용된다.
요청한 트래픽을 저장하는 stateful 속성이므로 리턴 트래픽에 대한 인바운드를 설정하지 않아도 허용된다.
인바운드 규칙 : 외부에서 내부로 들어올 수 있는 규칙, 출발지 IP를 식별하며 위협/침입을 방지한다.
아웃바운드 규칙 : 내부에서 외부로 나갈 수 있는 규칙, 목적지 IP를 식별하며 정보 유출을 방지한다.
동작 예시
어떤 인스턴스의 보안 그룹 인/아웃 바운드 규칙이 다음과 같이 설정되었다고 가정한다. 규칙은 NACL예제와 동일하다.
인바운드
첫번째 패킷은 외부에서 출발지 IP "10.10.3.100"에서 22번 포트로 접근하였다.
인바운드 규칙에서 포트 범위는 허용되었으나 IP 대역이 "10.10.1.x"가 아니므로 접근이 거부된다.
두번째 패킷은 외부에서 출발지 IP "10.10.1.220"에서 22번 포트로 접근하였다.
인바운드 규칙에서 IP 대역이 "10.10.1.x"를 만족하고 22번 포트이므로 접근이 허용된다.
아웃바운드
첫번째 패킷은 내부에서 목적지 IP "10.10.2.30"의 3306번 포트로 가려고 한다.
아웃바운드 규칙에서 IP "10.10.2.x" 대역을 만족하고 3306 포트도 만족하므로 요청이 허용된다.
두번째 패킷은 첫번째 패킷에 대한 리턴 트래픽이다.
보안 그룹은 stateful 속성을 가지기 때문에 리턴 트래픽을 허용한다.
인바운드 규칙에서 IP 대역과 포트를 만족하지 않지만 접근이 허용된다.
NACL과 보안 그룹의 차이점
클라우드에서 인/아웃 바운드 규칙을 이용해 접근을 제어하는 NACL과 보안 그룹의 차이를 표를 통해 알아보자.
항목 | NACL(Network ACL) | 보안 그룹(Security Group) |
설정 대상 | 서브넷 | 인스턴스 |
규칙 설정 | 허용과 거부 | 허용 |
속성 | Stateless(리턴 트래픽 예외 없음) | Stateful(리턴 트래픽 예외적 허용) |
우선 순위 | 규칙 번호가 낮은 순서대로 처리 | X |
규칙 설정시 주의할 점
- 출발지 IP, 목적지 IP, 포트는 사용하는 정보만 허용해야 한다.
- CIDR를 이용한 IP 범위는 최소한으로 설정해야 한다.
- 모든 IP, 모든 포트 등의 설정은 없애거나 최소한으로 설정하고 적절한지 확인해야 한다.
- NACL과 보안 그룹 중 하나만 설정하지 말고 이중으로 적용하여 보안을 강화한다.
이와 관련된 정보로는 SK쉴더스에서 제공하는 클라우드 보안 가이드에서도 확인할 수 있다.
https://www.skshieldus.com/kor/support/download/report.do
실습
아키텍쳐 설명
전체적인 흐름으로는 인터넷을 통해 웹서버에 접근하며 웹 서버에서만 db-ec2로 접근할 수 있는 구조이다.
인스턴스
web-ec2 : apache2를 설치해 웹서버의 기능을 하고 mysql-client로 db-ec2 접근
db-ec2 : mysql-server를 설치해 web-ec2와 상호작용
라우팅 테이블
pub-rt : 인터넷과 연결될 서브넷을 위한 라우팅 테이블
pvt-rt : 내부 로컬에서만 연결되도록 설정한 라우팅 테이블
NACL
web-acl : 웹 인스턴스로 접근하는 인터넷 트래픽과 rds와 상호작용할 트래픽만 허용
db-acl : 웹 인스턴스와 상호작용할 트래픽만 허용
보안 그룹
web-sg : 웹 인스턴스로 접근하는 인터넷 트래픽과 rds와 상호작용할 트래픽만 허용
db-sg : 웹 인스턴스와 상호작용할 트래픽만 허용
실습에서는 아키텍쳐를 구성하기 위해 VPC, EC2 등을 생성하는 과정은 생략한다.
기초가 필요하다면 이전 글들에서 학습할 수 있다.
라우팅 테이블 구성
라우팅 테이블은 서브넷에서 접속할 수 있는 네트워크를 지정하는 규칙이다.
라우팅 테이블에 인터넷이 연결되어 있냐에 따라 서브넷의 퍼블릭과 프라이빗을 결정한다.
VPC 생성시 기본 라우팅테이블이 생성되며 로컬에만 연결된 프라이빗 상태이다.
퍼블릭 라우팅 테이블 설정
[VPC - 라우팅 테이블]로 진입해 기본적으로 생성된 라우팅 테이블을 클릭하고 라우팅 편집을 들어간다.
라우팅 추가를 눌러 새로운 라인을 입력할 수 있게 한다.
대상은 0.0.0.0/0으로 설정해 모든 주소로 설정하고 인터넷 게이트웨이를 지정한다.
모든 IP를 인터넷 게이트웨이로 라우팅할 수 있도록 한 것이다.
인터넷 게이트웨이가 없으면 설정할 수 없으므로 [VPC - 인터넷 게이트웨이]에서 생성 후 VPC 연결한다.
다음은 서브넷 연결 편집으로 가서 명시적 서브넷 연결을 설정한다.
설정한 라우팅 테이블을 사용할 서브넷을 선택한다.
실습에서는 web-sub가 퍼블릭 서브넷으로 구성되야 하므로 선택하였다.
프라이빗 라우팅 테이블 설정
라우팅 테이블을 새로 생성하면 기본적으로 인터넷이 연결되지 않은 프라이빗 테이블이다.
서브넷 연결 편집으로 명시적 서브넷만 추가하고 마무리한다.
실습에서는 rds-sub를 프라이빗 서브넷으로 사용한다.
마지막으로 라우팅 테이블들을 구분하기 위해 이름을 설정한다.
보안 그룹 구성
보안그룹은 인스턴스를 생성할 때 설정하거나 생성이 후 변경 및 수정이 가능하다.
VPC - 네트워크 및 보안 - 보안 그룹에서 생성 및 설정할 수 있다.
실습에서는 일단 EC2 생성 시에 보안 그룹에 대해 모든 트래픽 허용으로 생성한 후 서비스의 정상 연결을 확인한다.
이 후 보안 그룹 설정을 수정하면서 서비스들이 문제 없이 작동하는지 확인해야한다.
실습 참고 주소(직접 실습 시 본인의 주소 이용)
서브넷 주소 : web-sub - [10.10.1.0/24], db-sub - [10.10.2.0/24]
인스턴스 주소 : web-ec2 - [10.10.1.159], db-ec2 - [10.10.2.69]
web-sg
보안 그룹을 설정하기 전 ec2에서 어떤 서비스를 하는지 인지하고 그에 맞는 IP, Port를 허용해주어야한다.
web-ec2에서 할 수 있는 서비스는 다음과 같다.
관리자 호스트에서 SSH 연결
apache 웹서버 HTTP, HTTPS 연결
db-ec2와 MYSQL 연결
인바운드 규칙
첫번째 규칙은 22번 포트를 관리자 PC의 IP로 등록해 SSH를 접근 가능하도록 설정하였다.
두번째, 세번째 규칙은 인터넷에서 웹에 접근하는 트래픽을 허용하기 위해 0.0.0.0/0을 HTTP, HTTPS 포트로 설정하였다.
아웃바운드 규칙
첫번째 규칙은 3306포트를 db-ec2가 있는 서브넷의 주소 대역으로 부여하여 MYSQL 통신이 가능하도록 설정하였다.
보안그룹은 stateful 속성이기 때문에 요청한 mysql의 응답 트래픽을 인바운드에서 열어주지 않아도 허용된다.
db-sg
db-ec2의 서비스를 먼저 분석해보자.
web-ec2와 mysql 연결
인바운드 규칙
web-ec2에서 접근하는 mysql(3306)을 허용해주면 된다.
web-ec2의 프라이빗 주소를 허용하거나 해당 서브넷 대역을 허용할 수 있다.
아웃바운드 규칙
db-ec2에서 요청할 트래픽이 없으므로 아무것도 설정하지 않는다.
보안 그룹 변경 후 테스트
보안 그룹 변경은 다음과 같이 [작업 - 보안 - 보안 그룹 변경]에서 진행할 수 있다.
퍼블릭 IP를 통한 웹서버 접근과 ssh 통신, mysql 모두 정상적으로 동작한다.
설정한 보안그룹에서 규칙을 빼보면 서비스가 동작하지 않는 것도 확인할 수 있을 것이다.
NACL 구성
AWS 콘솔에서 [VPC - 보안 - 네트워크 ACL]에서 작업이 가능하다.
초기 설정 값은 모든 트래픽에 대해 인/아웃바운드 규칙이 열려있다.
ACL은 우선순위에 따라 하나씩 적용되므로 트래픽 성격에 맞게 규칙을 배치하여 부하를 줄일 수 있다.
실습 참고 주소(직접 실습 시 본인의 주소 이용)
서브넷 주소 : web-sub - [10.10.1.0/24], db-sub - [10.10.2.0/24]
인스턴스 주소 : web-ec2 - [10.10.1.159], db-ec2 - [10.10.2.69]
web-acl
보안 그룹 설정과 마찬가지로 서비스에 맞게 트래픽 규칙을 설정한다.
web-ec2에서 할 수 있는 서비스는 다음과 같다.
관리자 호스트에서 SSH 연결
apache 웹서버 HTTP, HTTPS 연결
db-ec2와 MYSQL 연결
자동으로 생성된 NACL의 이름을 web-acl로 바꾼 뒤 규칙 설정을 진행하여보자
인바운드 규칙
첫번째, 두번째 규칙은 웹 서비스에 접근하기 위한 인터넷에서의 트래픽을 허용한다.
세번째 규칙은 관리자 IP에서 web-ec2의 SSH 통신을 하기 위한 트래픽을 허용한다.
네번째 규칙은 아웃바운드의 리턴 트래픽을 허용해주기 위해 db-ec2의 3306 포트를 허용한다.
아웃바운드 규칙
첫번째 규칙은 db-ec2의 mysql을 사용하기 위한 요청을 허용한다.
두번째 규칙은 인바운드 요청에 대한 aws의 응답 포트(32768-65535)의 아웃 바운드를 허용한다.
이 규칙이 없으면 SSH(22)나 HTTP(80) 등의 접근에 응답을 반환해줄 수 없다.
db-acl
db-ec2의 서비스는 다음과 같다.
web-ec2와 mysql 연결
인바운드 규칙
첫번째 규칙은 web-ec2에서 mysql(3306) 요청을 허용한다.
아웃바운드 규칙
첫번째 규칙은 요청에 대한 응답을 처리하기 위해 aws 응답 포트(32768-65535)를 허용한다.
이렇게 설정이 완료되면 서비스에 대해 내가 필요한 IP, Port만을 허용하였으므로 보안이 강화됨과 더불어 관리가 용이하다.
VPC에서 가상 방화벽 역할을 해주는 NACL과 보안 그룹에 대해 알아보고 직접 설정해보는 실습을 진행하였다.
NACL과 보안그룹의 차이점에 대해 다시한번 이해하고 규칙 설정 간 주의할 점을 한번 더 확인해보도록 하자.