
dns-honeypot
観測可能性ツールに日々没頭しているエンジニアとして、たまにどうしても試したくなるアイデアが浮かびます。これもそうした実験の一つです:誰も広告していないクリーンなIP上でDNSリゾルバを立ち上げ、インターネットに好き勝手に話しかけさせます。リゾルバの唯一の仕事は、静かに待機し、すべてをログに記録し、結果のクエリをGrafanaに送り込むことです。docker compose up -d を実行しただけで、Unbound、Loki、Prometheus、Grafana、Traefikがライブトラフィックを追跡し、好奇心、設定ミス、時折のスキャナーのヒストグラムを表示してくれました。このREADMEは、その最初の24時間のレポートであり、スタックが何を捉えているか、なぜそれが私にとって重要なのか、そして現在のセキュリティ状況について何を浮き彫りにしているかを示しています。
私は意図的に自分の側から一切のシグナルを導入しませんでした。パケットドロップも、調整された応答も、緩和策もありません。ログを有効にしたUnbound、ログファイルを追跡するLoki、エクスポーターメトリクスをスクレイピングするPrometheus、GrafanaをフロントエンドにするTraefik、それらを結びつけるDocker Composeだけです。リゾルバは、私が見つけた驚くほど「クリーン」なIPv4アドレス94.130.27.226に配置し(ノイズ前のベースラインを知りたい場合はhttps://www.abuseipdb.com/check/94.130.27.226でステータスを確認してください)、世界に好き放題させました。一台のラップトップで全てのパネルを監視でき、刺激を与えたいときは tools/dns_query_storm.sh を起動し、その後ノイズが世界のインターネットが送る任意のパターンに落ち着くのを待ちました。
それらのダッシュボードは https://dns.cybersafeintl.co.uk/public-dashboards/eb554b5b74e14f4d95e376c0033ee83d でライブで覗くことができますが、スタック内で最も低スペックなサーバーで動作しているため、クエリが多いときはリフレッシュが遅くなる可能性があります。
unbound_total_num_queries メトリクスをスクレイピングするため、「スループット(QPS、5分レート)」パネルは毎秒のクエリ数を表示し、ソース別に分類します。このビューは「誰がリゾルバを叩いているのか?」という質問に答え、突然のスパイクはバングラデシュまたはポーランド拠点のASNを直接指し示し、ログからはSERVFAIL/NXDOMAINストームがバーストに伴っているかどうかを簡単に確認できます。client_ip でグループ化し、ダッシュボードは既にすべてを topk(sort_desc(...)) でラップしています。これによりパネルはすっきりと保たれ、エクスポータースクリプトを使用して同じクエリをCSVにダンプし、オフライン分析、レポート、再現可能なストーリーに活用できます。最初のキャプチャでは、45.179.* と 45.6.* のレンジにある5つのIPアドレスが5分間でそれぞれ5k以上のクエリを発射しており、スキャナーファームか攻撃的なクライアントである可能性があります。qname の人気を表示します。5分のスナップショットでは scb.se、dhl.com、cmu.edu が、24時間のエクスポートでは cbs.nl、scb.se、atlassian.com、abb.com、up.pt が含まれていました。なぜこれらのドメインなのか?それが興味深い点です。これらは正当なサービス、設定ミスのリゾルバ、または期限切れレコードを追う日和見スキャナーでしょうか?理論があれば教えてください。表示されているすべてのパネルには、exports/ ディレクトリに対応するCSVがあります。ブログ記事やインシデントレポートに生のストーリーを添付したい場合は、それらをまとめてください (zip -r exports.zip exports/)。
docker-compose.yml は、単一のコマンドでUnbound、Unboundエクスポーター、Loki + Promtail、Prometheus、Grafana、Traefikを起動します。unbound/ はリゾルバの設定とログを保存します。TTL制御、serve-expired、キャッシュ設定により、クライアントが実際に何を尋ねているかを忠実にキャプチャします。prometheus/、loki/、grafana/ ディレクトリにはデータとプロビジョニングファイルが保存され、メトリクスとダッシュボードが再起動後も保持されます。grafana/dashboards/unbound-traffic-insights.json は、表示されているビューで事前プロビジョニングされています。すべてのPromQL/Lokiクエリはすでに集計およびソートされており、パネルを読みやすく保っています。tools/dns_query_storm.sh を使用すると、反応時間をテストする必要があるときにクエリストームをシミュレートできます。redeploy.sh は、スタック全体をダウンさせ、アップデートをプルし、再構築する作業を単一のスクリプトで自動化します。export_dashboard_data.py は、ダッシュボードJSONをウォークスルーし、各Prometheus/Lokiクエリを実行し、サニタイズされたCSVファイルを exports/ ディレクトリに書き出して共有できるようにします。
cd hetzner_deploy/unbound-dnscp .env.example .env を実行し、GRAFANA_DOMAIN、Grafana管理者認証情報、LETSENCRYPT_EMAIL、必要なTLSオーバーライドを設定します。sudo chown -R 472:472 grafana-data && sudo mkdir -p prometheus/data && sudo chown -R 65534:65534 prometheus/datadocker compose build && docker compose up -dpip install requests を実行します(エクスポーターは純粋なPythonです)。python export_dashboard_data.py --duration 24h --outdir exports/24h --timeout 90 を実行して、すべてのダッシュボードクエリを取得し、CSVに変換して、結果を exports/24h の下に配置します。zip -r exports.zip exports/ を実行して、公開前、ブログ記事への添付、または共同作業者への送信のために生のテーブルをまとめます。--duration 6h や --end タイムスタンプを指定して再実行するか、ドメインパネルのみが必要な場合は --filter domains を使用します。scb.se、dhl.com、cmu.edu、up.pt、utc.fr がそれぞれ数十万のルックアップを生成しました。なぜこれらのターゲットなのか?欧州企業のドメイン群から、CDN、リストアサービス、または古いキャッシュを再水和しようとするスキャナーが疑われます。cbs.nl、scb.se、atlassian.com、abb.com、up.pt が合計で2億5千万以上のクエリを生成しました。この量はランダムノイズではなく、大規模なクライアントか、決して解決を止めない持続的なアプライアンスのいずれかです。45.179.* および 45.6.* のIPv4アドレスで、観測された5分間でそれぞれ5k以上のクエリを発射していました。これらはISPまたはスキャンファームの一部かもしれませんが、いずれにせよ、ダッシュボードはその追跡を簡単にしています。これが何を浮き彫りにするのか?それは、露出したDNSインフラストラクチャが、広告されていなくても興味深いトラフィックの受動的なフィードになり得ることを示しています。インターネットは質問を投げかけ続け、このセットアップは単に注意深く耳を傾けます。この実験が私のより広い仕事にどのように適合するか興味があれば、他のリポジトリをチェックしてください。時々このようなアイデアを実行して、それがどこに導くかを見なければなりません。
exports/ フォルダをZip圧縮するか、CSVを直接ストーリーを語る場所に添付してください。export_dashboard_data.py やLokiクエリを拡張して、追加のメタデータ(クライアントASN、SERVFAIL理由、国)を組み込み、より深い質問に答えます。--duration 12h、--end ...)でエクスポーターを再実行し、出力をタイムスタンプ付きディレクトリに保存し、このREADMEを最新の統計で更新して、プロットを最新に保ちます。自身のハニーポットで追跡している場合は、このREADMEをエクスポートの統計で更新し、ストーリーを比較し、同じサイトやクライアントが戻ってくるかどうかを確認しましょう。
このプロジェクトは「現状のまま」提供されます。商品性、特定目的への適合性、非侵害性を含むがこれらに限定されない、明示または黙示のいかなる保証もなく、その使用から生じるいかなる損害についても責任を負いません。このスタックのデプロイ、設定、運用に関連するすべてのリスクはお客様が負うものとします。
このプロジェクトが役立つと思われたら、サポートをご検討ください:
| 通貨 | アドレス |
|---|---|
| Bitcoin (BTC) | 3QjWqhQbHdHgWeYHTpmorP8Pe1wgDjJy54 |
| Ethereum (ETH) | 0x5851e6145F4773d1585b8686095FB16E368a4dA1 |
| ZCash (ZEC) | t1KSR5YkNPbjqRSCoLKo5AddFWdm9Kzxh1B |