Tor+WordPressでセキュアなディープウェブサイトを構築

Takuya Kobayashi⛰
2024.06.14

WordPressで更新できるセキュアなTor onionサイトサーバーの構築方法を紹介します。

OSはUbuntu Server 24.04。
ネットにつながるノートPC1台あれば構築可能です。

「闇を暴いてください」系の文書を公開しようと思っている方に少しでも参考になればと思います。

暗号化ドライブの用意

まず、色々なものをインストールする前にonionサイトに公開するコンテンツや設定ファイルなどを格納する暗号化ドライブを用意します。
Tor+WordPressの構築に必須ではありませんが、鹵獲された場合も抵抗できるように暗号化ドライブを使用します。

LUKSを使って暗号化ドライブを構築します。

$ sudo su
# apt install cryptsetup
# cryptsetup luksFormat /dev/sdX
# cryptsetup luksOpen /dev/sdX storage

ファイルシステムを作成。

# mkfs -t ext4 /dev/mapper/storage

マウントポイント「/storage」を作成してマウントします。

# mkdir /storage
# mount /dev/mapper/storage /storage

2回目以降のマウントの場合は次のコマンドを実行します。

# cryptsetup luksOpen /dev/sdX storage
# mount /dev/mapper/storage /storage

Torのインストール

Torをインストールします。

# apt install tor

torrcファイルを編集してHiddenServiceを設定します。

# vi /etc/tor/torrc
HiddenServiceDir /storage/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80

「HiddenServiceDir」には秘密鍵やonionアドレスが書かれたhostnameが配置されるので、暗号化ドライブを指定します。

暗号化ドライブにHiddenServiceDirのディレクトリを作成し、所有者・権限を設定します。

# mkdir /storage/tor/hidden_service
# chown debian-tor:debian-tor /storage/tor/hidden_service
# chmod 700 /storage/tor/hidden_service

バニティアドレスを設定しない場合はこの時点でtorを再起動し、hostnameファイルでonionアドレスを確認します。

# systemctl restart tor
# cat /storage/tor/hidden_service/hostname
gsc2h3d567n2bi5224xuwpquzr5d7oc4sojckuz4v2zmrzoza5a2brqd.onion

バニティアドレスを取得

通常のonionアドレスはbase32のランダムな英数字ですが、
頭から数文字はRSAガチャをすることで任意の文字を指定することができます。

バニティアドレス作成のためのツールは色々ありますが、こちらを参考に「mkp224o」を使ってみました。

mkp224oはCPUで計算しますが「Scallion」というGPUで計算するツールもあります。Scallionの使い方はこちらのサイトで詳しく紹介されています。

必要なものをインストール、ダウンロード・コンパイル:

$ sudo apt install libsodium-dev autoconf git gcc make
$ git clone https://github.com/cathugger/mkp224o
$ cd mkp224o
$ ./autogen.sh
$ ./configure && make

以下のコマンドで実行:

$ mkdir onion
$ ./mkp224o -d onion/ -S 60 leak
set workdir: onion/
sorting filters... done.
filters:
        leak
in total, 1 filter
using 2 threads
>calc/sec:8883373.549351, succ/sec:0.000000, rest/sec:19.150485, elapsed:0.104436sec
leakobtakdg4ekqnr554cyp45m7wjrbk67m3b5m6hvobhadukkkepmqd.onion
leakwq5zanv65lb4l5yplvprvlpurj3xffejkoyo4bdfjb2p5np4ymad.onion
leakty2peayy25er4hmojxtryfffeo4p3p37nmaof52sjt666shahhyd.onion
:

「leak」という文字列を含むアドレスが見つかり次第、onion/に保存されます。
「-S 60」は60秒に一度ステータスを表示するオプション。当然ですが、桁数が増えるほど途方もない時間がかかります。

onion/leak*/には次の3つのファイルが作成されます。

  • hostname
  • hs_ed25519_public_key
  • hs_ed25519_secret_key

気に入ったアドレスのディレクトリを選び、その中の秘密鍵「hs_ed25519_secret_key」を
/storage/tor/hidden_service/に移動させます。

移動した鍵の所有者をdebian-tor:debian-torにしてからtorを再起動

# chown debian-tor:debian-tor /var/lib/tor/hidden_service/hs_ed25519_secret_key
# chmod 400 /var/lib/tor/hidden_service/hs_ed25519_secret_key
# systemctl restart tor

