• 診断項目 No.24/127
  • 公開ファイル・情報露出
  • 重大度 低(low)

サーバーバージョンを露出していない状態とは?Serverヘッダー・X-Powered-Byの隠し方と診断基準

サーバーバージョンを露出していないかは、ServerやX-Powered-Byヘッダーにバージョン番号があるかで確認します。リスク、診断基準、Apache(ServerTokens)・nginx・IIS・PHP・Next.jsでの隠し方を解説します。

結論(サーバーバージョンを露出していない)

サーバーバージョンを露出していない状態とは、応答ヘッダーに詳細なバージョン番号が含まれていないことです。対象はServer、X-Powered-By、X-AspNet-Version、X-AspNetMvc-Versionで、Apache/2.4.6 や PHP/7.4.33 のような番号が該当します。製品名だけ(Server: nginx など)は許容されます。バージョンが分かると、攻撃者はそのバージョンの既知の脆弱性を素早く絞り込めます。ただし本質的な対策はバージョンアップとパッチ適用で、隠すことは補助的な対策です。

この記事のポイント

  • 確認対象は Server・X-Powered-By・X-AspNet-Version・X-AspNetMvc-Version の4ヘッダーです。
  • ASVS V13.4.6が求めるのは詳細なバージョン情報を出さないことで、製品名だけなら問題にしません。
  • Apacheは httpd.conf で ServerTokens Prod、nginxは server_tokens off、PHPは php.ini の expose_php = Off で隠せます。
  • 隠しても脆弱性は残ります。最優先はサポート中のバージョンへの更新とパッチ適用です。
  • セキュリティAIチェッカーはバージョン番号がなければ○、あれば△(重み1)と判定します。
診断項目名サーバーバージョンを露出していない
項目IDheaders.server
分類公開ファイル・情報露出
重大度・配点の重み低(low) 重み 1
関連する標準・ガイドラインOWASP ASVS 5.0.0 V13.4.6(バックエンド構成要素の詳細なバージョン情報を公開しない。Level 3)、OWASP WSTG-INFO-02(Fingerprint Web Server)、OWASP Secure Headers Project(削除推奨ヘッダー一覧 headers_remove.json)、CWE-497(Exposure of Sensitive System Information to an Unauthorized Control Sphere。OWASP ZAP アラート 10036・10037 の分類)

サーバーバージョンを露出していない状態とは

サーバーバージョンを露出していない状態とは、Web サーバーやアプリケーション基盤の応答ヘッダー(Server、X-Powered-By、X-AspNet-Version、X-AspNetMvc-Version)に、製品の詳細なバージョン番号が含まれていないことです。

Web サーバーやアプリケーション基盤は、既定の設定で次のように製品名と詳細なバージョン番号を応答ヘッダーで送ることがあります。

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.33
X-Powered-By: PHP/7.4.33

この項目は、トップページの応答ヘッダーにバージョン番号が含まれていないかを確認します。製品名だけ(Server: nginx など)は許容します。バージョン番号が分かると、攻撃者はそのバージョンに存在する既知の脆弱性を素早く絞り込めます。自治体サイトでは、保守契約の切れ目や移行の遅れで古いバージョンのサーバーが動き続けることがあり、外部からそれが一目で分かる状態は避けるべきです。

なお、HTML 内の <meta name="generator"> などによる CMS のバージョン表示は「生成ツール情報を露出していない」、下層ページやエラー応答での露出は「下層・エラー応答のバージョン/デバッグ情報」の各項目で確認します。

バージョン情報はどこから出ているのか

ヘッダーごとの送信元

ヘッダー主な送信元例
ServerApache、nginx、IIS、LiteSpeed などApache/2.4.6 (CentOS)、nginx/1.18.0、Microsoft-IIS/10.0
X-Powered-ByPHP(expose_php)、ASP.NET、Express、Next.js などPHP/8.1.2、ASP.NET、Next.js
X-AspNet-VersionASP.NET(httpRuntime の設定)4.0.30319
X-AspNetMvc-VersionASP.NET MVC5.2

OWASP Secure Headers Project は、これらを含む多数のヘッダーを「削除を推奨するヘッダー」として一覧にしています。

Apache の ServerTokens の値

Apache の ServerTokens は既定値が Full で、Prod にすると Server: Apache だけになります。

ServerTokens の値Server ヘッダーの例
ProdApache
MajorApache/2
MinorApache/2.4
MinApache/2.4.2

この設定はサーバー全体(server config)でのみ有効で、.htaccess やバーチャルホスト単位では変更できません。

Apache の公式ドキュメントは、Server ヘッダーを隠しても「サーバーがより安全になるわけではない」「隠すことによるセキュリティは神話で、誤った安心感につながる」と注意しています。

サーバーバージョンの露出についてよくある誤解

  • 「バージョンを隠せば安全」:隠すことは攻撃者の調査を少し遅らせるだけで、脆弱性そのものは残ります。最も重要なのは、バージョンアップとパッチ適用です。この項目の重大度が low なのはこのためです。
  • 「製品名も消さなければならない」:ASVS V13.4.6 が求めているのは「詳細なバージョン情報」を出さないことです。製品名だけなら、通信の特徴などから推測できる情報でもあり、この診断では問題にしません。
  • 「Server ヘッダーは .htaccess の Header unset Server で消せる」:Apache 本体が付ける Server ヘッダーは、通常 mod_headers では削除できません。ServerTokens で制御します。
  • 「nginx の server_tokens off で Server ヘッダーが消える」:nginx のドキュメントによれば off はバージョン表示をやめるだけで、Server: nginx は残ります。

サーバーバージョンを露出していないの診断基準(セキュリティAIチェッカー)

取得方法

  • 入力URLへ GET を1回送り、リダイレクト(最大4回)後の最終応答のヘッダーから Server、X-Powered-By、X-AspNet-Version、X-AspNetMvc-Version を取得します。追加の通信は行いません。
  • 下層ページやエラー応答(404 など)の露出は、別項目の「下層・エラー応答のバージョン/デバッグ情報」で確認します。

判定条件

取得した4つのヘッダー値を連結し、数字.数字 形式(正規表現 \d+(?:\.\d+)+)のバージョン番号が含まれるかを調べます。

判定条件得点への影響
○ 問題なし(pass)4つのヘッダーのいずれにもバージョン番号がない(ヘッダー自体がない場合を含む)重み1を満点加算
△ 要確認(warn)いずれかのヘッダーにバージョン番号がある1×0.45=0.45点
× 要改善(fail)/対象外(na)この項目では使いません―
  • 根拠欄には、バージョンを検出した場合は該当ヘッダーの値を、検出しなかった場合は製品名のみのヘッダー値、またはヘッダーがない旨を表示します。
  • Apache/2 のように小数点を含まないメジャーバージョンだけの表記は、詳細なバージョン情報とはみなさず ○ とします。
  • × を使わないのは、バージョン表示そのものは脆弱性ではなく、攻撃の手掛かりを与える情報露出であるためです。

自治体サイトでの判定例

応答ヘッダー判定
Server: Apache○
Server: nginx○
Server: cloudflare / Server: AmazonS3○
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips△
Server: nginx/1.18.0△
Server: Microsoft-IIS/10.0△
Server: Apache と X-Powered-By: PHP/7.4.33△
X-AspNet-Version: 4.0.30319△

サーバーバージョンを露出しているとどんなリスクがあるか

攻撃シナリオ

  1. 既知脆弱性の絞り込み:攻撃者は大量のサイトのヘッダーを自動収集し、特定バージョン(サポートが終了した PHP、脆弱性が公表された Apache など)を使うサイトを一覧化します。新しい脆弱性が公表されたとき、該当するサイトが真っ先に狙われます。OWASP WSTG-INFO-02 は、サーバーの種類とバージョンを知ることで既知の脆弱性や攻撃手法を判断しやすくなると説明しています。
  2. サポート終了の露見:PHP/5.x や PHP/7.x など、サポートが終了したバージョンが表示されていると、パッチが当たっていない可能性が高いと判断され、攻撃対象として優先されます。
  3. 構成の推測:OS の種類((CentOS)、(Ubuntu))や OpenSSL のバージョンから、サーバーの更新状況や構成全体が推測されます。

想定される被害

バージョン表示そのものが直接の被害を生むわけではありませんが、既知の脆弱性を突いた改ざん・情報漏えい・不正侵入の準備を容易にします。自治体サイトの改ざんは住民への誤情報や信用失墜につながるため、更新管理と併せて対策することが重要です。

サーバーバージョンの隠し方(Apache・nginx・IIS・PHP・Next.js)

基本方針

  1. まず、表示されているバージョンがサポート中で最新のパッチが当たっているかを確認し、古ければ更新します。これが本質的な対策です。
  2. そのうえで、バージョン番号を応答ヘッダーから取り除きます。

Apache(httpd.conf、サーバー全体)

# httpd.conf / apache2.conf(.htaccess では指定できない)
ServerTokens Prod
ServerSignature Off
# .htaccess でも可能な X-Powered-By の削除
<IfModule mod_headers.c>
  Header unset X-Powered-By
  Header always unset X-Powered-By
</IfModule>

PHP が付ける X-Powered-By は、php.ini で expose_php = Off にするのが確実です(expose_php は php.ini でのみ設定でき、.user.ini や ini_set() では変更できません)。共有レンタルサーバーで ServerTokens を変更できない場合は、事業者のコントロールパネルや問い合わせで対応可否を確認します。

nginx

http {
    server_tokens off;   # Server: nginx(バージョンなし)になる
}

PHP-FPM と組み合わせる場合は、fastcgi_hide_header X-Powered-By; で PHP の X-Powered-By を隠せます(または php.ini の expose_php = Off)。

IIS(web.config)

<configuration>
  <system.web>
    <!-- X-AspNet-Version を出さない -->
    <httpRuntime enableVersionHeader="false" />
  </system.web>
  <system.webServer>
    <security>
      <!-- IIS 10.0(Windows Server, version 1709 以降)で Server ヘッダーを抑止 -->
      <requestFiltering removeServerHeader="true" />
    </security>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

X-AspNetMvc-Version は、アプリケーションの起動処理で MvcHandler.DisableMvcResponseHeader = true; を設定すると出力されなくなります。

Next.js(Vercel)

// next.config.js
module.exports = {
  poweredByHeader: false, // X-Powered-By: Next.js を出さない
};

Next.js の X-Powered-By: Next.js にはバージョン番号が含まれないため、この項目では ○ ですが、不要な情報は出さない方が望ましいです。

CMS

  • WordPress などの CMS は、HTML の <meta name="generator"> や読み込むファイルの ?ver= にバージョンを出すことがあります。これらは「生成ツール情報を露出していない」項目で確認します。

サイトを壊さないための注意点

  • ServerTokens は Apache 全体に効く設定で、.htaccess に書くとエラー(500)になる場合があります。必ず httpd.conf 側で設定してください。
  • バージョンを隠したことで、更新管理が後回しにならないようにします。脆弱性情報の確認と定期的な更新を、保守契約の中で明確にしておくことが重要です。

設定後の確認方法

curl -sI https://www.example.lg.jp/ | grep -i -E "^(server|x-powered-by|x-aspnet-version|x-aspnetmvc-version):"
# エラー応答も確認
curl -sI https://www.example.lg.jp/not-found-check | grep -i -E "^(server|x-powered-by):"

設定後はセキュリティAIチェッカーで再診断し、根拠欄が「バージョン番号なし」または識別ヘッダーなしの表示になっていることを確認します。

よくある質問(FAQ)

Serverヘッダーのバージョンを隠せば安全になりますか?

安全になるわけではありません。隠すことは攻撃者の調査を少し遅らせるだけで、脆弱性そのものは残ります。Apacheの公式ドキュメントも、隠すことによるセキュリティは誤った安心感につながると注意しています。最も重要なのはバージョンアップとパッチ適用です。

Server: Apache のように製品名が出ているのも問題ですか?

この診断では問題にしません。ASVS V13.4.6が求めているのは詳細なバージョン情報を出さないことで、製品名だけなら通信の特徴などからも推測できる情報だからです。Server: Apache や Server: nginx は○です。

.htaccessの Header unset Server でServerヘッダーを消せますか?

Apache本体が付けるServerヘッダーは、通常 mod_headers では削除できません。httpd.conf で ServerTokens Prod を設定して制御します。ServerTokens は .htaccess では指定できず、書くと500エラーになる場合があります。

nginxで server_tokens off にするとServerヘッダーは消えますか?

消えません。nginxのドキュメントによれば off はバージョン表示をやめるだけで、Server: nginx は残ります。この状態はセキュリティAIチェッカーでは○です。

X-Powered-By: PHP/… を消すにはどうすればよいですか?

php.ini で expose_php = Off にするのが確実です。expose_php は php.ini でのみ設定でき、.user.ini や ini_set() では変更できません。Apacheでは Header unset X-Powered-By、nginx+PHP-FPMでは fastcgi_hide_header X-Powered-By も使えます。

Server: Apache/2 のような表記はどう判定されますか?

小数点を含まないメジャーバージョンだけの表記は詳細なバージョン情報とはみなさず○です。セキュリティAIチェッカーは「数字.数字」形式のバージョン番号が含まれる場合に△とします。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料