프로젝트 환경
위와 같은 프로젝트 환경이 구축되어있고, Nginx를 통한 https 리버스 프록시를 구축하려는 상황에서 재미있는 논의 주제가 나와 포스팅을 남기게 되었습니다.
논의 주제
Nginx를 컨테이너로 구동해야할까? EC2 호스트 위에서 구동해야할까?
라는 주제로 SSAFY 구미캠 인프라 자타공인 포조님과 토론을 하게 되었습니다.
최초의 고민하게 된 부분은 포트의 노출 및 외부로의 접근을 허용할 시 보안 측면에서 좋지 않다라는 부분에서 논의가 시작되었습니다.
사실 보안적인 부분에 대해서는 어떤 공격이 있는지, 어떤 대처를 해야하는지에 대해 깊게 공부해보지 못한 부분이다보니 토론내용이 잘 못 되었을 가능성은 높습니다.
하지만 아는 선에서 서로의 의견을 맞대어 보니 어느정도 정리된 부분이 있는 것 같아 유의미한 토론이 되었다고 생각하여 정리해보았습니다.
각각의 의견을 종합해보자면 다음과 같습니다.
Nginx In Container
“Nginx는 컨테이너로 같은 도커 네트워크 환경으로 구축되는게 좋아”
그 이유로 나온 내용은 다음과 같습니다.
1. “도커 컨테이너를 생성할 때 -p 옵션을 주지 않고, 외부 포트포워딩이 되지 않도록 해야한다. 도커에서도 기본옵션으로만 생성할 시 외부포트포워딩이 되지 않아.”
2. “컨테이너로 생성하게 될 경우 도커 네트워크를 활용하여 관리가 편해져. 또한 다른 외부포트를 열 필요가 없어지기 때문에 보안적인 측면에서도 좋다고 봐”
3. “같은 네트워크로 묶이게 될 경우 외부 포트포워딩을 하지 않아도 되기 때문에 포트스캐닝과 같은 혹시모를 공격에 대해 걱정하지 않아도 돼”
Nginx In Host
위와 같은 의견에 대해 저의 의견은 다음과 같습니다.
나 : “EC2 호스트 위에 구동하더라도 도커 외부 포트포워딩은 설정하고, 해당 포트에 대해서 인바운드 규칙 및 ufw 방화벽을 적용시켜 외부로의 접근을 막고, 내부의 Nginx에서만 접근하도록 막으면 상관없지 않아?”
나 : “추가로 가상호스트를 사용함으로써 오버헤드 측면도 고려해봐야할 것 같기도 해 예를 들어 Nginx컨테이너가 너무 많은 CPU나 메모리를 소비하면, 다른 컨테이너의 성능이 저하되거나 전체 시스템이 불안정해질 수 도 있지 않을까?”
나 : “하지만 EC2 호스트 위에 올리게 될경우에는 인바운드 규칙 및 ufw를 80, 443만 허용하도록 하고, 도메인:포트번호 로 오는 요청에 대해서는 막을 수 있도록 해야해. 서비스 컨테이너 외부 포트포워딩은 해줘야 하겠지.”
종합
이번 토론에서 초점은 포트번호를 노출시키지 않고, 80 및 443으로만 외부로의 접근을 허용하는 것이라고 할 수 있습니다.
포트를 노출시키지 않는 방법으로 첫 번째가 도커 실행 시 외부 포트포워딩을 하지 않는 방법이 있고, 외부 포트포워딩을 설정하고 인바운드 규칙 및 ufw 방화벽을 설정하여 외부 접근을 막던가, 특정 IP에서만 접근을 할 수 있도록 제약을 두는 것이 있습니다.
성능에 관해서는 가상화 오버헤드가 있긴하겠지만, 애초에 커널 OS를 공유하고 있기 때문에 그렇게 크지 않을 것 같다는 의견도 있었습니다.
또한 토론이 끝나고 포조님께서 찾아주신 레퍼런스를 통해서도 많은 의견이 있다는 걸 알 수 있었는데요.
링크를 남겨놓도록 하겠습니다.
https://www.reddit.com/r/selfhosted/comments/18gon3g/opening_ports_vs_reverse_proxying/
https://isc9511.tistory.com/m/126
정리
이번 토론으로 제 생각을 정리해서 전달해보면 다음과 같습니다.
“Nginx를 컨테이너로 올리는게 관리의 용이성 때문에 좋을 것 같다.”
근거로는 EC2 호스트에 올리게 될 경우 포트 접근을 막기위한 추가적인 설정 및 조치가 많아져 불편해질 수 있다.
또한 docker run 시 외부 포트포워딩을 안하는 것이 예기치 못한 공격에 대해 보안적으로는 제일 안전하다는 점.
마지막으로 앞서 설명한 프로젝트 환경에 대해 전체적으로 docker-compose를 통해 하나의 도커 네트워크에서 서비스 환경을 구축하는 것이 관리 및 유지보수가 편해질 것이라는 점을 생각할 수 있습니다.
ufw의 경우 예시를 들자면 다음과 같이 80,443에 대해서만 ALLOW되게끔 설정합니다.
docker의 경우 실행중인 서비스를 확인하면 다음과 같이 외부 포트포워딩이 걸지 않아도 되기 때문에 원인 모를 위험에 대한 걱정을 덜 수 있을 것 같습니다.
해당 주제에 대해 추가적인 의견이나 피드백은 언제나 환영하고 있습니다!
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!