1. 개요

WEB 보안 설정으로 꼭 하는 것 중에 Server Header 정보 노출 제한이 있죠! Apache 2.4 기준으로 아래와 같이 설정을 하게 됩니다.

 * 설정 파일 : conf/extra/httpd-default.conf

ServerTokens Prod
ServerSignature Off

하지만, 이 설정의 최선은 이런거죠.. Apache 를 쓰고 있다는 건 알게됩니다. ㅠ_ㅠ

HTTP/1.1 200 OK
Date: Thu, 18 Jul 2019 05:59:25 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>

HTTPD 소스를 수정하여 재컴파일을 통해 해당 문자열을 바꿀 수는 있지만, 다음의 모듈을 사용하면 Server 헤더 정보를 우리가 원하는 문자열로 변경할 수 있습니다! :)


2. mod_security 모듈

※ 참고 사이트 : https://modsecurity.org/

이 모듈을 Apache HTTP Server 엔진 하위의 모듈에 복사해다 넣고 몇가지 설정만 해주면!

Server 헤더에서 영영 Apache 조차도 지워버릴 수가 있다고 합니다. ㅎㅎ

그래서 테스트를 진행해 보았습니다. 미리 소스 설치해 두었던 Apache HTTP Server 2.4 인스턴스에 적용해보겠습니다. :) 

 기존 환경(httpd -V 로 확인) : Apache HTTP Server 2.4.39 / Server loaded:  APR 1.6.5, APR-UTIL 1.6.1
 2-1. 일단 사이트에서 확인한 가이드대로 모듈 설치를 진행해 봅니다.

 1) 제 테스트 서버는 CentOS에요. 모듈은 yum으로 설치했습니다. 그런데, 무언가 디펜던시들이 많이 설치가 되네요. apr 이랑 apr-util 버전도 제가 Apache 설치 시 함께 컴파일 설치했던 모듈의 버전과 상이해보입니다. 일단 진행!

# yum install mod_security

=================================================================
Package         Arch     Version                Repository   Size
=================================================================

Installing:
mod_security    x86_64   2.9.2-1.el7            base        249 k

Installing for dependencies:
apr             x86_64   1.4.8-3.el7_4.1        base        103 k
apr-util        x86_64   1.5.2-6.el7            base         92 k
httpd           x86_64   2.4.6-89.el7.centos    updates     2.7 M
httpd-tools     x86_64   2.4.6-89.el7.centos    updates      90 k
mailcap         noarch   2.1.41-2.el7           base         31 k

생성된  mod_security2.so 모듈을 기존에 설치해 두었던 Apache엔진의 modules 디렉토리 하위에 복사해 둡니다.

 

 2) 그리고 httpd.conf 파일에 아래의 설정을 추가해 주었어요.

LoadModule security2_module modules/mod_security2.so

<IfModule security2_module>
    SecRuleEngine on
    ServerTokens Prod
    ServerSignature Off
    SecServerSignature "WhoamI?"
</IfModule>

 3) Syntax 체크 해봅니다. bin/apachectl -t 명령어로요. 그런데... 아래와 같은 에러가 발생하네요. 역시 apr과 연관이 있는 것이었네요! yum 설치한 모듈은 이제 쓸모가 없어져 버렸습니다..ㅠ_ㅠ

httpd: Syntax error on line 154 of /engn001/apache2.4/conf/httpd.conf: Cannot load modules/mod_security2.so into server: /engn001/apache2.4/modules/mod_security2.so: undefined symbol: apr_crypto_block_cleanup
 2-2. 소스를 다운받아 모듈을 컴파일 해보았습니다. 

 

 1) 서버에서 아래 주소로부터 mod_security 소스 파일을 내려받습니다.

 

wget https://www.modsecurity.org/tarball/2.9.3/modsecurity-2.9.3.tar.gz

 

※ 이 소스를 컴파일 하려면 libxml2-devel 모듈이 필요해요! 컴파일 이전에 아래와 같이 설치를 진행합니다.

 

# yum install libxml2-devel
...

Installed:
  libxml2-devel.x86_64 0:2.9.1-6.el7_2.3

Dependency Installed:
  xz-devel.x86_64 0:5.2.2-1.el7

 

 2) 이제 mod_security2.so 파일을 만들어낼 차례입니다.

 

 내려받았던 modsecurity-2.9.3.tar.gz 파일을 풀고, 풀린 디렉토리 안으로 들어가면 configure 실행 파일이 보입니다. 제가 적용할 Apache 엔진과 관련된 apr, apxs, pcre 등의 경로들을 지정해주어 컴파일합니다.

 

# ./configure  --with-apr=/engn001/apache2.4/apr  --with-apxs=/engn001/apache2.4/bin/apxs --with-pcre=/engn001/apache2.4/pcre

 ... 명령 결과들은 생략합니당..ㅎㅎ

# make
# make install 

 

 인스톨 로그에 보니 아래와 같이 설치된 경로가 보입니다. 오호 so 파일이 생성되었네요!!

 

Libraries have been installed in:
   /usr/local/modsecurity/lib

# ls -atlr /usr/local/modsecurity/lib
total 2364
drwxr-xr-x 4 root root      28 Jul 16 15:42 ..
-rwxr-xr-x 1 root root 2417424 Jul 16 15:42 mod_security2.so
drwxr-xr-x 2 root root      30 Jul 16 15:42 .

 

 3) 이 모듈을 다시 Apache 엔진 하위의 modules 디렉토리에 복사하고 httpd.conf 에 설정했던 내용을 다시 한번 확인합니다. 그리고 다시 Syntax 체크!

 

# ./apachectl  -t
Syntax OK

 

 4) Apache 를 재시작 하고 확인해보았는데, 여전히 Server 헤더에 "Apache" 문자열이 나타납니다. ㅠ_ㅠ 뭐가 문제일까요? 

 

 5) httpd.conf 에 설정했던 내용 다시 한번 확인해보겠습니다. "ServerTokens Prod" 를 "ServerTokens Full" 로 수정, 재시작하여 다시 테스트 해봤습니다. :)

 

LoadModule security2_module modules/mod_security2.so

<IfModule security2_module>
    SecRuleEngine on
    ServerTokens Full
    ServerSignature Off
    SecServerSignature "WhoamI?"
</IfModule>

 

 6) 드디어!!! 제가 원하던대로 Server 에 "WhoamI?" 로 출력됐습니다!

 

HTTP/1.1 200 OK
Date: Thu, 18 Jul 2019 06:15:37 GMT
Server: WhoamI?
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>

 

 

3. 결론

 mod_security모듈 이용하여 Server Header 정보 노출을 제한하고자 할때!

 1) 적용 대상 WEB(Apache HTTP Server)이 컴파일 설치된 경우, 컴파일 시 사용된 apr 라이브러리의 버전과 (혹시 모르니)설치 경로를 꼭 확인해주세요~

 2) mod_security 모듈도 컴파일 설치하는 거로 해요~ apr 버전을 타더라구요~~

 3) 모듈 설정 시 ServerTokens Full 로 설정해줘야 지정해준 문자열이 출력된답니다!

 

Apache를 yum 설치하셨다면 mod_security모듈도 yum 설치로 가능할 것 같죠? 그건 다음 기회에~~~