本文の内容は、2022年5月26日にJason Donahueが投稿したブログ(https://sysdig.com/blog/detect-tor-network-connection-falco/)を元に日本語に翻訳・再構成した内容となっております。
TORは、インターネット上の接続を匿名化するという考えで作られましたが、他の事例と同様に、攻撃者が自分自身を隠すためにこれを利用することができます。この記事では、Falcoを使用してTORネットワークを介したインバウンドおよびアウトバウンドのネットワーク接続を検出することがいかに簡単であるかについて説明します。
TORとは?
TORは、「The Onion Router」と呼ばれ、ネットワークトラフィックを匿名化するために協働しているコンピュータのネットワークです。TORを使用すると、ユーザーへのインターネット活動の追跡がより困難になります。TORの使用目的は、ユーザーのインターネット活動を監視されないようにすることで、個人のプライバシーを保護し、機密通信を行う自由と能力を保護することです。TORは、オープンソースの技術に基づき、6,000以上のリレーからなる無料の世界規模のボランティア・オーバーレイネットワークを通じてインターネットトラフィックを誘導し、ネットワーク監視やトラフィック分析を行う者からユーザーの位置や使用状況を隠蔽する事ができます。
TORは合法的に使用される一方で、攻撃者が攻撃元やデータ流出先を隠すために使用されることもあります。
Falcoとは?
Falcoは、インキュベーションレベルのプロジェクトとしてCNCFに参加した最初のランタイムセキュリティプロジェクトです。Falcoは、予期せぬ行動、侵入、データ盗難をリアルタイムで検出するセキュリティカメラとして機能します。FalcoはどのようにTORトラフィックを検出できるのですか?
ここでの課題は、ネットワークノードが動的であり、絶えず変化するため、静的なリストは役に立たないということです。一方、この種の接続をできるだけ早く検出し、異常な動作かどうかを判断することが重要です。幸いなことに、TORはメトリクスAPIを提供しており、すべてのTORリレーノードをリストアップすることができます。TOR ネットワークのリレーの種類によって技術的な要件は異なりますが、私たちは、TORネットワークの最初と最後のノードに焦点を当てることに注目しています。
詳細エンドポイントを使用すると、すべての TOR リレーノードのステータスと機能を取得できます。
このことを念頭に置いて python スクリプトを作成すると、アドレスを解析して分類することができます。このスクリプトは、TORネットワークとの接続を検出するFalcoリストとルールを作成することができます。
TORのIPリストを最新に保つ
先に述べたように、TORノードは常にスピンアップとダウンが繰り返されています。リストを最新の状態に保つには、定期的にpythonスクリプトを再実行する必要があります。- ホスト上で実行する場合、これはcronジョブで行うことができます。
- dockerコンテナでは、bashのforループとsleepコマンドで実行できます。
インバウンド vs. アウトバウンド
サーバーとTORネットワーク間の接続が、サーバーによって開始されるか、TORノードによって開始されるかによって、大きな違いがあります。例えば、TORの出口ノードがあなたのサーバーに予期しない接続を作成した場合、それは進行中の攻撃の企てを示す可能性があります。また、一般的なエクスプロイトを探すスキャンボットである可能性もあります。あるいは、身元を隠したい正当なユーザーである可能性もあります。一方、サーバーがTORエントリーノードへの予期せぬ接続を開始した場合、これはサーバーが侵害され、誰かがデータの流出を試みている、あるいは他のシステムに対する攻撃を開始するためにサーバーを使用している可能性が最も高いと言えます。
TOR 接続を検出するために Falco を使用する場合、どのような接続に注意を払うかを考えておくとよいでしょう。あなたのサーバーへのインバウンドコネクションにアラートを出すと、無害なトラフィックのために多くのノイズを発生させる可能性があります。
TOR接続を検出するFalcoのステップバイステップ
以下のウォークスルーでは、Ubuntu 20.04を実行しているフレッシュなt2.micro AWSインスタンスを使用しています。コマンドは、あなたの特定のユースケースによって異なる場合があります。Dockerのインストール
DockerはFalco、または私たちが使用するpythonスクリプトの要件ではありませんが、Falcoは一般的にコンテナワークロードを保護するために使用され、我々はいくつかのDockerコンテナを実行してFalcoルールが期待通りに機能していることを確認します。sudo apt install -y docker.io
Falcoのインストールと起動
このウォークスルーでは、Falcoをシステムサービスとしてインストールします。Falcoは、Dockerコンテナとして、またKubernetesクラスター内のデーモンセットとしてインストールすることも可能です。完全なインストールドキュメントは、https://falco.org/docs/getting-started/installation/ で見ることができます。curl -s https://falco.org/repo/falcosecurity-3672BA8F.asc | apt-key add - echo "deb https://download.falco.org/packages/deb stable main" | tee -a /etc/apt/sources.list.d/falcosecurity.list apt-get update -y apt-get -y install linux-headers-$(uname -r) apt-get install -y falco systemctl start falco
スクリプトのセットアップ
今回使用するスクリプトはpythonで書かれており、python3環境が必要です。コアライブラリ以外で必要なpythonライブラリはrequests(とその依存関係)だけです。以下では、ベストプラクティスとして、スクリプトの python 環境をシステムの他の部分から分離するために、仮想環境を作成します。github リポジトリには、ホストシステム上でスクリプトを実行する代わりに使用することができる Dockerfile が含まれています。Dockerfileは、正しいFalcoの設定パスに書き込むためにもう少し設定が必要で、それを設定することはこのブログの範囲外です。
Git リポジトリをクローンする
cd /opt/ git clone https://github.com/draios/falco_tor_rule_creator
仮想環境の作成と起動
apt install -y python3-pip python3.8-venv cd falco_tor_rule_creator python3 -m venv venv source venv/bin/activate
スクリプト要件をインストール
pip install -r requirements.txt
スクリプトのテスト
Pythonスクリプトには、カスタマイズのためのオプションがいくつかあります。どのような接続を検出するか(ingress/egress)、またFalcoによって生成されるアラートの深刻度を選択することができます。必ず-helpの出力を読んでください。この例では、デフォルトの深刻度(WARNING)を使用して、イングレスとイグレスの両方のトラフィックを検出します。python falco_tor_rule_creator.py --help python falco_tor_rule_creator.py --ipv4_entry --ipv4_exit
この時点でFalcoを確認すると、/etc以下のファイルを修正したため、Alertsが作成されていることがわかります。これは、Falcoの起動時にロードされた多くの事前設定されたFalcoルールのうちの1つです。
journalctl -u falco ... ... Mar 09 19:01:11 ip-172-31-14-16 falco[39211]: 19:01:11.380507166: Error File below /etc opened for writing (user=root user_loginuid=1000 command=python Mar 09 19:01:11 ip-172-31-14-16 falco[39211]: 19:01:11.381421181: Error File below /etc opened for writing (user=root user_loginuid=1000 command=python
これは予想されることですが、Falcoが実行されており、そのルールがロードされていることを示しています。
次に、新しい TOR ルールを使用するために Falco を再ロードする必要があります:
systemctl restart falco
Falco の journalctl に以下の行が表示されるはずです。
Mar 09 19:06:05 ip-172-31-14-16 falco[39454]: Loading rules from file /etc/falco/rules.d/tor_ipv4_entry_nodes_rules.yaml: Mar 09 19:06:05 ip-172-31-14-16 falco[39454]: Wed Mar 9 19:06:05 2022: Loading rules from file /etc/falco/rules.d/tor_ipv4_entry_nodes_rules.yaml: Mar 09 19:06:06 ip-172-31-14-16 falco[39454]: Loading rules from file /etc/falco/rules.d/tor_ipv4_exit_nodes_rules.yaml: Mar 09 19:06:06 ip-172-31-14-16 falco[39454]: Wed Mar 9 19:06:06 2022: Loading rules from file /etc/falco/rules.d/tor_ipv4_exit_nodes_rules.yaml:
これは、新しいルールがFalcoによって読み込まれ、警告する準備ができたことを示します。
FalcoでアウトバウンドTOR接続を検出する
TorProxyは、TORネットワークを介してトラフィックを中継するためのシンプルなコンテナです。コンテナが実行されると、TORネットワークへの接続が開始されます。これは、Falcoルールをテストするために、プロキシを使用するシステムを設定する必要がないことを意味します。コンテナが起動するとすぐにアラートが出るはずです。
torproxyを実行する
docker run -it --name torproxy -p 8118:8118 -p 9050:9050 -d dperson/torproxy
このコマンドが完了したら、Falcoの出力を確認することができます:
journalctl -u falco
最後までスクロールすると、次のような出力が表示されるはずです:
Mar 09 19:10:58 ip-172-31-14-16 falco[39553]: 19:10:58.491211341: Warning Detected connection to known TOR Node from pod or host. tor res=-115(EINPROGRESS) tuple=172.17.0.2:56794->78.47.18.110:80 Mar 09 19:11:00 ip-172-31-14-16 falco[39553]: 19:11:00.310505411: Warning Detected connection to known TOR Node from pod or host. tor res=-115(EINPROGRESS) tuple=172.17.0.2:43254->144.76.154.13:9001 Mar 09 19:11:00 ip-172-31-14-16 falco[39553]: 19:11:00.310622286: Warning Detected connection to known TOR Node from pod or host. tor res=-115(EINPROGRESS) tuple=172.17.0.2:41920->51.15.185.201:443 Mar 09 19:11:00 ip-172-31-14-16 falco[39553]: 19:11:00.310721829: Warning Detected connection to known TOR Node from pod or host. tor res=-115(EINPROGRESS) tuple=172.17.0.2:57846->188.165.26.89:80 Mar 09 19:11:07 ip-172-31-14-16 falco[39553]: 19:11:07.522959370: Warning Detected connection to known TOR Node from pod or host. tor res=-115(EINPROGRESS) tuple=172.17.0.2:57848->188.165.26.89:80
重要! プロキシは実行中の状態なので必ず停止してください。これはアクティブなプロキシであり、インバウンドルールが許可すれば接続を受け付けます。
docker stop torproxy docker rm torproxy
FalcoでインバウンドTOR接続を検出する
サーバーにnginxコンテナをインストールし、起動します。これで、接続するための簡単なウェブページができます。
docker run --name nginx -d -p 8080:80 nginx
次に、ローカルマシンにTORブラウザをダウンロードしてインストールし、TOR経由でサーバーに接続できるようにします。
TOR ブラウザを使用してサーバーに接続します。なお、ここ数日、CVE-2022-1802 と CVE-2022-1529 のセキュリティ修正がリリースされるまで、バンドルされている Tor Browser を起動しないことが推奨されています。
再びサーバー上のFalcoの出力を確認すると、以下のような行が表示されるはずです:
Mar 09 19:16:41 ip-172-31-14-16 falco[39553]: 19:16:41.546325382: Warning Detected connection from known TOR Node to pod or host. nginx fd=4(<4t>5.79.109.48:45532->172.17.0.2:80) tuple=5.79.109.48:45532->172.17.0.2:80 queuepct=0 queuelen=0 queuemax=511
まとめ
TORは悪意のあるものではありませんが、このネットワークを利用して他者と接続することは、様々な環境においてあまり一般的ではありません。FalcoとカスタムのPythonスクリプトを使えば、TORネットワークとの接続を確実にアラートすることができます。TORノードからの接続を検出するユースケースは非常に限られていると思われますが、TORへの接続を検出することは、セキュリティのツールボックスの中で重要なツールとなり得ます。
その後、もしあなたがFalcoについてもっと知りたいなら。
- まずはFalco.orgをご覧ください。
- GitHubでFalcoプロジェクトをチェックしてください。
- Falco コミュニティに参加する。
- Falco Slackでメンテナーと交流する。
- ツイッターで @falco_org をフォローする。