あなたは最初のサーバーを起動し、アプリケーションをデプロイしました。美しい。しかし、ある日ログを開くと、まるで別の惑星からのメッセージのように見える何百もの行が表示されます。この人たちは誰ですか?WordPressもないのに、なぜ誰かが/wp-login.phpをノックするのでしょうか?そして、午前3時のPOSTリクエストとは何でしょうか?一緒に見ていきましょう。

🔍ログファイルの構造
Nginxアクセスログから典型的な行を取得します。
access.log
185.220.101.42 - - [15/Feb/2026:03:14:22 +0300] "GET /admin HTTP/1.1" 404 162 "-" "Mozilla/5.0"細かく分析してみましょう。
185.220.101.42— リクエストを行ったユーザーのIPアドレス[15/Feb/2026:03:14:22]— 日時GET /admin HTTP/1.1— メソッド、パス、プロトコル404— 応答コード(ページが見つかりません)162— バイト単位の応答サイズMozilla/5.0— ユーザーエージェント(ブラウザまたはボット)
無害に見えますか?それでは、1つのIPから1分間に1000行のようなものが送られてくることを想像してみてください。そして、それらすべてが異なる方法でノックしています。ここからが面白いところです。
🚩 赤い旗:攻撃の兆候
1 ディレクトリのブルートフォース攻撃
ボットは、何か興味深いものに出会うことを期待して、標準的なパスを並べ替えます。
185.220.101.42 GET /admin 404185.220.101.42 GET /wp-admin 404185.220.101.42 GET /phpmyadmin 404185.220.101.42 GET /.env 403185.220.101.42 GET /backup.sql 404185.220.101.42 GET /.git/config 200 ⚠️ НАШЁЛ!⚠️ 危険
もし404エラーが点滅している場合 200 — 何かが本当に利用可能であることを意味します。ファイル .env, .git/config, backup.sql 一度もない サーバーから返されないようにする必要があります。
2 ブルートフォース認証
何十回ものログイン試行に失敗しました。誰かがパスワードを試行しています。
POST /login 401POST /login 401POST /login 401POST /login 401POST /login 200 ⚠️ ПОДОБРАЛ ПАРОЛЬ!1つのIPから連続して多くの401/403
高頻度で
/login、/auth、/api/tokenに POST異なる「ユーザー」で同じユーザーエージェント
夜間または週末にリクエストが行われる
3 URLへのSQLインジェクション
攻撃者はデータベースへの要求を「破壊」しようとします。
GET /products?id=1' OR '1'='1
GET /search?q=admin'--
GET /user?name='; DROP TABLE users;--パラメータにOR 1=1、引用符、--、UNION SELECT、DROP TABLEが点滅している場合、それはそれです。
4 XSS試行
ユーザー入力による悪意のある JavaScript の実装:
GET /search?q=<script>alert('xss')</script>
GET /comment?text=<img src=x onerror=alert(1)>パラメータのタグ <script>、ハンドラ onerror、onload は、このジャンルの定番です。
5 疑わしいユーザーエージェント
通常のユーザーエージェントはブラウザです。しかし、これらのものは疑問を生じさせます。
sqlmap/1.5 ← сканер SQL-инъекцийnikto/2.1.6 ← сканер уязвимостейpython-requests/2.28.0 ← скрипт на Python() { :; }; /bin/bash -c "..." ← Shellshock-эксплойт!
⚡分析に役立つコマンド
ログを1行ずつ読む必要はありません。時間を節約できるコマンドのセットは次のとおりです。
bash
# クエリ数の上位20のIP awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# すべての失敗した認証(401/403)grep -E '"(401 | 403)'access.log
# Search for SQL injections in parametersgrep -iE "1=1)" access.logパラメータでのSQLインジェクションの検索
# Search for XSS attemptsgrep -iE "pt|onerror|onload|javascript:)" access.log
# Requests to dangerous filesgrep -iE "|bak|config|yml|git)" access.log
# 午前1時から5時までのアクティビティawk -F'[/: ]' '$7 >= 1 && $7 <= 5' access.log | head -50🛡️ 怪しいものを見つけたときの対処法
IPをブロックする 明らかな攻撃が見られる場合は、
iptables、ufwまたは Nginx レベルで禁止します。fail2banの設定 N 回の試行に失敗した後、IP を自動的に禁止します。15分で設定でき、あらゆる種類の攻撃から保護します。
エンドポイントを確認する 機密ファイルがアクセスできないこと、フォームがレート制限で保護されていること、入力がエスケープされていることを確認してください。
アラートを設定する 異常が発生したときに通知を送信するシンプルなcronスクリプトは、プロジェクト全体を保存できます。
nginx.conf
# Nginxdeny 185.220.101.42レベルでのIPブロック。
# 非表示ファイルへのアクセスを禁止するlocation ~ /\. {
deny all;
return 404;
}bash
# ファイアウォールによるブロックsudo ufw deny from 185.220.101.42🚀 スキルをレベルアップすることが最高の防御
ログを読む能力は、練習を重ねることで身につくスキルです。開発者として体系的に成長し、すべてがどのように機能するかを理解したい場合は、こちらをご覧ください。
「コディック」アプリケーション — 実践を通じてプログラミングを学ぶプラットフォーム。単なる理論ではなく、理解を深めるための実際のタスク。
そして私たちの Telegramコミュニティ 開発の世界からの役立つ投稿、分析、ライフハックが定期的に公開されます。朝のコーヒーを飲みながら読んで、携帯電話から直接知識を強化しましょう。
ログはサーバーのブラックボックスです。ログを読み解くことができれば、誰がアクセスしたか、何をしたか、そして心配すべきかどうかを常に把握することができます。
安全性は製品ではなく、プロセスです。
そして、それはログから始まります。
