Torを使って個人情報をコントロールする方法

##はじめに

今回は、よく耳にする`Tor`という世間的には少し胡散臭い印象を持たれているツールの仕組みと使い方などを紹介します。

ただし、予め言っておきますが、これらのツールを攻撃のために利用しないでください。また、法を犯した場合で、かつその追跡を免れるためなどに使用することも推奨しません。

Torを使う目的は、以下の記事でも書かれているように、幾つもの目的に分類されます。

[匿名通信「Tor」はいかに使われている？–用途や仕組み、過信できない点も](http://japan.zdnet.com/article/35068938/)

- プライバシーを保護する：インターネットサービス事業者やウェブサイトによってユーザーの情報が収集され、サードパーティーに転売されないようにする。

- 通信を保護する：Torはデジタルでの通信を秘匿化するための手段として推奨されている。

- デリケートな話題に関する調査を実施する：必要としている情報がユーザーの居住地では利用できない場合もある。Torの利用によって、ユーザーが使用するコンピュータのIPアドレスを隠ぺいすることで、該当ユーザーの居住地を特定できないようにする。

- 監視の目をかいくぐる：Torを使用すれば、サイトと、そのサイトへの訪問者を関連付けられないようにできる。

ここで、一番多いのは、プライバシー保護のためだと思われ、ユーザー情報の売買などに使われたくないからという理由からだと思われます。

「企業がユーザー情報の売買やコンピュータ・ウィルスをばらまくはずない」という考えは分かりますが、私は、個人が情報を出来る限りコントロールする時代に来ており、その選択肢の一つとして、Torが有効であると考えています。

- [LenovoのPCにはBIOSレベルでWindowsのシステムファイルを上書きする危険な機能があると判明](http://gigazine.net/news/20150813-lenovo-service-engine/)

これは、個人でやると犯罪レベルだと思われますが、企業がやると犯罪ではありません(正確に違うけど)

- [不倫サイトのクラッキング事件で考えるネットサービスの信頼性みたいなもの](http://bylines.news.yahoo.co.jp/yamamotoichiro/20150825-00048820/)

攻撃されたサイト自体も相当にまずいことをしていたという情報が出ています(真偽は不明ですが)。

- [楽天、利用者のメールアドレスを含む個人情報を「1件10円」でダウンロード販売していることが判明](http://gigazine.net/news/20090527_rakuten_csv/)

本当かどうかは知りませんが、今日、個人情報は売買の対象となっており、かつ契約内容にもよりますが、必ずしも個人情報の売買が犯罪や契約違反、法令違反に当たるとは限りません。

##基本的な説明

ここで、私達がインターネットに接続する際、どういった情報が管理者に伝わるのか、若しくは検索可能になるでしょうか。

私達が、例えば、Webサイトにアクセスしたとして、一つに、そのWebサイトの管理者には、こちらのグローバルIPアドレスが伝わります。

このアドレスは、通常プロバイダが割り当てるもので、ここから直接個人を結びつけることはできませんが、このアドレスから大体の住所が検索可能です。

グローバルIPアドレスは、ルータを使用している場合、コンピュータ一つ一つに割り当てられるのではなく、使用しているルーターに割り当てられます。個々のコンピュータは、このルーターに設定されたグローバルIPアドレスを使って、LAN(ローカル)からWAN(インターネット)にアクセスすることになります。

そして、このアドレスは固定アドレスを取得していない限り日々、変動します。

Torを使うことによって、このグローバルIPアドレスを秘匿し、追跡や特定を困難にさせるという特徴があります。

その他、Web管理者は、接続してきたコンピュータのグローバルIPのほか、ブラウザやOS、住所や起動時間など検索可能です。

##Torのインストール

```bash:
# Mac
$ brew install tor

# Linux
$ sudo pacman -S --noconfirm tor
```

##Torの仕組み

Torの仕組みは非常に単純です。ボランティアによって設置された複数のTorサーバー(Proxyサーバー)を経由して、インターネットにアクセスする仕組みを提供します。

この際に使われるProxy(プロキシ)は、デフォルトでは、`socks5://127.0.0.1:9050`または、`socks5://localhost:9050`です。

意味としては、プロトコルsocks5を使って、localhostのポート番号9050をインターネットとの出入口にするみたいな感じです。

したがって、例えば、現在使用しているグローバルIPアドレスを検索するサイトを使って、Torを経由しているかどうかを調べてみます。Torを実行した後、以下のコマンドを実行してみてください。

```bash:
$ curl -sL ipinfo.io
本当のグローバルIPアドレス

$ curl -sL --socks5 127.0.0.1:9050 ipinfo.io
Torサーバーを経由したグローバルIPアドレス
```

このように、Torで設定されるProxy設定を指定することで、通信のおいて、相手方には、Torサーバーを経由したグローバルIPアドレスが伝わり、本当のグローバルIPアドレスは伝わりません。

##Torの使い方

###基本的な説明

```bash:
$ tor &
or
$ tor
```

Torを使いこなすには、コンピュータの仕組みをある程度理解している必要があると思われます。

一つに、Torを起動したからといって、すべてのアプリが自動でTor経由になるわけではないということです。

通常は、個々のアプリごとにProxyの設定を行い、Tor経由のアクセスを実現する必要があります。

そして、中には、`socks`というプロトコルに対応していないと思われるアプリもいくつかあります。そのような場合も個別に対応する必要があります。

例えば、`youtube-dl`というアプリを`socks`経由で使ってみたい場合は、以下のようになります。

```bash:
$ yaourt -S proxychains-ng
$ proxychains youtube-dl $URL
```

具体的には、`proxychains`を使って独自のプロキシ経由でコマンドを実行するツールを使わなければなりません。

ここで、外部と通信するコマンドの多数は、以下の環境変数を使いますので、環境変数を設定しておくと、Shellから実行するコマンドの幾つかのProxy設定を省略できる場合があります。

```bash:~/.zshrc
export http_proxy=socks5://127.0.0.1:9050
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
export FTP_PROXY=$http_proxy
export RSYNC_PROXY=$http_proxy
```

```bash:
$ source ~/.zshrc
$ curl -sL ipinfo.io
Tor経由のグローバルIPアドレス

$ unset http_proxy HTTP_PROXY
$ curl -sL ipinfo.io
本当のグローバルIPアドレス

#環境変数をリセットすると、プロキシが`socks5://127.0.0.1:9050`経由ではなくなる
```

ただし、この設定がいつなんどきでも有効とは限りません。

ユーザーが実行するShellに依存しますし、場合によってはツールに依存する場合があります。たとえば、ユーザーが`cron`を設定したとして、そこで設定ファイルを読み込まない限り、環境変数は有効にはなりません。

そして、`sudo`, `root user`などでも環境変数は異なりますし、例えば、`sudo`で当該環境変数を使用する場合は、以下のように設定しなければなりません。なお、`/etc/sudoers`の直接編集は避けてください。

```bash:visudo
Defaults env_keep += "http_proxy https_proxy ftp_proxy"
```

`root`の場合はデフォルトシェルの設定ファイルを使用するとよいでしょう。

したがって、基本的には、あらかじめTor Proxyの設定が確実に実行されるように設計された`Tails Linux`などの専用のOSを使うのが良いかと思われます。

また、環境変数を使用する場合の注意点として、場合によっては`unset`しないとエラーが出る場合もあります。その場合はその都度、`unset`しなければなりません。

```bash:
# proxychainsを使う場合は、必ず環境変数をリセットしておく必要がある
$ unset http_proxy HTTP_PROXY
$ proxychains curl ipinfo.io
```

###自動起動

Arch Linuxの場合、`~/.xinitrc`に書いても良いし、`systemctl enable`を使っても良いです。

```~/.xinitrc
tor &
```

Macの場合は、以下のように独自の仕組みを使いスクリプトを実行するのが良いかと思います。

```bash:
# ログイン項目に登録
$ sudo defaults read com.apple.loginwindow LoginHook /path/to/script.sh

# 解除
$ sudo defaults delete com.apple.loginwindow LoginHook
```

```/path/to/script.sh
#!/usr/local/bin/zsh

export http_proxy=socks5://127.0.0.1:9050
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
export FTP_PROXY=$http_proxy
export RSYNC_PROXY=$http_proxy

tor &
```

または直接、起動してもよいかもしれません。

```bash:
$ which tor

$ sudo defaults read com.apple.loginwindow LoginHook /path/to/tor
```

###Chromium

````bash:
$ chromium --proxy-server="socks://localhost:9050"
```

###Firefox

`設定 > 詳細 > ネットワーク > 手動でプロキシを設定する`

```bash:
socks:localhost:9050
```

###Firefox for Android

Google Playから[Orbot](https://play.google.com/store/apps/details?id=org.torproject.android&hl=ja)をインストールし、実行します。

AndroidのFirefoxの場合は、`about:config`にアクセスして、`proxy`で検索後に以下を設定します(これはAndroidに限らず)。

```bash:
network.proxy.socks = 127.0.0.1
network.proxy.socks_port = 9050
network.proxy.socks_remote_dns = true
network.proxy.type = 1
#network.proxy.http = 127.0.0.1
#network.proxy.http_port = 8118
#network.proxy.ssl = 127.0.0.1
#network.proxy.ssl_port = 8118
```

確認くん : http://www.ugtop.com/spill.shtml



[Proxy settings](https://wiki.archlinux.org/index.php/Proxy_settings)


###Arch Linux

これは、[Arch Wiki - Tor](https://wiki.archlinux.org/index.php/Tor)を見てもよくわからないと思いますので、解説します。torの設定は、/etc/tor/torrcで設定するのですが、デフォルトの設定ファイルでは動作しませんので、空の設定ファイルを置くか、コメントアウトします。

ここでは、`/etc/tor/torrc-dist`の設定ファイル(コメントアウト)を上書きします。また、GUIメニュー等があったほうが分かりやすいですし、`vidalia`をインストールしておきます。ただし、`vidalia`は現在メンテナンスされていませんので、使用には十分注意してください。CUIに慣れているユーザーはインストールする必要はありません。設定ファイルと`tor`だけで十分です。

手順としては以下の様な感じになります。

```bash:
$ gpg --recv-keys 0x63FEE659

$ yaourt -S vidalia

$ vidalia
C-c

# vidaliaで設定した設定ファイルは ~/.vidalia/torrc に置かれますので、設定後にこれを /etc/tor/torrc にコピーしてもよいです
$ sudo cp /etc/tor/torrc-dist /etc/tor/torrc

$ tor &
------------------------
$ chromium --proxy-server="socks://localhost:9050"

# これについては後述します
$ sudo systemctl enable tor
```

##Torを使う上での注意点

最後に、Torを使う上で注意して置かなければならない点は、以下の3つです。

- Tor Serverの1割が盗聴、改ざん目的で仕掛けられている危険がある

- Torによる匿名性は完全ではなく、さらにユーザーの設定によるところが多く、個人で設定する場合、その匿名性を確保することは難しい。単に追跡を困難にさせるくらいに考えておくのが良い

- Tor Serverを経由させる通信は、複数のサーバーを経由するために、基本的に遅くなりがちであり、ノードにおいてもHostnameなどから通信を拒否されることも多い

##その他、個人情報をコントロールする上での注意点

- 通常の検索エンジンでの検索は、その履歴が残るので、[https://startpage.com](https://startpage.com)などを使わないと、個人情報はコントロールできない。

- たとえば、LinuxのSystemdはほとんどのログをデフォルトで残すので、そのログからの追跡は可能である

## 追記

torコマンドの仕様が変更され、デフォルトでは一度取得したアドレスを使い続けるようになりました。

もしip addressを変更したい場合は、以下のコマンドを実行します。

```shell_session
$ sudo killall -HUP tor
````

もしユーザー権限管理アプリのsudoを使っているような場合、手軽に実行するためには/etc/sudoersを書き換えることで、パスワードを要求しないようにできます。

```/etc/sudoers
%wheel ALL=(ALL) NOPASSWD:/usr/bin/tor,/usr/bin/killall -HUP tor
```

当該コマンドは、sudoで実行する際にパスワードを要求しなくなります。

```sh
$ sudo tor
$ curl -sL ipinfo.io|jp -r .ip
36.221.4.46

$ sudo killall -HUP tor
$ curl -sL ipinfo.io|jq -r .ip
181.23.93.121
```

## WARN: Failed to find node for hop 0 of our path. Discarding this circuit

以下のようなエラーが出る場合があります。その場合は、ntpをtrueにすることで解決できます。

> WARN: Failed to find node for hop 0 of our path. Discarding this circuit


```sh
$ sudo timedatectl set-ntp true
$ timedatectl status
$ sudo tor
```