/
네트워크 구성

네트워크 구성

3 Tier 환경으로 구성

웹 서버는 인터넷에서 가장 중요한 인프라 SW중 하나로 HTTP 를 기반으로 사용자가 요청한 컨텐츠를 보내주고 사용자의 입력을 받아서 처리하는 역할을 수행합니다.


웹이 발달하면서 동적 컨텐츠를 제공해야 하는 필요성이 대두되었고 이를 위해 다양한 웹용 언어와 프레임워크가 탄생하였고 이런 도구들은 웹 서버 위에서 바로 동작하는 경우가 많았습니다.

대표적으로 PHP를 처리하는 mod_php, Perl 스크립트를 처리하는 mod_perl, python 용 mod_python 등이 웹 서버에서 동작하는 확장 모듈입니다.


이런 모듈은 웹 서버를 바로 활용할 수 있으므로 설치와 설정이 쉽고 사용하기도 쉬운 장점이 있었지만 서비스의 규모가 커질 경우 확장이 힘들고 웹 서버가 해킹당하면 DBMS도 해킹 당하는 등의 문제점이 나타났습니다.

이런 문제를 해결하기 위해서는 HTTP를 처리하는 Web Server, 웹 애플리케이션을 실행하는 WAS(Web Application Server), 그리고 DBMS 로 각각의 계층으로 분리하는 3 Tier 방식의 아키텍처로 구성하고 웹 서버의 역할은 최소화하는 것이 좋습니다.


웹 서버 DMZ에 위치시키고 수시로 보안패치와 버그패치를 해주어야 합니다.

DMZ

특히 웹 서버는 설치된 패키지가 적어야 패치 속도가 빠르므로 사용하는 패키지만 최소로 설치해하고 사용하지 않는 패키지는 삭제하는 것이 좋으며 특히 컴파일러 같은 개발도구와 X-Windows 관련 패키지는 반드시 삭제하는 것이 좋습니다.

웹 서비스 포트(80, 443)를 제외하고는 웹 서버의 모든 포트를 막도록 Inbound 방화벽 규칙을 설정합니다.

또 웹 서버는 내부망에 연결이 가능한 서버이므로 웹 서버에서 내부망으로 연결하는 방화벽 규칙은 WAS 의 서비스 포트만 연결 가능하도록 하는 것이 좋습니다.

웹 서버에는 SELinux나 AppArmor 같은 강제 접근 통제 기능을 적용하는 것이 필요하며 특히 SELinux 는 웹 서버에 대해서 엄격하게 통제하므로 웹 서버에는 꼭 적용하는 것이 좋습니다.

예로 SELinux는 웹 서버는 연결 가능한 포트를 미리 정해두고 있으며 허용하는 포트는 다음 명령어로 확인 가능합니다.


# semanage port -l |grep http_port_t

http_port_t                    tcp      9001, 9004, 8000, 8080, 10080, 8001, 80, 81, 443, 488, 8008, 8009, 8443, 9000



위와 같은 제약을 통해 웹 서버가 해킹당해도 이를 통해 내부 네트워크에 ssh로 침입해서 2차 해킹을 시도하거나 또는 웹 서버를 경유지로 하여 스팸 메일을 보내거나 외부 서버에 연결하는 등의 피해를 최소화할 수 있습니다.


Reverse Proxy 로 사용

이제 웹 서버는 HTML/CSS/JavaScript 같은 정적 컨텐츠를 전송하거나 또는 내부망에 있는 WAS 에 연결하여 웹 애플리케이션의 실행 결과를 받아서 사용자에게 전달하는 Reverse Proxy 로 역할을 제한하는 것이 필요합니다.

Reverse Proxy

Reverse Proxy 로 사용할 경우 WAS가 사용하는 포트만 열어주면 되며 다른 포트는 모두 사용을 막는 것이 좋습니다.

WASDefault Port개발 언어
tomcat8080(HTTP), 8009(AJP)Java
jetty8080(HTTP)Java
PHP-FPM9000PHP
unicorn8080ruby

만약 사용하는 WAS 의 포트가 SELinux에 등록되어 있지 않다면 차단되어 서비스가 불가능하므로 포트를 추가해야 하며 다음 명령어는 웹 서버가 9876 포트에 연결할 수 있도록 허용합니다.


semanage port -a -p tcp -t http_port_t 9876


만약 ValueError: Port tcp/9876 already defineㅇ 와 같은 에러가 발생한다면 SELinux 포트 규칙이 이미 정의되어 발생한 것이며 정책을 추가하는 -a 옵션대신 변경하는 -m 옵션을 사용하면 됩니다.

물리적인 구성에 대해서 알아보았으니 그러면 웹 서버를 견고하게 하기 위한 설정 방법을 알아 봅시다.


Related content

가상 호스트(Vritual Host)와 SNI(Server Name Indication)
가상 호스트(Vritual Host)와 SNI(Server Name Indication)
More like this
가상 호스트(Virtual Host) 동작 방식
가상 호스트(Virtual Host) 동작 방식
More like this
라라벨 미들웨어로 중요 페이지 HTTPS로 제공하기
라라벨 미들웨어로 중요 페이지 HTTPS로 제공하기
More like this
디렉터리 목록 비활성화
디렉터리 목록 비활성화
More like this
Web Server와 WAS(Web Application Server) 란
Web Server와 WAS(Web Application Server) 란
More like this
nginx + php-fpm 환경에서 가상 호스트(Virtual Host) 쉽게 구성하기
nginx + php-fpm 환경에서 가상 호스트(Virtual Host) 쉽게 구성하기
More like this