본문 바로가기
Linux/Web Server

웹 서버의 정보 숨기기 (apache)

by aegypius 2021. 4. 21.
728x90
반응형

웹서버보안 : 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]

 

413 Request Entity Too Large [modsecurity & apache]

서버오류..... 서버에 파일을 업로드 할 때 발생했다면 대게는 업로드 할 수 있는 파일 용량의 한계를 넘겼기 때문이겠지만 워드프레스로 사이트를 제작하는 도중에 '저장하기'나 '업데이트'를

aegypius.tistory.com

 

2021.12.10 - [Linux/TIP] - 악성bot 차단하기 (feat. mj12bot.com/majestic12)

 

악성bot 차단하기 (feat. mj12bot.com/majestic12)

가끔 apache의 log를 보면 눈에 띄는 녀석이 있다. MJ12bot과 SemrushBot이다. 대충 웹 검색을 해보니 semrush는 robots.txt도 무시하고 접근한다고 하는데....robots.txt를 이용해서 사이트별로 특정 봇에 대한..

aegypius.tistory.com

 

2021.08.22 - [Linux/Web Server] - 업로드 파일의 용량 제한 변경하기(feat. ModSecurity)

 

업로드 파일의 용량 제한 변경하기(feat. ModSecurity)

워드프레스의 미디어 라이브러리에 파일을 업로드 하는데 계속 오류가 발생한다. 분명 php.ini에서 업로드 할 수 있는 최대 파일용량은 아래와 같이 8GB로 설정했는데.... ..... post_max_size = 8192M .....

aegypius.tistory.com

 

2021.06.25 - [Linux/Web Server] - ModSecurity: Access denied with code 44 (phase 2). Match of "eq 0" against "MULTIPART_UNMATCHED_BOUNDARY"

 

ModSecurity: Access denied with code 44 (phase 2). Match of "eq 0" against "MULTIPART_UNMATCHED_BOUNDARY"

워드프레스로 만든 웹사이트의 게시판에 사진을 업로드 하는 중에 발생했다. Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete you..

aegypius.tistory.com

 

2021.04.21 - [Linux/Web Server] - 웹 서버의 정보 숨기기 (apache)

 

웹 서버의 정보 숨기기 (apache)

웹서버보안 : hide apache webserver information & mod_security curl, nc, httprint 등으로 서버의 정보를 수집하는 방법은 다양하다. 도메인이나 ip주소를 입력하면 해당 서버의 OS, 웹서버, 네임서버 등의 정..

aegypius.tistory.com

 

728x90
반응형

댓글