絶え間ないSSHブルートフォースのノイズ
パブリックIPを持つLinuxサーバーを管理しているなら、/var/log/auth.logはおそらくログイン失敗の「墓場」のようになっているでしょう。世界中から送られてくる自動化されたスクリプトによる、絶え間ない攻撃の記録です。
数年前、私の個人サーバーが午前3時にブルートフォース攻撃を受けました。それ以来、私はシステムの要塞化に執着するようになりました。しかし、Fail2BanでIPをブロックしたり、SSHポートを2222に変更したりすることは、問題を隠しているに過ぎません。攻撃者が実際にパスワードを推測できた場合に何をしようとしていたのか、それを知ることはできません。
好奇心に駆られ、私は過去6ヶ月間、デジタルのおとりを運用してきました。使用したのはCowrieという、攻撃者に「侵入に成功した」と思わせるように設計された、中対話型(medium-interaction)のSSHおよびTelnetハネポットです。鍵をかけたドアの代わりに、隠しカメラのある偽の部屋を用意したのです。
Cowrieとは何か?
Cowrieは、脆弱なUnixシステムをエミュレートするPythonベースেরアプリケーションです。ハッカーが接続しても、実際のオペレーティングシステムに触れることはありません。彼らはサンドボックスの中に閉じ込められます。これを「中対話型」と呼ぶのは、攻撃者がコマンドを実行したりパスワードを変更したりできる機能的なシェルを提供しつつ、ホストのカーネルやハードウェアからは隔離されているためです。
Cowrieが脅威インテリジェンスに非常に効果的である理由は以下の通りです:
- 欺瞞的ファイルシステム: 標準的なDebian環境を模倣します。攻撃者は、Cowrieのメモリ上にのみ存在するファイルに対して
ls、cd、catを実行できます。 - フルセッションリプレイ: すべてのキーストロークが記録されます。攻撃者がパスワードを入力すれば、Cowrieはそれをログに記録します。ディレクトリの移動に20分費やせば、そのセッション全体を映画のように再生できます。
- マルウェアの傍受: 攻撃者が
wgetやcurlを使ってルートキットをダウンロードしようとすると、Cowrieはそのダウンロードを傍受します。ファイルは隔離されたフォルダに保存され、後で分析することができます。
罠を仕掛ける:UbuntuへのCowrieのデプロイ
ハネポットの運用には、月額5ドル程度の安価なVPSを使用することをお勧めします。これにより、悪意のあるトラフィックを本番環境のインフラから隔離できます。以下は、私が罠を仕掛けるために使用したワークフローです。
ステップ1:本物のSSHサービスを移動する
ハネポットがポート22を占有する前に、実際のSSHサービスを別のポートに移動する必要があります。私は通常、8822のようなあまり使われないポートを選択します。これを忘れると、Cowrieを起動した瞬間にサーバーへのアクセス権を失うことになります。
# SSH設定を編集する
sudo nano /etc/ssh/sshd_config
# 'Port 22' を 'Port 8822' に変更する
sudo systemctl restart ssh
切断する前に、ファイアウォールで8822番ポートの通信が許可されていることを必ず再確認してください。自分の仕掛けたハネポットから締め出されるというのは、私が一度だけ経験した恥ずかしいミスです。
ステップ2:非特権ユーザーを準備する
セキュリティは多層防御が基本です。Cowrie自体の脆弱性がホストを危険にさらす可能性があるため、Cowrieをrootで実行してはいけません。権限を制限した専用ユーザーを作成します。
sudo apt-get update
sudo apt-get install git python3-virtualenv libssl-dev libffi-dev build-essential authbind virtualenv -y
sudo adduser --disabled-password cowrie
sudo su - cowrie
ステップ3:環境をインストールする
リポジトリをクローンし、Pythonの仮想環境をセットアップします。これにより、ハネポットの依存関係がシステムのPythonライブラリと干渉するのを防ぎます。
git clone http://github.com/cowrie/cowrie
cd cowrie
virtualenv --python=python3 cowrie-env
source cowrie-env/bin/activate
pip install --upgrade pip
pip install --upgrade -r requirements.txt
ステップ4:欺瞞の設定をカスタマイズする
サーバーを正当なターゲットのように見せるために、設定を調整する必要があります。デフォルトのテンプレートをコピーして、ホスト名を編集します。私は価値の高い本番サーバーに見せかけるために、srv-prod-01 と名付けました。
cp etc/cowrie.cfg.dist etc/cowrie.cfg
nano etc/cowrie.cfg
[ssh] セクションで、ポート2222でリスンするように設定されていることを確認してください。ファイアウォールのルールを使用して、実際のポート22のトラフィックをここに誘導します。
ステップ5:ポート22のトラフィックをリダイレクトする
root以外のユーザーは1024番以下のポートにバインドできないため、iptables を使用して、ポート22への着信トラフィックをCowrieのポート2222に転送します。これにより、攻撃者からはこのプロセスが見えなくなります。
# rootとして実行
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
6ヶ月間のデータ:学んだこと
半年間このセットアップを運用した結果、得られたデータは驚くべきものでした。私の小さなVPSは50GB以上の生ログを収集し、382個のユニークなマルウェアサンプルを捕捉しました。トラフィックのほとんどは自動化されたものでしたが、そのパターンは非常に興味深いものでした。
最も狙われた認証情報
ボットは単に admin/admin を試すだけではありません。驚くほど具体的です。記録された上位5つの組み合わせは以下の通りです:
- root / root (34,000回以上の試行)
- root / 123456
- admin / admin
- root / password
- oracle / oracle
また、app/app や guest/guest への試行も急増しており、これらは設定ミスのクラウドインスタンスをターゲットにしている可能性が高いです。
侵入後の戦術
ボットが「侵入」に成功した後の行動は、ほとんど常にスクリプト化されていました。ログインから0.5秒以内に、ボットは uname -a と cat /proc/cpuinfo を実行します。ハードウェアが暗号資産のマイニングやDDoS攻撃に利用する価値があるかどうかを確認するためです。
ある巧妙なスクリプトを捕捉しました。それはバイナリをダウンロードし、カーネルプロセスのように見せるために名前を [kworker/u:1] に変更し、さらに .bash_history を消去しようとしました。Cowrieはアプリケーション層でログを記録するため、攻撃者の隠蔽工作は無意味でした。私はマルウェアが置かれていた正確なURLを特定し、ホスティングプロバイダーの不正対策チームに通報することができました。
人間の要素
playlog ユーティリティを使用して、数人の人間の攻撃者がシステムを操作する様子を観察しました。ボットとは異なり、人間は慎重です。彼らは whoami と入力し、少し待ちます。誰か他の人が監視していないか確認するために last をチェックします。本物の人間が偽の環境にいることに気づく瞬間(通常、カーネルモジュールをインストールしようとして失敗したときなど)を見るのは、セキュリティ研究者にとって最高の報酬です。
結論
Cowrieを運用することで、セキュリティは退屈な防御作業から、能動的なインテリジェンス活動へと変わります。ファイアウォールやSSHキーに取って代わるものではありませんが、標準的なログでは得られないコンテキスト(背景情報)を提供してくれます。ハッカーを監視することで、彼らが実際のデータを見つける前に、何を求めているのかを正確に知ることができます。もし余っているサーバーと1時間の時間があるなら、このセットアップを強くお勧めします。ログに見えるものは、サーバーの要塞化に対する考え方を根底から変えてくれるはずです。

