CS로 알아보는 프로젝트 - Docker의 IPTABLES 접근 Feat:UFW

 

안녕하세요.

 

혹시 여러분들은 IPTABLES와 UFW의 차이 그리고 Docker의 IPTABLES 접근에 대해 알고 계신가요?? 

 

오늘 해당 주제를 다루어보도록 하겠습니다.

 

먼저 IPTABLES란

 

리눅스  운영체제에서 네트워크 패킷  필터링 및 NAT를 수행하는 명령어 기반의 방화벽입니다.

 

이를 통해 네트워크 트래픽의 흐름을 제어하거나 보안을 강화하거나 리소스를 관리할 수 있습니다. 

 

명령어 중 Chain을 간단하게 알아보면 테이블 내에서 패킷 처리의 "흐름"을 정의합니다.

 

해당 부분을 기억하고 아래 글을 지속해서 읽어주시면 좋을 것 같습니다.

 

 

 

그럼 여러분들이 우분투에서 자주 사용하는 UFW는 무엇일까요? 

 

많은 분들이 IPTABLES을 모르고 UFW만을 사용하시는 분들도 있을 것이라 생각합니다.

 

UFW는 리눅스에서 사용되는 간단하고 사용자 친화적인 인터페이스를 가진 방화벽 도구입니다.

 

IPTABLES를 기반으로 설계되어 있습니다. 

 

이는 IPTABLES에 Chain으로 이어져 있다는 말인데요 아래에서 자세하게 알아보겠습니다.  

 

 

 

그럼 Docker의 IPTABLES에 대해 자세히 알아보도록 하겠습니다.

 

도커의 공식 문서를 확인해 보면 다음과 같이 IPTABLES에 접근하여 Port를 오픈시키는 것을 확인할 수 있습니다.

 

즉, Docker에서 -p 8080:8080 옵션을 주어 컨테이너를 실행시키면 IPTABLES에도 8080 포트가 오픈되게 되고 IPTABLES에 Docker로 네트워크 Chain이 연결되게 됩니다. 

 

아래 이미지를 참고해 보시면 9090 포트로 열었을 때 Chain이 형성되고 9090으로 매핑되는 것을 확인할 수 있습니다.

 

그럼 위에 상황을 정리해 볼까요.

 

IPTABLES에 접근하는 Docker와 UFW가 존재하게 하게 되고 아래와 같은 그림이 그려지게 됩니다.

 

그럼 외부에서 IPTABLES에 접근 가능한 포트는 UFW에서 열어준 22, 443, 80 포트와 Docker가 열어둔 8080 포트에 접근이 가능합니다.

 

하지만, UFW에서 ufw status을 치게 되면 22, 443, 80만이 보이게 되어 IPTABLES을 신경 쓰지 않는다면 8080은 마치 닫친 것처럼 보이는 것이죠. 

 

 

 

그럼 다음과 같은 접근이 가능하게 됩니다. 

 

8080을 열어주지 않았지만 여러분 서비스로 도메인:8080 포트로 연결을 시도하게 된다면 

 

먼저 IPTABLES에 접근하게 되고 Chain이 연결되어 있는 8080 컨테이너로 포워딩을 하게 됩니다.

 

즉! 여러분들이 의도적으로 해당 포트를 열지 않아도 컨테이너에 -p 옵션을 주면 외부에서 접근이 가능한 이유죠.

 

 

 

IPTABLES를 왜 제어해야 하는지 다음과 같은 상황에 예시를 들어보겠습니다.

 

여러분들은 Reverse Proxy를 사용하여 443 포트로 접근하는 /api 요청에 8080 컨테이너로 요청을 보내주고 싶다고 가정해 보겠습니다.

 

이를 위해 ufw에 80, 443,22 2개의 포트만 오픈해 두고 외부에서 443 포트로 /api요청을 보내면 정상적으로 8080 컨테이너로 연결이 가능할 것입니다.

 

하지만, -p 옵션을 통해 포트포워딩 설정을 해두었다면 외부에서 도메인:8080을 통해 다이렉트로 접근이 가능하게 됩니다.

 

즉, Reverse Proxy를 우회하며 다이렉트 접근이 될 뿐 아니라 ufw, nginx에서의 logging이 되지 않아 보안적으로 취약하게 됩니다.

 

 

 

조금 더 극단적인 예시를 들어보겠습니다.

 

아래와 같이 DB를 Docker로 올려뒀다면 외부에서 DB에 접근이 가능하게 되며 여러분의 DB는 보안적으로 매우 취약해지게 됩니다. 

 

운이 안 좋으면 데이터베이스를 잠그고 돈을 요구하는 상황을 마주할 수도 있게 되는 것이죠.

 

 

이러한 상황을 극복하기 위해서는 어떻게 해야 할까요?? 

 

Docker Network를 구성하여 EXPOSE로 구성하는 방법이 존재하고 UFW-Docker라는 솔루션을 이용하는 방법, IPTABLES의 접근을 차단하는 방법 등이 존재합니다. 

 

그중 EXPOSE를 이용해 극복하는 방법은 다음 포스팅에서 다루어보도록 하겠습니다.

 

 

 

극복방안은 아래 포스팅을 참고하시면 됩니다.

 

CS로 알아보는 프로젝트 - Docker Port와 Expose

안녕하세요. 여러분은 Docker의 -p 옵션에 대해 얼마나 잘 알고 계신가요?? 아래와 같이 docker run -p8080:8081을 하게 된다면 어떤 일이 이루어지는지 알고 계신 만큼 속으로 답변해 보세요. 혹시 -p 옵

security-gom.tistory.com