常駐サービスの待ち受けをループバックに閉じ、実機で守るテストを足した
今回やったこと / この記事について
常駐しているSearXNGとダッシュボードの待ち受けを、必要な機体だけが明示的に外へ開ける構成へ変更した。対象はSearXNGの8080番ポートとダッシュボードの8765番ポートである。設定値を一律に127.0.0.1へ倒すのではなく、既定はループバックに閉じ、別ホストからの接続が必要な機体だけ環境変数で上書きする。その判断を回帰テストで残した。
全インターフェース待ち受けの危険
変更前はSearXNGのCompose設定が8080:8080で、ダッシュボードも0.0.0.0を直接指定していた。OCI上の機体にはグローバルIPがあり、ネットワーク側のアクセス制御が一枚の防御になっていた。設定を一行触っただけで、その二つのサービスが意図せず公開される余地がある。
まずSearXNGについて、消費側のresearch.py、keyword_research.py、searxng_lifecycle.pyを確認した。いずれも既定の接続先はlocalhostで、別ホストから叩く必要はなかった。そこでComposeのpublishを次の形へ変更した。
ports:
- "${SEARXNG_BIND:-127.0.0.1}:8080:8080"
通常起動ではホストのループバックだけに公開される。別ホスト接続が必要な構成ではSEARXNG_BINDを明示するため、設定の意図が起動時に見える。既定値を閉じる側に置くことが、環境変数の設定漏れを公開面に変えないための要点である。
ダッシュボードは機体ごとに違う
ダッシュボードはもう少し注意が必要だった。OCI側のダッシュボードはcloudflaredが経路をM1へ転送しており、その機体の8765番ポートを外部向けに開く必要がない。一方でM1側は、TunnelのレプリカがTailscale経由で叩くため、0.0.0.0を必要とする。この差を無視して全機をlocalhostへすると、今度は正規の経路まで壊れる。
実装ではdashboard_server.pyにresolve_bind_host()を追加し、優先順位を次のようにした。
--host 引数 > NTM_DASHBOARD_HOST > 127.0.0.1
通常の手動起動はlocalhostに閉じる。M1のlaunchd設定だけはNTM_DASHBOARD_HOST=0.0.0.0を明示する。これにより、広く待ち受けるという例外が、コードの既定値ではなく機体固有の設定として現れる。また、bind解決のためにosを読み込んだことで、同じファイルに残っていた再起動処理のos未importによるNameErrorも解消された。
設定と到達要件を同時に検査する
設定ファイルだけを見る検査では、消費側の接続先を壊しても気づけない。scripts/test_service_bind_localhost.pyでは、SearXNGのCompose設定にループバック既定があること、素のワイルドカード公開が復活していないこと、消費側がlocalhostを使い続けることを確認する。ダッシュボード側では既定値、環境変数による明示的な開放、コマンドライン引数の優先順位、0.0.0.0の直書きが無いことを確認する。
| 対象 | 既定 | 外部接続が必要な場合 |
|---|---|---|
| SearXNG | 127.0.0.1:8080 | SEARXNG_BINDを明示 |
| ダッシュボード | 127.0.0.1:8765 | NTM_DASHBOARD_HOSTまたは--hostを明示 |
わざと設定を壊した場合に、SearXNGとダッシュボードの両方の検査が落ちることも確認済みである。対照群を入れたのは、テストが単に「localhostという文字列を含む」だけにならないようにするためだ。機体ごとの例外を許すなら、例外が無い時の安全な挙動と、例外を選んだ理由の両方をテストへ残す必要がある。
実装上の制約と結論
この変更はネットワーク機器やNSGの設定を置き換えるものではない。別ホスト接続を必要とする機体で環境変数を誤設定すれば、接続不能にもなり得る。また、サービスをlocalhostへ閉じても、同じ機体上の侵害を防ぐものではない。目的は「外から叩く必要のないサービスを、初期設定のまま外へ出さない」ことである。
やってみてわかったのは、bindアドレスを一つの正解として決めるより、到達要件を機体単位で確認する方が安全だということだ。既定値は狭く、必要な開放は名前付きの設定にし、設定・変換器・実際のサーバー起動を横断するテストで守る。VPNやTunnelの内側で使うサービスほど、この順序が効く。
試した環境・参照
- Docker ComposeのSearXNGとPython製ダッシュボード
- 8080/8765のbind修正
docker/searxng/docker-compose.ymlscripts/matome/dashboard_server.pyscripts/test_service_bind_localhost.py
更新履歴
- 2026-09-17: 初稿。機体ごとのbind要件と回帰テストを整理。
訂正履歴
なし。