LabHub
배우기 러닝패스 코스

クラウドネットワーク設計

アウトバウンドを開けたのになぜ通らないのか

LabHub 에서 이어서 보기

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

한 줄 요약

보안그룹은 상태를 기억하고(stateful), NACL 은 기억하지 않습니다(stateless). 이 한 가지 차이에서 나머지 모든 차이가 나옵니다.

概念マップ: 저장・비저장・거부・번호 순서대로

왜 이게 필요했나

보안그룹에서 인바운드 80만 열어 두면 응답은 알아서 나갑니다. 요청이 들어온 것을 기억했다가 그 응답을 자동으로 허용하기 때문입니다.

NACL 은 다릅니다. 들어온 것을 기억하지 않으므로, 응답이 나가는 것도 따로 허용해야 합니다. 그리고 응답은 임시 포트(1024~65535)로 나가므로 그 범위를 아웃바운드에 열어야 합니다.

이걸 모르면 "인바운드는 열었는데 응답이 안 온다" 는 현상을 몇 시간 봅니다.

나란히 놓고 보기

보안그룹 네트워크 ACL
적용 대상 인스턴스(ENI) 서브넷 전체
상태 저장 — 응답 자동 허용 비저장 — 양방향 각각 필요
규칙 허용만 허용 + 거부
평가 모든 규칙을 본 뒤 허용 하나면 통과 번호 순서대로, 처음 맞는 규칙 적용
기본값 인바운드 전부 차단, 아웃바운드 전부 허용 기본은 전부 허용
개수 인스턴스당 여러 개 적용 가능 서브넷당 하나

NACL 의 순서 규칙이 만드는 함정

번호  타입      동작
100   전체      ALLOW
200   TCP 22    DENY      ← 절대 적용되지 않는다

100번에서 이미 허용되어 끝났기 때문에 200번은 볼 일이 없습니다. 보안그룹처럼 "거부가 우선" 이 아닙니다. 번호가 작은 것부터, 처음 맞는 규칙에서 끝입니다.

그래서 NACL 규칙 번호는 100, 200, 300 처럼 띄어서 매깁니다 — 나중에 사이에 끼워 넣을 자리를 남기기 위해서입니다.

보안그룹의 강력한 기능 — 그룹 참조

보안그룹 규칙의 출발지에 다른 보안그룹을 지정할 수 있습니다.

DB 보안그룹 인바운드:
  5432 ←  sg-app  (앱 서버 보안그룹)

IP 를 쓰지 않았다는 점이 중요합니다. 앱 서버가 몇 대든, 오토스케일링으로 늘고 줄든, IP 가 바뀌든 규칙을 고칠 필요가 없습니다. 역할로 규칙을 쓰는 것이라 클라우드에서 가장 실용적인 패턴입니다.

어떻게 나눠 쓰나

실무에서는 대개 이렇게 정리됩니다.

NACL 로 세밀한 제어를 하려 들면 임시 포트와 순서 규칙 때문에 곧 엉킵니다.

흔한 실수 다섯 가지

  1. 0.0.0.0/0 에 22번(SSH) 개방 — 스캐너가 몇 분 안에 찾습니다.
  2. 아웃바운드를 전부 열어 둠 — 침해 후 데이터 반출 경로가 됩니다.
  3. NACL 에서 임시 포트 아웃바운드를 안 열어 응답이 막힘.
  4. NACL 규칙 번호를 1, 2, 3 으로 붙여 나중에 끼워 넣을 자리가 없음.
  5. 보안그룹 설명(description)을 안 적어 6개월 뒤 아무도 이유를 모름.

5번이 의외로 아픕니다. 지워도 되는지 알 수 없어서 규칙이 계속 쌓입니다.

현장에서 만나는 모습

규칙이 늘어나는 것을 막는 방법

앞에서 보안그룹이 40개까지 늘어난 사례를 들었다. 이것은 게으름의 문제가 아니라 지울 근거를 만들지 않은 구조의 문제다. 몇 가지 규칙만 처음에 정해 두면 이 상태에 도달하지 않는다.

이름과 설명을 형식으로 강제한다. 어떤 서비스의 어떤 역할인지가 이름에서 읽히고, 규칙마다 왜 열었는지와 언제까지 필요한지가 설명에 적혀 있으면, 6개월 뒤에 지울지 말지를 판단할 수 있다. 설명이 비어 있으면 만들지 못하게 검사에서 막는 편이 낫다.

역할로 쓰고 주소로 쓰지 않는다. 그룹 참조를 쓰면 규칙 수가 자원 수와 무관해진다. 반대로 IP 로 쓰기 시작하면 서버가 늘 때마다 규칙이 늘고, 서버가 사라져도 규칙은 남는다. 어느 날 그 주소를 다른 사람이 쓰게 되면 의도치 않은 접근이 열리는 것도 IP 규칙의 위험이다.

임시로 연 것에 만료를 적어 둔다. 조사를 위해 잠시 여는 일은 늘 있다. 그때 설명에 날짜를 적는 규칙만 있어도, 나중에 만료가 지난 규칙을 기계적으로 뽑아낼 수 있다.

정기적으로 실제로 쓰이는지 본다. 흐름 로그를 켜 두면 어떤 규칙으로 실제 트래픽이 지나갔는지 알 수 있다. 몇 달간 한 번도 쓰이지 않은 허용은 지울 후보다.

그리고 규칙을 손으로 고치지 않는 것이 이 모든 것의 전제다. 콘솔에서 급하게 연 규칙은 코드에 없으므로 다음 배포에서 사라지거나, 반대로 코드와 실제가 어긋난 채로 남는다. 어느 쪽이든 나중에 "이 규칙이 왜 여기 있지" 를 아무도 답하지 못하는 상태로 이어진다.

다음에 볼 것

프라이빗 자원이 밖으로 나가는 세 가지 길과 각각의 값.