ApacheのServerヘッダが出ないようにする

Apacheのレスポンスヘッダで出てくるServerヘッダを隠すにはどうしたら良い?

と聞かれた際のメモ。

環境

OS : CentOS 7.5

Apache2.4.34

デフォルトのレスポンス

curlコマンドでレスポンスを見てみると以下のようになります。

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:27:07 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

Serverヘッダがみえてバージョン情報やOSの情報が見えてるのをセキュリティ的に非表示にしたいですようね。

バージョン情報とOSの情報を隠す

httpd.conf のファイルの中身をいじって非表示にしていきます。

# 設定ファイルの場所
$ sudo vi /etc/httpd/conf/httpd.conf

#書き込む内容
ServerSignature Off
ServerTokens ProductOnly

# 再起動
$ systemctl restart httpd

内容を書き込んでcurlコマンドでレスポンスをかくにんすると以下のようになります.

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:28:28 GMT
Server: Apache
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

バージョン情報とOSの情報が隠れていることが確認できました。

セキュリティ的にはここまで隠せていれば十分だと思います。

Serverヘッダを隠す

本記事の本題になります。Apacheのバージョンが2.2より前のものであれば、mod_headersをインストールして(デフォルトで入っていることが多い)設定ファイルに以下のように書き込めば隠せていたようです。

Header unset Server

Apache のバージョンが 2.2 ~ 2.4 のものに関しては上記設定で Server ヘッダが隠せなくなってしまっているので、Apache WAF である mod_security を使用することで隠すことができるようになります。

mod_security のインストール

以下のコマンドでインストールを行います。

yum -y install mod_security mod_security_crs

設定ファイルの書き込み

Server ヘッダの内容を隠すにあたってhttpd.confとmod_security.confの内容を変更していきます。

# httpd.confの中身を編集
$ sudo vi /etc/httpd/conf/httpd.conf

# 以下をコメントアウト
# ServerSignature Off
# ServerTokens ProductOnly

# 以下を書き込む
ServerTokens Full

# mod_security.confの中身を編集
$ sudo vi /etc/httpd/conf.d/mod_security.conf

# 以下をコメントアウト
# SecRuleEngine On

# 以下を書き込む
SecServerSignature " "

# 再起動
$ systemctl restart httpd

mod_securtyを使用してServerヘッダを隠す際にはServerTokenの設定をFullにしないと設定が有効にならないみたいです。

ここまで設定をしたらcurlコマンドでレスポンスを見てみましょう。

$ curl -I -s localhost
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2019 09:30:59 GMT
Server:  
Last-Modified: Wed, 19 Jun 2019 06:00:40 GMT
ETag: "41-58ba6f2f16016"
Accept-Ranges: bytes
Content-Length: 65
Content-Type: text/html; charset=UTF-8

無事に内容が隠れていることが確認できると思います。

余談ですが、ServerSignature の中身に違うサーバの名前等を書くとサーバの詐称もできます。