웹서버보안 : hide apache webserver information & mod_security
curl, nc, httprint 등으로 서버의 정보를 수집하는 방법은 다양하다. 도메인이나 ip주소를 입력하면 해당 서버의 OS, 웹서버, 네임서버 등의 정보를 정리하여 보여주는 사이트들도 많다. curl을 이용해서 테스트 서버의 정보를 보면서 웹서버의 정보를 숨기는 작업에 대해서 정리하고자 한다.
[root@webpress /]# curl -i 1.234.56.789
HTTP/1.1 200 OK
Date: Wed, 21 Apr 2021 05:00:24 GMT
Server: Apache/2.4.6 (CentOS) PHP/7.4.16
Last-Modified: Thu, 25 Mar 2021 04:58:54 GMT
ETag: "0-5be5545af6651"
Accept-Ranges: bytes
Content-Length: 0
Content-Type: text/html; charset=UTF-8
[root@webpress /]#
위의 예에서 사용한 ip주소는 존재할 수 없는 주소이지만 그 아래의 결과는 실제 서버의 헤더정보이다.
Server OS : CentOS / 웹서버 : Apache 2.4.6 / PHP : 7.4.16 이라는 것을 쉽게 알 수 있다.
아래 두 줄을 httpd의 설정 파일인 httpd.conf 에 추가해보자. 위치는 어디든 상관없다.
ServerTokens Prod
ServerSignature Off
이제 웹서버를 재시동 한 후에 다시 확인해보면 아래와 같이 나온다.
[root@webpress /]# curl -i 1.234.56.789
HTTP/1.1 200 OK
Date: Wed, 21 Apr 2021 05:22:25 GMT
Server: Apache
Last-Modified: Thu, 25 Mar 2021 04:58:54 GMT
ETag: "0-5be5545af6651"
Accept-Ranges: bytes
Content-Length: 0
Content-Type: text/html; charset=UTF-8
[root@webpress /]#
ServerTokens는 서버가 클라이언트에 응답하는 헤더의 필드에 포함되는 모듈에 대한 정보를 제어한다. 이 구문을 생략하면 (apache 2.4.x에는 생략되어 있다) Full 옵션을 준것과 동일한데 이는 모든 정보(?)를 다 제공한다. 가장 제한적인 옵션이 Prod이며 웹서버의 종류(이름)만 전송한다. 이 외에 Major, Minor, Min, OS 등의 옵션이 있는데 자세한 것은 아파치 문서를 참고하자.
ServerSignature는 웹사이트의 오류페이지나 ftp의 디렉토리 목록 등에서 페이지의 하단에 출력되는 글을 설정하는데에 사용된다. 기본값이 off이기 때문에 생략해도 무방하다. 이 구문에 의해서 출력되는 서버의 버전정보 등은 ServerTokens에 의해서 제어된다.
이렇게 설정했을 때에 두 가지 아쉬움이 남는다.
1. 웹서버의 종류(? 이름 ? - Apache)은 숨길 수 없다는 것과
2. curl의 옵션으로 서버의 ip주소가 아닌 서버에서 운영중인 웹사이트의 url을 입력한다면 php의 버전이 그대로 노출된다는 것이다. 아래와 같다. (실제 서버의 정보이며 URL만 수정했다.)
[root@webpress /]# curl -I pius.mydomain.domain
HTTP/1.1 200 OK
Date: Wed, 21 Apr 2021 06:21:50 GMT
Server: Apache
X-Powered-By: PHP/7.4.16
Link: <http://pius.mydomain.domain/wp-json/>; rel="https://api.w.org/"
Link: <http://pius.mydomain.domain/>; rel=shortlink
Content-Type: text/html; charset=UTF-8
[root@webpress /]#
물론 php의 버전 노출은 php.ini의 expose_php 값을 off로 변경하면 해결된다. -_-;
expose_php = off
웹서버의 이름(여기서는 apache)조차 노출시키지 않으려면 mod_security를 설치하는 방법이 유일한 듯 하다. (apache를 컴파일하여 설치하면서 소스 프로그램에서 이름을 변경하는 것으로 가능할지 모른다는 생각이지만.. 너무 멀리까지 가는 느낌이다-_-;)
그렇다면
mod_security를 설치하자.
설치방법은 간단하다.
- # yum install mod_security
[root@localhost /]# yum install mod_security
Loaded plugins: fastestmirror
Determining fastest mirrors
epel/x86_64/metalink | 3.8 kB 00:00:00
* base: mirror.kakao.com
* epel: ftp.iij.ad.jp
* extras: mirror.kakao.com
* remi-php74: ftp.riken.jp
* remi-safe: ftp.riken.jp
* updates: mirror.kakao.com
base | 3.6 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
mariadb | 2.9 kB 00:00:00
remi-php74 | 3.0 kB 00:00:00
remi-safe | 3.0 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/6): epel/x86_64/updateinfo | 1.0 MB 00:00:00
(2/6): epel/x86_64/primary_db | 6.9 MB 00:00:00
(3/6): remi-php74/primary_db | 235 kB 00:00:00
(4/6): extras/7/x86_64/primary_db | 232 kB 00:00:00
(5/6): updates/7/x86_64/primary_db | 7.1 MB 00:00:01
(6/6): remi-safe/primary_db | 1.9 MB 00:00:01
Resolving Dependencies
--> Running transaction check
---> Package mod_security.x86_64 0:2.9.2-1.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================
Package Arch Version Repository Size
======================================================================================================
Installing:
mod_security x86_64 2.9.2-1.el7 base 249 k
Transaction Summary
======================================================================================================
Install 1 Package
Total download size: 249 k
Installed size: 980 k
Is this ok [y/d/N]: y
Downloading packages:
mod_security-2.9.2-1.el7.x86_64.rpm | 249 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : mod_security-2.9.2-1.el7.x86_64 1/1
Verifying : mod_security-2.9.2-1.el7.x86_64 1/1
Installed:
mod_security.x86_64 0:2.9.2-1.el7
Complete!
[root@localhost /]#
설치가 끝났다!
mod_security의 모듈 mod_security2.so는 /usr/lib64/httpd/modules 에 위치하며, /etc/httpd/conf.modules.d 의 10-mod_security.conf에 의해서 로드된다.
이제 httpd.conf을 열어서 다음의 5줄을 추가하자. 위치는 어디라도 상관없지만 가장 마지막 줄에 넣는 것도....^^
<IfModule security2_module>
SecRuleEngine on
ServerTokens Full
SecServerSignature "Lovely Hare"
</IfModule>
이제 아파치 웹서버를 재시동하고 다시 한 번 테스트 해 보자.
[root@webpress conf]# curl -I 1.234.56.789
HTTP/1.1 200 OK
Date: Wed, 21 Apr 2021 07:42:11 GMT
Server: Lovely Hare
Last-Modified: Thu, 25 Mar 2021 04:58:54 GMT
ETag: "0-5be5545af6651"
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
[root@webpress conf]#
웹서버의 정보가 SecServerSignature에서 정의한 내용으로 전송됨을 알 수 있다. 서버의 정보(이름)를 공백으로 하고 싶다면 "와 " 사이에 공백을 하나 넣자 -_-;
mod_security는 단순히 웹서버의 이름을 감추거나 변경해주는 유틸리티가 아니라 다양한 규칙을 설정하여 필터링 하고, 실시간으로 모니터링 할 수 있는 웹 방화벽이다. 자세한 설정은 구글에 물어보자! (한국 인터넷진흥원에서도 정보를 얻을 수 있다.)
Mod Security 관련글
2021.12.24 - [Linux/Web Server] - 413 Request Entity Too Large [modsecurity & apache]
2021.12.10 - [Linux/TIP] - 악성bot 차단하기 (feat. mj12bot.com/majestic12)
2021.08.22 - [Linux/Web Server] - 업로드 파일의 용량 제한 변경하기(feat. ModSecurity)
2021.04.21 - [Linux/Web Server] - 웹 서버의 정보 숨기기 (apache)
'Linux > Web Server' 카테고리의 다른 글
ModSecurity: Access denied with code 44 (phase 2). Match of "eq 0" against "MULTIPART_UNMATCHED_BOUNDARY" (0) | 2021.06.25 |
---|---|
apache - HTTP 30x [URL Redirection] (0) | 2021.06.07 |
[CentOS8] httpd[proxy_fcgi:error] [pid 31nn:tid 14nn] ~ AH01071: Got error 'Primary script unknown' (0) | 2020.12.13 |
apache[httpd] 웹서버의 기본포트[80] 변경하기 (0) | 2020.07.27 |
apache - HTTP 403 / 404 ERROR 설정 (0) | 2020.05.29 |
댓글