注意: この記事はLLMによって英語から翻訳されたものです。正確性については保証いたしかねますので、あらかじめご了承ください。英語の原文はこちら。
この記事では、Torの隠しサービス(オニオンサービスとも呼ばれます)の設定方法と、設定に使用できる基本的なオプションについて見ていきます。その後、プロトコルについてさらに詳しく説明し、クライアントが隠しサービスにアクセスしようとする際に正確に何が起こるかを解説します。
このチュートリアルは、Ubuntuの最新バージョンを基に書いており、ウェブサーバーが既に稼働していることを前提としています。
インストール#
まず最初に、Torをインストールする必要があります。aptを通じてインストールできますが、公式ドキュメントでは、コミュニティリポジトリはタイムリーに適切に更新されない歴史があるため、使用しないことを推奨しています。Torが管理するリポジトリを/etc/apt/sources.listに追加します:
deb https://deb.torproject.org/torproject.org focal main
deb-src https://deb.torproject.org/torproject.org focal main次に、リポジトリのPGP鍵をシステムに追加し、Torをインストールします:
curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
apt-update
apt install tor deb.torproject.org-keyring設定#
Torrc設定ファイル#
Torがインストールされたら、設定を行います。このステップは驚くほど簡単で、設定ファイル/etc/tor/torrcを編集して以下を追加するだけです。なお、サービスは自動的にv3として作成されます。v2サービスを作成することもできますが、v2は間もなく無効化されるため、意味がありません。
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80この2行は以下のことを行います:
HiddenServiceDirは、Torがサービスのアドレスと鍵を作成/読み取る場所です。ユーザーdebian-torが適切に読み書きできることを確認する必要があります。また、機密情報が含まれるため、アクセス権限が700であることを確認してください。HiddenServicePortは、ポートをサービスにマッピングすることができます。ここでは、Torはポート80への接続を127.0.0.1:80に転送します。1つのサービスディレクトリに対して複数の隠しポートを設定できます。また、unix:/path/to/socketを使用してソケットでコンテンツを提供することも可能です。
また、複数のサービスを設定することも可能です。異なる情報で前述の2行を繰り返すだけです(サービスディレクトリも異なる必要があります!)。順序はHiddenServiceDirの後にHiddenServicePortを記述してください。
隠しサービスディレクトリ#
設定を編集し、systemctl restart torでサービスを再起動すると、hidden_serviceディレクトリに以下のものが作成されるはずです:

hostnameには隠しサービスのURLが、hs_ed25519_*_keyには公開鍵と秘密鍵が含まれます。鍵を失うとサービスのURLも失われるため、鍵は慎重にバックアップしてください。
authorized_clientsディレクトリでは、名前の通りの機能を実現できます。これを行うには、something.authという形式のファイルを作成する必要があります。各ファイルには<auth-type>:<key-type>:<base32-encoded-public-key>形式の1行のみを含める必要があります。このページでは、このファイルに必要な情報の生成方法と、クライアントの認証設定方法が詳しく説明されています。
セキュリティの強化#
Torを使用する際のサーバーのセキュリティ確保について詳細には触れませんが、以下はやるべきことの一部(網羅的ではありません)です:
- サーバーに関する情報をリンクしないように注意する
- Torを通じたローカルリソースへのアクセスに注意する
- できればTorをリレーとしてではなくクライアントとして使用する(ゲートウェイがダウンした際に隠しサービスもダウンするという相関を不可能にするため)
- Project Vanguardを確認する。これは匿名性解除攻撃に対するセキュリティを強化します。簡単に言うと、Vanguardが防ごうとしているシナリオは次の通りです:攻撃者が多数のリレーを運用しながら隠しサービスに大量のリクエストを行い、そのリレーの1つがミドルノード(ガードノードとランデブーポイントリレーの間)として選ばれる可能性があります。そこからガードリレーを侵害し、サービスポイントのIPを特定することが可能になります。
デバッグ#
何らかの理由で設定したディレクトリに何も作成されない場合、またはサービスに到達できず設定が正しい場合は、sudo -u debian-tor torを使用してTorサーバーを起動すると、サーバーの初期化に関するより詳しい情報が得られます(例えばネットワークに接続できない場合など)。
設定ファイルに以下を追加してログを有効にすることもできます:
SafeLogging 0
Log notice file /path/nf.log
Log info file /path/if.logなお、Torをクライアントモードで実行している場合、ファイアウォールで受信ポートを開く必要はありません。ポート443への送信接続を許可するだけで十分です。
クライアントはどのように隠しサービスに接続するか#
ここで、接続の仕組みがどうなっているのか疑問に思われるかもしれません。この部分はそれを理解するためのものです。読んだ後もさらに情報が必要な場合は、プロトコル仕様をご覧ください。
サービスの初期化#
- 設定で見たように、サービスには公開鍵と秘密鍵が必要です。これらは通信のセキュリティ確保とサービスのアドレス生成に使用されます。Torが自動的に生成できますが、バニティアドレスを取得するために手動で鍵を作成し、アドレスが特定の文字列で始まるまで鍵生成を大量に繰り返す人もいます。例えば、
facebookcorewwwi.onion(この記事のパート3を参照)。 - 鍵が作成されると、隠しサービスはイントロダクションポイントとして機能するいくつかのノードを選択します。
- 隠しサービスはこれらのノードに接続し(Tor回路を使用し、匿名性の目的を損なう直接接続は行いません!)、公開鍵を共有します。その後、接続を開いたまま維持します。
- 隠しサービスは、公開鍵とイントロダクションポイントの情報を含む隠しサービス記述子を作成します。その後、この記述子を公開鍵で署名し、DHT(分散ハッシュテーブル)システムの一部である6つの隠しサービスディレクトリ(HSDirフラグが有効な通常のノード)にアップロードします。
ステップ(1)は明らかにサービス作成時にのみ実行されますが、次のステップは定期的に繰り返されます。DHTについてさらに詳しく知りたい場合は、この記事(DHTからのデータ収集について紹介)をご覧ください。
クライアントの接続#
クライアントが隠しサービスに接続しようとすると、以下のことが起こります:
- クライアントはDHTに隠しサービスの記述子を要求します
- クライアントはランダムなリレーをランデブーポイントとして選択し、(回路を通じて)接続します
- クライアントは、ランデブーポイントのアドレスとワンタイムシークレットを含むイントロデュースメッセージを作成します。次に、隠しサービスの公開鍵で暗号化し、イントロダクションポイントに送信します
- イントロダクションポイントはイントロデュースメッセージを隠しサービスに転送します
- 隠しサービスはランデブーポイントに接続し、ランデブーメッセージでワンタイムシークレットを送信します
- ランデブーポイントは接続が成功したことをクライアントに通知します
- ここから、クライアントと隠しサービスは通信できるようになります。ランデブーポイントはゲートウェイとして機能し、暗号化されたメッセージのみを見ることができます