1. 들어가며

서버를 어디에 두고, 누구에게 얼마나 열어줄지 잘못 정하면 서비스가 멀쩡해 보여도 전 세계에서 공격이 들어올 수 있다. 이 글은 Web, App, DB 세 서버를 배치하면서 흔한 실수를 하나씩 겪고 고쳐나가보는 것이 핵심이다. 온프레미스에서 구조를 설계한 뒤 AWS로 옮기고, 마지막으로 "내부라서 안전하다"는 생각의 한계를 살펴본다. 핵심 원칙은 하나로, 꼭 필요한 대상에게, 꼭 필요한 만큼만 연다.

2. 아무 서버나 인터넷에 열어두면 안 되는 이유

Web, App, DB 세 서버에 모두 공인 IP를 주고 인터넷에 직접 연결했더니, 하루 만에 DB 서버 3306 포트로 전 세계에서 로그인 시도가 들어왔다. DB는 외부와 통신할 일이 전혀 없는데도 인터넷에 그대로 노출되어 있었던 것이다.

공인 IP(Public IP)는 인터넷에서 직접 접근 가능한 주소다. 공인 IP를 받는 순간 누구나 그 서버로 패킷을 보낼 수 있게 되고, 인터넷에서 접근 가능한 공격 표면(Attack Surface)이 생긴다. 공인 IP라고 무조건 해킹되는 건 아니지만, 공개된 IP 대역을 자동으로 스캔하는 프로그램들이 있어서 공격자가 우리 서버를 특정하지 않아도 하루 만에 로그인 시도가 쏟아질 수 있다.

그렇다면 어떤 서버를 인터넷에 공개해야 할까. 원칙은 간단하다. 인터넷에서 직접 접근할 필요가 있는 서버만 공개한다. 외부에서 먼저 연결을 요청받는 서버는 Web뿐이다**.** App은 Web이 요청을 전달해주고, DB는 App만 접근하면 되니 외부에 공개할 이유가 없다. 그래서 Web은 Public, App과 DB는 Private으로 분리한다.

여기서 "Public은 위험하고 Private은 안전하다"는 이분법적 생각을 갖기보다, 인터넷과 직접 연결되는가를 기준으로 생각해야 오해가 없다. 또 Private이라고 아무도 못 들어가는 건 아니다. 필요한 통신은 허용해야 하고, 그 범위를 딱 필요한 만큼으로 제한하는 것이 최소 권한 원칙(Least Privilege)이다. 예를 들어, DB는 App하고만 통신하면 되니, App에게만 3306 포트를 열고 나머지는 전부 막으면 되는 것이다.

step1_public_vs_private_no_titles.png

3. 사설 IP와 DMZ

2005년의 기업 데이터센터로 돌아가 보자. AWS는 없고, 웹 서버, 사내 업무 서버, DB 서버, 관리자 PC가 있다. 이번에는 전부 사설 IP로 내부망에 넣었다.

**사설 IP(Private IP)**는 인터넷에서 직접 라우팅되지 않는 내부용 주소다. 그래서 외부에서는 내부망 서버에 직접 접근할 수 없고, 보안 측면에서는 확실히 안전해진 것처럼 느껴진다. 그런데 이번엔 외부 고객이 웹 서버에 접속을 못 한다. 생각해보면 당연하다. 웹 서버까지 내부망에 들어가 있으니, 인터넷에서 웹 서버로 닿을 방법이 없는 것이다.

그렇다면 앞선 방법처럼 웹 서버만 밖으로 빼고 나머지를 내부망에 두면 될까? 웹 서버는 인터넷에 노출되어 있어 가장 먼저 공격받는 서버인데, 이 웹 서버가 내부망과 바로 연결되어 있다면 웹 서버 하나가 뚫리는 순간 내부망 전체가 위험해진다.

그래서 필요한 것이 **DMZ(Demilitarized Zone, 비무장지대)**다. DMZ는 인터넷과 내부망 사이에 만들어 두는 별도의 네트워크 영역으로, 웹 서버처럼 외부에서 접근해야 하는 서버를 이곳에 배치한다. 즉, 인터넷에 공개되어야 하지만 내부망에 직접 두고 싶지는 않은 서버를 따로 격리하는 것이다.

그리고 DMZ와 내부망 사이에는 **방화벽(Firewall)**이 있어야 한다. 방화벽은 사전에 정해진 보안 규칙에 따라 트래픽을 모니터링하고 제어하는 보안 시스템이다. 인터넷에서 DMZ로는 웹 접속만, DMZ에서 내부망으로는 꼭 필요한 통신만 허용하고 나머지는 막는다. 이렇게 하면 웹 서버가 뚫리더라도 공격자는 내부망으로 가기 위해 방화벽을 한 번 더 넘어야 한다.

step2_onprem_dmz_structure.png

4. NAT 구조

웹 서버는 DMZ에, DB는 내부망에 두면서 구조는 깔끔해졌다. 그런데 이번엔 ****DB 서버의 OS 패치를 받아야 하는데, 내부망에 있다 보니 인터넷으로 나갈 수가 없다.