Torネットワーク上にonionドメインのWebサーバーを建てる

# 環境

[前回の記事](https://qiita.com/kk0128/items/61a34a7ce654d0b23cfd)で構築したWhonix Gatewayを使う。

- Whonix Version: 17.0.4.5
- Apache: 2.4.57

# Apacheをインストール

[公式サイト](https://community.torproject.org/onion-services/setup/)には`Apache`と`Nginx`の解説があるので今回は`Apache`を使用する。

```bash
sudo apt install apache2
```

# Webページの準備

ブラウザで表示するコンテンツを作成する。

```bash
sudo vi /var/www/html/index.html 
```

コンテンツが準備できたらApacheの動作確認をする。

![curlで動作確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/276ac333-fecd-a3eb-1f18-454e5ebe1e1e.png)

# Torrcの設定

`torrc`ファイルに必要な設定を追加する。
Whonixの場合、`torrc`ファイルはシンボリックリンクになっており、リンク先は`/etc/tor/torrc.anondist`ファイルになっている。

![torrcのシンボリックリンク確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8c5fd228-1603-d9c0-60de-0b7c571c3883.png)

`/etc/tor/torrc.anondist`ファイルの中身を確認すると、`このファイルを編集せず、代わりに /usr/local/etc/torrc.d/50_user.conf を編集して`と書かれているので`/usr/local/etc/torrc.d/50_user.conf`ファイルを編集する。

![torrcのリンク先ファイル中身確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/66f3d36a-6a0e-7308-e486-8144290f10c9.png)

```bash
sudo vi /usr/local/etc/torrc.d/50_user.conf
```

`HiddenServiceDir /var/lib/tor/hidden_service/`と`HiddenServicePort 80 127.0.0.1:80`の2項目を追加

```/usr/local/etc/torrc.d/50_user.conf
# Tor user specific configuration file
#
# Add user modifications below this line:
############################################

ExcludeNodes {jp},{us},{gb},{ca},{au},{nz},{dk},{fr},{nl},{no},{cn},{ru},{de},{be},{it},{es},{il},{sg},{kr},{se},127.0.0.1,{??}
ExcludeExitNodes {jp},{us},{gb},{ca},{au},{nz},{dk},{fr},{nl},{no},{de},{be},{it},{es},{il},{sg},{kr},{se},{bg},{cz},{fi},{hu},{ie},{lv},{??}},{cn},{ru}
NumEntryGuards 5
StrictNodes 1

HiddenServiceDir /var/lib/tor/hidden_service
HiddenServicePort 80 127.0.0.1:80
```

:::note info
`ExcludeNodes`や`ExcludeExitNodes`項目は[前回の記事](https://qiita.com/kk0128/items/61a34a7ce654d0b23cfd)で使用した項目なので無くてもOK。
:::

`HiddenServiceDir`はOnion サービスの情報と暗号キーを含むディレクトリを指定します。Torを実行するユーザーが読み取り/書き込み可能なディレクトリを指定します。

`HiddenServicePort`はリダイレクトするポートとアドレスの設定を記述する。今回の例では`80番ポート`にアクセスしたトラフィックは`127.0.0.1:80`にリダイレクトされる。

設定が完了したら、反映させるためにtorサービスを再起動する。

```bash
sudo systemctl restart tor
```

# Onionサービスの動作確認

設定が正常にできていれば、`HiddenServiceDir`で指定したディレクトリ配下に必要なファイルが生成されている。

```bash
% sudo ls -l /var/lib/tor/hidden_service      
total 16
drwx--S--- 2 debian-tor debian-tor 4096 Nov 25 08:11 authorized_clients
-rw------- 1 debian-tor debian-tor   63 Nov 25 08:11 hostname
-rw------- 1 debian-tor debian-tor   64 Nov 25 08:11 hs_ed25519_public_key
-rw------- 1 debian-tor debian-tor   96 Nov 25 08:11 hs_ed25519_secret_key
```

`hostname`ファイルにonionドメインのアドレスが記載されているので確認する。

```bash
% sudo cat /var/lib/tor/hidden_service/hostname
ypb7sakgr6sxmtiaj6537evb255k6jaccf6mufuewl6k2ppmmgswg7ad.onion
```

キーファイルは外部に漏らさないように気を付けよう。

>他のファイルは Onion サービス キーであるため、これらを秘密にしておくことが不可欠です。 キーが漏洩すると、他の人が Onion サービスになりすまし、そのサービスが侵害され、役に立たず、アクセスするのは危険であるとみなしてしまう可能性があります。
>> [オニオンサービスのセットアップ](https://community.torproject.org/onion-services/setup/)

最後に、`hostname`に記載されているアドレスにtorブラウザからアクセスする。

![Webサイト実行確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/94cf2627-a227-52d8-2658-bfc2247e3a7d.png)

# おまけ

## 複数サイトを構築する場合

複数サイトを構築する時や、転送するポートを追加する場合は、`HiddenServiceDir`と`HiddenServicePort`の項目を追加する。

```
HiddenServiceDir /var/lib/tor/onion_service/
HiddenServicePort 80 127.0.0.1:80

HiddenServiceDir /var/lib/tor/other_onion_service/
HiddenServicePort 6667 127.0.0.1:6667
HiddenServicePort 22 127.0.0.1:22
```

### Apacheの設定

`Apache`の`VirtualHost`を使用する場合は、下記のように記述する。

```bash
<VirtualHost *:80>
   ServerName <your-onion-address.onion>
   DocumentRoot /path/to/htdocs
   ErrorLog ${APACHE_LOG_DIR}/my-website.log
 </VirtualHost>
```

### Nginxの設定

`Nginx`を使用する場合は、下記のように記述する。

```bash
server {
    listen unix:/var/run/tor-my-website.sock;
    server_name <your-onion-address>.onion;
    access_log /var/log/nginx/my-website.log;
    index index.html;
    root /path/to/htdocs;
}
```

## セキュリティに関する設定

クライアント認証の利用が可能。

https://community.torproject.org/onion-services/advanced/client-auth/

オニオンサービス運用のベストプラクティスについてはこちらを確認してください。

https://community.torproject.org/onion-services/advanced/opsec/

https://riseup.net/en/security/network-security/tor/onionservices-best-practices

サーバー IP アドレスなどの匿名性を損なう可能性のある情報がオニオンサイトから漏洩していないかどうかを確認するツールもあります。

https://github.com/s-rah/onionscan

# 参考サイト

https://community.torproject.org/onion-services/setup/