LabHub
배우기 러닝패스 코스

Cloud Network Design

Run Security Groups and NACLs by Hand

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

두 장치의 차이는 상태를 기억하는가 하나뿐이고, 나머지 차이는 전부 거기서 나옵니다. 이 실습은 클라우드 계정 없이 규칙표를 직접 쓰고, 그 규칙표를 읽는 평가기를 손으로 짜서 그 차이를 눈으로 봅니다.

조건

규칙표 형식

보안그룹은 다섯 칸입니다. 상대 자리에 다른 보안그룹 이름을 적을 수 있습니다.

그룹,방향,프로토콜,포트,상대
sg-db,inbound,tcp,5432,sg-app

네트워크 ACL 은 여섯 칸입니다. 번호가 작은 것부터 보고 처음 맞는 규칙에서 끝납니다.

번호,방향,동작,프로토콜,포트범위,상대
100,outbound,allow,tcp,443,0.0.0.0/0
32767,outbound,deny,all,all,0.0.0.0/0

포트범위443 처럼 하나만 적거나 1024-65535 처럼 범위로 적습니다. 프로토콜포트범위 에는 all 을 쓸 수 있습니다.

만드는 것

파일 내용
/root/sgnacl/sg.csv 세 계층 보안그룹 규칙
/root/sgnacl/nacl.csv app 서브넷 NACL
/root/sgnacl/nacl-ssh.csv · 03-order.md 순서 함정과 그 설명
/root/sgnacl/nacl_eval.py 규칙표를 읽는 평가기
/root/sgnacl/05-return.md 응답이 지나는 관문
/root/sgnacl/nacl-db.csv db 서브넷 가드레일
/root/sgnacl/07-notes.md 정리

참고

4단계의 평가기는 채점기가 숨겨 둔 규칙표로 시험합니다. 넓은 허용이 앞 번호에 있고 좁은 거부가 뒤에 있는 표가 들어 있어서, 보안그룹의 습관대로 거부를 우선시키면 거기서 걸립니다.

그룹 참조로 세 계층을 묶는다

세 계층의 보안그룹 규칙을 /root/sgnacl/sg.csv그룹,방향,프로토콜,포트,상대 다섯 칸으로 적으세요. 인터넷은 sg-web 의 443 으로만 들어오고, 웹은 sg-app 의 8080 을, 앱은 sg-db 의 5432 를 부릅니다.

sg-appsg-db 의 상대에는 IP 를 적지 마세요. 다른 보안그룹의 이름을 그대로 적을 수 있습니다 — 그것이 그룹 참조입니다.

앱 서버가 몇 대든, 오토스케일링으로 늘고 줄든 규칙을 고칠 필요가 없어집니다. IP 로 적으면 서버가 늘 때마다 규칙이 늘고, 서버가 사라져도 규칙은 남습니다.

22번을 0.0.0.0/0 에 여는 줄은 만들지 마세요. 채점기가 그것도 봅니다.

나가는 길과 돌아오는 길을 함께 연다

app 서브넷의 네트워크 ACL 을 /root/sgnacl/nacl.csv번호,방향,동작,프로토콜,포트범위,상대 여섯 칸으로 적으세요. 바깥 HTTPS(443)로 나가고 그 응답이 돌아와야 하되, 바깥에서 들어오는 22번과 나가는 3306 은 막혀 있어야 합니다.

NACL 은 상태를 기억하지 않습니다. 나가는 443 을 열어도 응답은 규칙을 따로 통과해야 하고, 응답은 우리 쪽 **임시 포트(1024–65535)**로 돌아옵니다.

마지막에 전부 거부하는 줄을 큰 번호로 하나 두면, 적지 않은 것은 자동으로 막힙니다. 그러면 22번과 3306 은 따로 막지 않아도 됩니다.

