背景:従来のSSLだけでは不十分な場合
少し前、ある難しい案件に対応しました。それは、絶対的な匿名性を必要とする組織向けの内部情報ポータルの構築でした。インフラプロバイダー(ISP)にさえ、サーバーの存在を知られてはならないという条件です。通常のHTTPSでは、ISPはユーザーがどのIPに接続しているかを把握できてしまいます。この問題を根本的に解決するために、私が信頼して選んだ唯一の選択肢がTor Onion Service(.onionウェブサイト)でした。
10以上のセキュリティシステムを監査した結果、脆弱性を特定するプロの手法を学ぶ重要性を痛感しました。最も一般的なミスは、不注意なNginxの設定によって実際のIPアドレスが漏洩してしまうことだと分かりました。.onionサイトを立ち上げるのは簡単ですが、「正体」を隠したまま運用するのは一つの技術です。この記事では、Linux上での標準的なセットアップ手法について解説します。
ステップ1:NginxとTorのインストール
まず、Webサーバー(Nginx)とトンネルを作成するためのTorサービスが必要です。パッケージの更新が安定しているUbuntuまたはDebianの使用をお勧めします。より高度な防御を求めるなら、Snort 3をインストールしてIDS/IPSを構築することも有効な手段です。
sudo apt update
sudo apt install nginx tor -y
インストール後、サービスのステータスを確認してください。この時点では、Torは通常のクライアントとして動作しているだけで、Hidden Serviceはまだ有効化されていません。
sudo systemctl status tor
ステップ2:Nginxの設定 – IP漏洩を阻止する
ここは多くのシステム管理者が陥る落とし穴です。デフォルトでは、Nginxは0.0.0.0(すべてのインターフェース)でリッスンします。そのままにしておくと、Shodanのようなツールを使う攻撃者にパブリックIP経由でサーバーを発見される可能性があります。そこからコンテンツを照合され、あなたがその.onionサイトの所有者であることを特定されてしまいます。
Nginxがlocalhost(127.0.0.1)のみでリッスンするように強制しましょう。
sudo nano /etc/nginx/sites-available/default
serverブロックを以下のように編集します:
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# CVEによる悪用を防ぐためにNginxのバージョンを非表示にする
server_tokens off;
}
通常のWebトラフィックと完全に分離するため、ポート8080を使用しています。変更を適用するためにNginxを再起動します:
sudo systemctl restart nginx
ステップ3:Tor Onion Serviceを有効化する
次に、Torネットワークからサーバーが見つかるように設定します。torrcファイルを編集する必要があります。
sudo nano /etc/tor/torrc
“Hidden Services”のセクションを探し、以下の2行を追加します:
HiddenServiceDir /var/lib/tor/my_onion_site/
HiddenServicePort 80 127.0.0.1:8080
重要な注意点:
HiddenServiceDir:秘密鍵が保存される場所です。このファイルを紛失すると、その.onionアドレスは二度と使えなくなります。HiddenServicePort:Torが匿名ネットワークのポート80 from トラフィックを受け取り、内部のポート8080に転送します。
Torを再起動して、システムに識別アドレスを自動生成させます:
sudo systemctl restart tor
ステップ4:.onionアドレスを取得する
Torは非常に厳格な権限を持つ専用ディレクトリを自動的に作成します。ドメイン名が含まれているファイルを読み取るには、root権限が必要です。
sudo cat /var/lib/tor/my_onion_site/hostname
結果として、vww6ybal4bd7szmgncyruucpgfkqahzddiqe.onionのような長い文字列が表示されます。これをTor Browserにコピーしてください。Nginxのページが表示されれば成功です。
ステップ5:ハードニング – 要塞の強化
オンラインにできることと、スキャン攻撃に耐えられることは別問題です。万が一の侵入に備えて、インシデントレスポンスの手順を確立しておくことは不可欠です。多くのサーバーが、不要なHTTPヘッダーを通じて「正体」を露呈させています。
ヘッダーの痕跡を完全に削除する
Nginxは通常、X-Powered-Byやバックエンドの情報を送信します。以下のディレクティブを使用してこれらを削除しましょう:
# Nginxのserverブロックに追加
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
proxy_hide_header X-Powered-By;
匿名ログの設定
ユーザーを保護するために、アクセスログを保存しないのが最善ですが、運用上ログが必要な場合は、Grafana Lokiで機密情報を自動マスキングする技術を導入しましょう。
access_log off;
error_log /var/log/nginx/error.log crit;
Nyxによる監視
サーバーがどの程度の帯域幅を使用しているか、接続されているサーキットがいくつあるか知りたい場合は、nyxを使用します。
sudo apt install nyx
sudo -u debian-tor nyx
生存原則(OPSEC)
技術的に正しい設定は、要件の50%に過ぎません。残りの50%は運用の考え方にあります:
- サービスの隔離: 同じサーバー上で外部接続を持つメールサーバーやデータベースを絶対に動かさないでください。他のサービスにある小さな隙から、実際のIPが即座に漏洩する可能性があります。
- メタデータは敵: Webにアップロードする画像には、GPS座標やデバイス情報(EXIF)が含まれていることが多いです。公開前に必ずメタデータ削除ツールを使用してください。
- 静的コンテンツを優先: JavaScriptは諸刃の剣です。ユーザーのブラウザを操作して意図しないクエリを実行させ、実体のアドレスを特定するために悪用される可能性があります。
Tor Onion Serviceの構築は、単にセンシティブな目的のためだけのものではありません。プライバシーを守るための強力なツールです。Linux環境での機密データ保護を極めるなら、GnuPGによる暗号化も理解しておくべき重要なトピックです。このガイドが、安全でセキュアなデジタル空間を構築する助けになることを願っています。

