テックブログ

ミドルウェアのバージョンを秘匿する

はじめに

こんにちは、kkです。
今回は代表的なミドルウェアのバージョンを秘匿する方法についてご紹介します。

第三者にサーバ内のミドルウェアのバージョンを知られてしまうと、
脆弱性をついた攻撃を実施される機会が高まります。


サーバ管理者であれば各バージョンをサーバ内から確認する方法はいくらでもある為、
あえて外部からバージョンを確認できるようにしなくてもいいと思います。

それでは早速、Apacheのバージョン秘匿から実施していきましょう。

Apache

Apacheはデフォルト設定の場合はcurlコマンドを実施した際などに、
レスポンスヘッダにてバージョンを確認することができてしまいます。

# curl -I http://127.0.0.1
HTTP/1.1 200 OK
Date: Sun, 03 Sep 2023 17:52:59 GMT
Server: Apache/2.4.37 (AlmaLinux) OpenSSL/1.1.1k
Last-Modified: Sun, 03 Sep 2023 17:11:04 GMT
ETag: “1b-604777a8f49a2”
Accept-Ranges: bytes
Content-Length: 27
Content-Type: text/html; charset=UTF-8

これでは第三者にこのApacheのバージョンが”2.4.37″であることがわかってしまいます。
バージョンを秘匿する設定は下記の通りです。

# vi /etc/httpd/conf/httpd.conf
最下行に下記を追記
ServerTokens Prod

# systemctl reload httpd

“ServerTokens”はレスポンスヘッダ内に各種情報を含めるかどうかを設定します。
“Prod”は”ProductOnly”の略でバージョンは秘匿する設定となります。

それではこの設定で改めてcurlコマンドを実施します。

# curl -I http://127.0.0.1
HTTP/1.1 200 OK
Date: Sun, 03 Sep 2023 18:10:04 GMT
Server: Apache
Last-Modified: Sun, 03 Sep 2023 17:11:04 GMT
ETag: “1b-604777a8f49a2”
Accept-Ranges: bytes
Content-Length: 27
Content-Type: text/html; charset=UTF-8

Apacheのバージョンが秘匿されたことを確認できました。

※レスポンスヘッダへの表示とは関係ありませんが、”ServerSignature”が明示的に”ON”になっている
 場合には、”OFF”にする必要があります。
 ”ServerSignature”の設定が”ON”の場合、Webページにて404エラーを確認した場合などにも
 Apacheのバージョンが表示されてしまいます。
 デフォルトは”OFF”ですので明示的に記載がない場合は、設定の必要はありません。

続いてはNginxについて見ていきましょう。

Nginx

Nginxの場合もデフォルトでは、レスポンスヘッダにてバージョンを確認できてしまいます。

# curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Sun, 03 Sep 2023 18:38:59 GMT
Content-Type: text/html
Content-Length: 3854
Last-Modified: Mon, 19 Apr 2021 10:05:11 GMT
Connection: keep-alive
ETag: “607d55d7-f0e”
Accept-Ranges: bytes

それではこちらもバージョンを秘匿する設定を実施します。

# vi /etc/nginx/nginx.conf
httpモジュール内に下記を追記
server_tokens off;

# systemctl reload nginx

“server_tokens”はレスポンスヘッダ内にて、Nginxのバージョン出力の有無を設定できます。
それでは再度確認してみましょう

# curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 03 Sep 2023 18:43:45 GMT
Content-Type: text/html
Content-Length: 3854
Last-Modified: Mon, 19 Apr 2021 10:05:11 GMT
Connection: keep-alive
ETag: “607d55d7-f0e”
Accept-Ranges: bytes

無事、バージョンを秘匿することができました。
それは続いてPHPについてみていきましょう。

PHP

PHPの場合もデフォルトでは”X-Powered-Byヘッダ”にて、
バージョンを確認することができてしまいます。

# curl -I http://127.0.0.1/phpinfo.php
HTTP/1.1 200 OK
Date: Sun, 03 Sep 2023 19:15:56 GMT
Server: Apache
X-Powered-By: PHP/7.2.24
Content-Type: text/html; charset=UTF-8

こちらも望ましくない為、秘匿設定を実施していきます。

# vi /etc/php.ini
下記の通り設定
変更前 : expose_php = On
変更後 : expose_php = Off

# systemctl reload php-fpm
※環境によって適宜変更してください

“expose_php”とはサーバにPHPがインストールされているかどうかを表示します。
その為この設定をOffにすると”X-Powered-Byヘッダ”の出力がなくなり、
バージョンを確認することもできなくなります。

それでは再度確認しておきましょう。

# curl -I http://127.0.0.1/phpinfo.php
HTTP/1.1 200 OK
Date: Sun, 03 Sep 2023 19:20:58 GMT
Server: Apache
Content-Type: text/html; charset=UTF-8

問題なさそうですね。
それでは最後にPostfixについてみていきましょう。

Postfix

Postfixはデフォルトの状態の場合、バージョンがわかるわけではありませんが
MTAを確認することができてしまいます。

# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 netassist.localdomain ESMTP Postfix

設定によってはバージョンを確認することも可能になってしまいます。

下記設定が有効の場合
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 netassist.localdomain ESMTP Postfix (3.5.8)

これでは特定のMTAやバージョンの脆弱性をつかれる可能性がある為、
秘匿設定を実施する必要があります。

# vi /etc/postfix/main.cf
下記を最下行に追記
smtpd_banner = $myhostname ESMTP unknown

# systemctl reload postfix

上記設定を実施することで、もともとMTAやバージョン情報が記載されていた箇所が、
“unknown”と表示されることになります。

それでは確認していきましょう。

[root@netassist ~]# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 netassist.localdomain ESMTP unknown

MTAやバージョン情報が秘匿されていますね。

余談ですがPostfixの設定関連で、VRFYコマンドの無効化についてもご紹介します。
VRFYコマンドとは特定のアカウントのメールボックスが存在するかどうかを確認できるコマンドです。
実際に使ってみます。

[root@netassist ~]# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 netassist.localdomain ESMTP unknown
VRFY netassist
252 2.0.0 netassist
VRFY hogehoge
550 5.1.1 : Recipient address rejected: User unknown in local recipient table

“netassist”ユーザは存在するユーザで、”hogehoge”ユーザは存在しないユーザです。

“netassist”ユーザを引数にVRFYコマンドを実施した場合はステータスコード「252」を返しており、
“hogehoge”ユーザを引数にVRFYコマンドを実施した場合はステータスコード「550」となっています。

この通りVRFYコマンドが有効化されている場合、特定のユーザの存在を確認できてしまいます。

こちらはセキュリティ的にも好ましくないない為、下記の通り無効化する設定をお勧めします。

# vi /etc/postfix/main.cf
下記を最下行に追記
disable_vrfy_command = yes

# systemctl reload postfix

それでは再度VRFYコマンドを試してみます。

# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 netassist.localdomain ESMTP unknown
VRFY netassist
502 5.5.1 VRFY command is disabled
VRFY hogehoge
502 5.5.1 VRFY command is disabled

存在の有無にかかわらず同一の出力になりました。
VRFYコマンドは無効化されたと言っているので問題なさそうです。

最後に

いかがだったでしょうか。
各種ミドルウェアの設定をする際は、気を付けるべきことが多々あると思いますが
バージョンの表示については本記事を参考に設定いただけると幸いです。

今回ご紹介できなかったミドルウェアについてもまたいつかご紹介できればと思います。

それではまた。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください