Node.js Expressでサーバ情報を隠蔽するには?
はじめに
こんにちは、SHIFT の開発部門に所属しているKatayamaです。
Node.js の Express でサーバを構築している場合、何もしないと以下のようにサーバの情報がブラウザから確認できてしまいます。
この状態だと、悪意のあるユーザに Express の脆弱性を調べられ、その脆弱性を利用した何らかの攻撃を受けるリスクがあるのでよろしくないです。
今回は最低限、Express であるという事が分かるサーバ情報を隠蔽する方法についてみていきたいと思います。
※他にもセキュリティとして対応すべき事はあると思いますが、今回は最低限どんな言語やフレームワークでサーバが実装されているのか?という情報を隠蔽する方法についてみていきます。
Express のサーバ情報を隠蔽する
結論:どうすればいいか?
以下のように、"app.disable('x-powered-by');"を追記する。
// ./arc/app.js
// ※ES Modulesを利用しているが、ES Modulesを利用しない場合は、"const express = require('express');"のように実装すればいい
import express from "express";
// 省略
const app = express();
// 省略
app.disable("x-powered-by");
// 省略
app.listen(port, () => {
console.log(`Application listening at ${port}`);
});
※ES Modules を利用した実装のための設定については、Node.js で import・export(ES6 の構文)を使えるように webpack × Babel の設定をやってみたを参照。
隠蔽するとどうなるか?
上記のように"app.disable('x-powered-by');"を追記すると、ブラウザから確認しても、以下のように Express で構築されたサーバであるという情報は隠蔽できている事が分かる。
※app.disable()は、Express のApplication Settingsにあるプロパティの内、Boolean で設定される項目の値を false にする(off にする)ことができる関数。今回はApplication Settingsの"x-powered-by"を false にして、サーバ情報の隠蔽をしている。
※公式に、
Calling app.set('foo', false) for a Boolean property is the same as calling app.disable('foo').
と書かれているように、app.set()で明示的にプロパティの値を設定する実装でも同じ事ができる。
まとめとして
今回は Express を使っている時にブラウザに送られてしまうサーバ情報"x-powered-by"を隠蔽する方法を見てきた。実際のプロダクトではさらに色々考えて設定をしていく必要がありそうなので、それについては今後理解を深めていきたい。
※Express であればhelmetというライブラリが利用でき、これでも今回設定したように"x-powered-by"を隠蔽することができる他、さらに追加で色々設定できる。
おまけ
app.disable()で設定できるその他のオプションとは
Expressで設定できるアプリケーション設定のオプションの内容の全量としては、Application Settingsに書かれており、この一覧の中で "Type" が Boolean となっているものは、"app.disable()"で設定可能なものになる。
《この公式ブロガーの記事一覧》
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/