秘密鍵をもとにhostnameと公開鍵が生成されます。

Torブラウザでleak*.onionにアクセスするとこのサーバーの80番ポートを見に来るようになりました。

LAMP環境の構築

WordPressを構築するにあたり、LAMP環境を構築する必要があります。
LAMP:Linux,Apache,MySQL,PHPの頭文字をとったもの。

# apt install apache2 php-mysql php

Apacheの設定

<VirtualHost *:80>
        ServerName leak36kdaftq2ptmlitsro446bl2uftece6biawpawco36zhifd2z6ad.onion
        DocumentRoot /var/www/storage
        ErrorLog /dev/null
        CustomLog /dev/null combined
        <Directory "/var/www/storage">
                Require ip 192.168.11.110 127.0.0.1 #アクセスを許可するIPアドレス
                AllowOverride All
        </Directory>
</VirtualHost>

MySQLのデータディレクトリを暗号化ドライブに変更しましょう。ディレクトリを移動してシンボリックリンクでOKです。

MySQLでデータベース「wordpress」とユーザーアカウントを作成「wordpress_user」

# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_root_password';
mysql> CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> CREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'new_user_password';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress_user'@'localhost';
mysql> FLUSH PRIVILEGES;

WordPressのインストール

# wget https://ja.wordpress.org/latest-ja.zip
# unzip latest-ja.zip
# mv wordpress/ /storage/www/
# vi /storage/www/wordpress/wp-config.php
(略)
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress_user');
define('DB_PASSWORD', 'new_user_password');
define('DB_HOST', 'localhost');
(略)

wp-config.phpにMySQLのDB名・ユーザー・パスワードを設定し、Ubuntu ServerのIPアドレスにブラウザでアクセスするとWordPressインストール画面になります。
任意のサイト名やアカウントなどを設定します。

ネットワーク周りの設定

WordPressのコンテンツを公開する際に、サーバーと同じローカルネットに居る場合はローカルネットからログインしたい。

/etc/hostsにonionアドレスとサーバーのローカルIPアドレスを設定することで、通常のブラウザのアドレスバーにonionアドレスを入力することでアクセスできます。

192.168.11.8 leak36kdaftq2ptmlitsro446bl2uftece6biawpawco36zhifd2z6ad.onion

しかしこれでは、/etc/hostsを見られたらonionアドレスがバレてしまいます。
そこで、dnsmasqを使用して暗号化ドライブ内に設定ファイルを配置することで、暴露を防ぎます。

dnsmasqをインストールする前にsystemd-resolveを無効化します。

# vi /etc/systemd/resolved.conf
DNSStubListner=no# systemctl restart systemd-resolve

dnsmasqをインストール

# apt install dnsmasq

設定ファイルの場所を暗号化ドライブに設定

# vi /etc/dnsmasq.conf
conf-dir=/storage/dnsmasq.d/,*.conf

IPアドレスとonionアドレスを関連付ける

# mkdir /storage/dnsmasq.d/
# vi /storage/dnsmasq.d/onion.conf
address=/leak36kdaftq2ptmlitsro446bl2uftece6biawpawco36zhifd2z6ad.onion/192.168.11.8

これでローカルネット上のクライアントはUbuntu ServerをDNSに設定すればonionアドレスでローカルネットから参照できるようになります。

外からアクセスする場合はTor Browserを使用します。

Tor越しに使用できる匿名メールアドレス

Tor越しでメールアドレスを取得できるサービスに「Proton Mail」があります。

onionアドレス:
https://account.protonmailrmez3lotccipshtkleegetolb73fuirgj7r4o4vfu7ozyd.onion

Proton MailはアメリカやEUの権力が及ばず、DPAやDPOなどの強固なプライバシー保護法が存在するスイス連邦で運用されているため、非常に匿名性が高いサービスです。

このメールアドレスとオニオンサイトを使って記者とやり取りしましょう。

鹵獲前に電源を落とす必要がある

稼働している状態で鹵獲されると暗号化ドライブがマウントされている状態なので、鹵獲前に電源を落とす必要があります。足が引っ掛かったり、扉が開いたり何らかの物理的なイベントが発生したら電源が落ちるような仕掛けを作ったり、遠隔でシャットダウンコマンドを送れるようにする等、トリップワイヤやキルスイッチを用意する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です