本プログラムは、HTTPサーバーを利用したハニーポットです。Webサーバーとして動作し、認証情報(ID/パスワード)を把握する試みについて、その内容を記録することを目的とします。
- 指定したログインページ(例:
/admin/login.php)を模倣 - アクセスや送信された認証情報をログ
honeypot.logに記録 - 簡易 HTML フォームを返し、常に「Login failed」を表示
(任意のフォルダ)/
├── honeypot1.py # メインプログラム
├── config.yaml # 設定ファイル
├── setup.sh # サーバー初期設定スクリプト
├── deploy.sh # ファイルアップロードスクリプト
├── start.sh # 複数ポート起動スクリプト
├── honeypot.log # 実行後に生成されるログファイル
└── readme.md # このドキュメント
- Python 3.7 以上
- pip
- 仮想環境の作成 (任意):
python3 -m venv venv source venv/bin/activate - 依存ライブラリのインストール
pip install pyyaml
- ハニーポッドの起動
これらのファイルがあるディレクトリに移動してから、以下のコマンドを実行します。python3 honeypot1.py
- ターミナルで以下のようなメッセージが表示されれば成功です。
*** START HONEYPOT SERVER ***
address: "0.0.0.0" # 待ち受けアドレス(すべてのインターフェース)
port: 8080 # 待ち受けポート番号
log_response_time: true # レスポンス時間をログに記録するか
resolve_hostname: true # ホスト名の逆引きを行うか
login_path_fixed: false # ログインページパスを固定するか
login_path: "/admin/login.php" #固定している場合のログインページパス
submit_path_fixed: false # 送信先パスを固定するか
submit_path: "/admin/submit_login.php" #ログインフォーム情報を送信する先のパス
logfile: "honeypot.log" # ログファイルのパスlogin_path_fixed: trueの場合、login_pathのみフォームを返しますlogin_path_fixed: falseの場合、全ての GET リクエストでフォームを返しますsubmit_path_fixed: trueの場合、submit_pathのみPOSTデータを処理しますlog_response_time: trueの場合、レスポンス時間がログに記録されますresolve_hostname: falseにすると、ホスト名逆引きを無効化できます(高負荷時に有効)
- 上記の手順でハニーポッドを起動
- ブラウザにて
http://<IPアドレス>:8080/admin/login.phpにアクセス(IPアドレスは実行環境に応じて変更)config.yamlでlogin_path_fixedがfalseの場合は、任意のパスにアクセスしてもフォームが表示される
- ブラウザにログインフォームが表示される
- ターミナルにこのアクセスを示す以下のような緑色のログが表示される。また、ログファイル
honeypot.logにも同様のログが記録される。2025-08-07 12:34:56.123 (+0900) 127.0.0.1:53421 GET /admin/login.php - ブラウザ上でログインフォームに任意のユーザー名とパスワードを入力してログインボタンを押下
- ターミナルにこのアクセスを示す以下のような黄色と赤色のログが表示される。また、ログファイル
honeypot.logにも同様のログが記録される。2025-08-07 12:35:56.456 (+0900) 127.0.0.1:49346 POST /admin/login.php 2025-08-07 12:35:56.456 (+0900) 127.0.0.1:49346 CREDENTIALS username(username)= 'root' password(password)= 'password' - ブラウザには常に「Login failed. Please try again.」と表示される
- 返すべき内容がないパスへのアクセスに対しては、常に404 Not Foundを返します。
ハニーポットは様々なフィールド名に対応し、以下のような認証情報を自動的に検出・記録します:
- ユーザー名フィールド:
username,user,usr,login,log,uid,id,account,email,mail - パスワードフィールド:
password,pass,pwd,passwd,secret
認証情報以外の送信データも自動的に記録します:
- CSRFトークン(
csrf,_token,authenticity_token) - ログイン状態保持(
remember,remember_me,keep_logged) - リダイレクト先(
redirect,next,return_url) - その他すべてのフォームデータ
python3 honeypot1.py -p 9000 -a 127.0.0.1 -l custom.log-p, --port: ポート番号の指定-a, --address: 待ち受けアドレスの指定-l, --logfile: ログファイルパスの指定
この手順書は、AWS Lightsail上にUbuntuサーバーを新規に作成し、ローカルPC(Mac)から安全に接続するための設定を行い、ハニーポットのプログラムファイルをサーバーに配置し、最後にポートフォワーディングを設定してハニーポットを稼働させ、後片付け(クリーンアップ)を行うまでの全工程を解説します。
- Lightsailコンソールにアクセスし、「インスタンスの作成」をクリックします。
- 以下の通りに設定します。
- ロケーション: 東京 (ap-northeast-1)など
- プラットフォーム: Linux/Unix
- 設計図: OSのみ → Ubuntu 22.04 LTS
- インスタンスプラン: 最も安価なプラン(例: 月額$3.50)
- インスタンス名:
honeypot-server
- 「インスタンスの作成」をクリックし、起動を待ちます。起動後、パブリックIPアドレスを控えておきます。
- 作成した
honeypot-serverインスタンスの管理画面を開き、「ネットワーキング」タブに移動します。 - 「ファイアウォール」セクションで、以下の3つのルールが有効になっていることを確認します。(SSHはデフォルトで有効です)
- SSH (22): あなたのPCからサーバーに接続するために必要です。
- HTTP (80): 外部からの攻撃を待ち受けるためのポートです。
- カスタム (8080): ハニーポット本体が動作するポートです。(アプリケーション
カスタム、プロトコルTCP、ポート範囲8080で作成)
- Lightsailの「アカウント」ページ → 「SSHキー」タブに移動します。
- デフォルトキーの横にある「ダウンロード」アイコンをクリックし、
LightsailDefaultKey-ap-northeast-1.pemのようなキーファイル(秘密鍵)をダウンロードします。
- ダウンロードしたキーファイルを、安全な
.sshディレクトリに移動させます。Macのターミナルで以下を実行します。mv ~/Downloads/LightsailDefaultKey-ap-northeast-1.pem ~/.ssh/
- キーファイルの権限を、所有者のみが読み取れるように変更します。これは必須のセキュリティ設定です。
chmod 600 ~/.ssh/LightsailDefaultKey-ap-northeast-1.pem
nanoエディタで設定ファイルを開きます。nano ~/.ssh/config- 以下の内容をコピー&ペーストします。
[あなたのサーバーのIPアドレス]の部分は、控えておいたパブリックIPアドレスに書き換えてください。Host honeypot-server HostName [あなたのサーバーのIPアドレス] User ubuntu IdentityFile ~/.ssh/LightsailDefaultKey-ap-northeast-1.pem Ctrl + X→Y→Enterで保存して閉じます。
以下の短いコマンドだけでサーバーに接続できるはずです。
ssh honeypot-server-
SSHでサーバーに接続
ssh honeypot-server
-
システムの更新と必要パッケージのインストール setup.shを実行します。
chmod +x setup.sh ./setup.sh
setup.shは、以下のコマンドを実行します。
sudo apt update && sudo apt upgrade -y sudo apt install python3-pip -y sudo apt install python3-yaml -y -
作業が終わったら
exitでサーバーから切断します。
Macのターミナルから scp コマンドでプログラムと設定ファイルをサーバーに転送します。
※ローカルパスはご自身の環境に合わせて修正してください。 ターミナルのカレントディレクトリを、ハニーポットのプログラムファイルがある場所に移動します。
cd /{path}/honeypot1.py
# プログラムファイルのパスに合わせて変更その後、deploy.shを実行して、サーバーにファイルをアップロードします。
./deploy.sh (.ssh/config/で設定したサーバーのホスト名)実行できない場合は、以下のコマンドを直接実行してください。
# 1. Pythonプログラムをアップロード
scp honeypot1.py honeypot-server:~/
# 2. 設定ファイルをアップロード
scp config.yaml honeypot-server:~/
# 3. 起動スクリプトをアップロード
scp start.sh honeypot-server:~/- 再度SSHでサーバーに接続します。
ssh honeypot-server
- ポート設定の確認(任意)
cat config.yaml # port: 8080 であることを確認 - start.shを実行して、特権ポートをするためのsetcapコマンドの実行を行い、ポートごとに起動します。デフォルトでは80,8080,8443を使用します。
chmod +x start.sh sudo ./start.sh
- 手動でポートフォワーディングを使用する場合は、以下の設定を行ってください。
(例)ポート80へのアクセスを8080へ転送するルールを設定
sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
- 手動で起動する場合は以下のコマンドを実行します。
ハニーポットをバックグラウンドで起動
nohup python3 honeypot1.py & exitでサーバーから切断しても、ハニーポットは動き続けます。- 終了する時
sudo pkill -f honeypot1.py
- 実行中のハニーポットを停止
ps aux | grep python kill [プロセスID]
- ポートフォワーディング設定の削除
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
- Lightsailインスタンスの完全削除
- Lightsailのコンソールでインスタンスのメニュー(︙)から「削除」を選択