번호는 100, 200 처럼 띄워 매기세요. 1, 2, 3 으로 붙이면 나중에 사이에 끼워 넣을 자리가 없어 전부 다시 매겨야 합니다.

처음 맞는 규칙에서 끝난다

100 전체 허용 다음에 200 tcp 22 거부 를 둔 규칙표는 22번을 막지 못합니다. 22번만 막고 나머지는 통과시키는 인바운드 규칙을 /root/sgnacl/nacl-ssh.csv 에 쓰고, 원래 표가 왜 안 되는지 /root/sgnacl/03-order.md 에 적으세요.

NACL 은 번호가 작은 것부터 보고 처음 맞는 규칙에서 끝냅니다. 보안그룹처럼 거부가 우선하는 것이 아닙니다.

그러니 좁은 거부를 작은 번호에, 넓은 허용을 큰 번호에 둡니다. 순서를 바꾸는 것만으로 같은 두 줄이 뜻대로 동작합니다.

설명에는 번호, 처음, 22 가 들어가야 합니다.

평가기를 직접 짠다

/root/sgnacl/nacl_eval.py 를 만드세요. python3 /root/sgnacl/nacl_eval.py <규칙파일> <방향> <포트> <상대IP> 로 부르면 첫 줄에 allow 또는 deny 만 찍어야 합니다.

규칙은 세 줄입니다. 같은 방향의 규칙만 보고, 번호 오름차순으로 훑고, 프로토콜과 포트와 상대가 모두 맞는 첫 규칙의 동작을 그대로 냅니다. 아무것도 안 맞으면 deny 입니다.

주소가 대역 안에 드는지는 ipaddress.ip_address(x) in ipaddress.ip_network(cidr) 로 봅니다. 포트범위는 4431024-65535all 세 가지만 다루면 됩니다.

채점기는 숨겨 둔 규칙표로 시험합니다. 넓은 허용이 앞 번호에 있고 좁은 거부가 뒤에 있는 표가 들어 있어서, 거부를 우선시키면 거기서 걸립니다.

응답이 지나는 관문을 센다

인터넷에서 sg-web 의 443 으로 들어온 요청의 응답이 나갈 때, 보안그룹과 네트워크 ACL 각각에 무엇이 더 필요한지 /root/sgnacl/05-return.md 에 네 줄 이상 적으세요.

보안그룹은 들어온 연결을 기억합니다. 그래서 응답에 대한 규칙을 따로 쓸 일이 없습니다.

NACL 은 기억하지 않습니다. 응답도 규칙을 통과해야 하고, 응답이 향하는 곳은 상대의 임시 포트입니다. 그 범위를 숫자로 적으세요.

이 차이 하나 때문에 '인바운드는 열었는데 응답이 안 온다' 로 반나절을 씁니다.

서브넷 전체에 가드레일을 건다

db 서브넷이 인터넷으로 나가는 것 자체를 NACL 로 봉쇄하되 VPC(10.42.0.0/16) 안 통신은 살려 두세요. 규칙은 /root/sgnacl/nacl-db.csv 에 씁니다.

보안그룹은 인스턴스마다 붙지만 NACL 은 서브넷 전체에 붙습니다. 그래서 '이 서브넷은 인터넷에 나가지 않는다' 같은 넓은 가드레일에 어울립니다.

VPC 대역을 허용하는 규칙을 작은 번호에, 0.0.0.0/0 을 거부하는 규칙을 큰 번호에 두세요. 순서가 반대면 허용이 영영 적용되지 않습니다.

app 이 5432 로 들어오는 것과 그 응답이 임시 포트로 나가는 것까지 살아 있어야 합니다.

세 가지를 정리한다

/root/sgnacl/07-notes.md 에 세 줄 이상. 두 장치의 상태 처리 차이, NACL 번호가 정하는 것, 보안그룹 규칙을 IP 로 쓰면 생기는 일.

본문에 상태, 번호, 그룹 참조 가 들어가야 합니다.