Apacheを利用しているWebサーバーでは、不正アクセスや攻撃を未然に防ぐために、特定のIPアドレスのアクセスを監視することが重要です。特に、同一IPからの大量のアクセスやブルートフォース攻撃は、早期に検知して対応する必要があります。
本記事では、Apacheのアクセスログを活用して、特定のIPアドレスからのアクセス試行回数を監視する方法について詳しく解説します。ログの解析方法から、スクリプトを使った自動監視、アクセス制限の設定まで、一連の手順をステップバイステップで紹介します。これにより、不審なアクセスを迅速に検知し、セキュリティ対策を強化できるでしょう。
初心者でも簡単に実装できる方法を中心に解説しますので、ぜひ最後までご覧ください。
Apacheのアクセスログの仕組み
Apacheは、すべてのクライアントからのリクエストを「アクセスログ」に記録します。これにより、どのIPアドレスが、いつ、どのリソースにアクセスしたのかを把握できます。アクセスログは、サーバーの運用状況やセキュリティを監視する上で欠かせない情報源です。
アクセスログの保存場所
Apacheのデフォルト設定では、アクセスログは以下のパスに保存されます。
- CentOS / RHEL:
/var/log/httpd/access_log
- Ubuntu / Debian:
/var/log/apache2/access.log
Apacheの設定ファイル(httpd.conf
または apache2.conf
)内で、CustomLog
ディレクティブを使用することでログの出力先を変更できます。
例:
CustomLog /var/log/apache2/custom_access.log combined
ログフォーマットの理解
ApacheのログフォーマットはLogFormat
ディレクティブで定義されます。最も一般的なのが「combinedフォーマット」です。
ログの例:
192.168.1.10 - - [04/Jan/2025:14:23:05 +0000] "GET /index.html HTTP/1.1" 200 5123 "https://example.com" "Mozilla/5.0"
各項目の意味:
- 192.168.1.10: アクセスしたIPアドレス
- [04/Jan/2025:14:23:05 +0000]: アクセス日時
- “GET /index.html HTTP/1.1”: リクエスト内容
- 200: ステータスコード(成功)
- 5123: 応答サイズ(バイト)
- “https://example.com”: リファラー(参照元)
- “Mozilla/5.0”: ユーザーエージェント
特定IPアドレスのログ抽出
特定のIPアドレスのアクセス記録を確認するには、以下のようにgrep
コマンドを使用します。
grep "192.168.1.10" /var/log/apache2/access.log
これにより、該当IPアドレスがアクセスしたすべてのログを抽出できます。
IPアドレスごとのアクセス回数の集計方法
Apacheのアクセスログから特定のIPアドレスが何回アクセスしているかを確認することは、攻撃や異常なトラフィックを検知するために役立ちます。以下では、ログから特定のIPアドレスのアクセス回数を集計する方法を紹介します。
基本的な集計コマンド
以下のコマンドを使うことで、特定のIPアドレスがアクセスした回数を簡単に集計できます。
grep "192.168.1.10" /var/log/apache2/access.log | wc -l
grep "192.168.1.10"
: 特定のIPアドレスを含むログを抽出wc -l
: 抽出した行数(アクセス回数)をカウント
例:
192.168.1.10 は 56 回アクセスしています
すべてのIPアドレスのアクセス回数を一覧表示
すべてのIPアドレスのアクセス回数を確認したい場合は、以下のコマンドを使用します。
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr
awk '{print $1}'
: ログの1列目(IPアドレス)を抽出sort
: IPアドレスをソートuniq -c
: 重複するIPアドレスをカウントsort -nr
: カウント順に降順ソート
出力例:
120 192.168.1.15
56 192.168.1.10
45 192.168.1.20
最もアクセスが多いIPアドレス順に表示されます。
特定期間のログを集計
期間を指定して集計する場合は、sed
やawk
を使います。
awk '/04\/Jan\/2025/ {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr
このコマンドでは、2025年1月4日のログだけを集計します。特定の日付や時間帯のアクセス解析が可能です。
アクセス回数が一定数を超えたIPの抽出
100回以上アクセスしているIPを抽出する方法も簡単です。
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | awk '$1 > 100'
これにより、不審なアクセスが集中しているIPアドレスを迅速に特定できます。
特定IPアドレスをフィルタリングして監視する方法
特定のIPアドレスを対象にしてアクセスログを監視することで、不審なアクティビティを素早く検出できます。Apacheのログファイルは膨大になることがあるため、特定のIPアドレスだけを抽出して監視するフィルタリング手法は効果的です。
リアルタイムで特定IPのログを監視
特定のIPアドレスをリアルタイムで監視する場合は、tail
とgrep
を組み合わせて使用します。
tail -f /var/log/apache2/access.log | grep "192.168.1.10"
tail -f
: ログファイルの末尾に追従して出力grep "192.168.1.10"
: 指定したIPアドレスのログだけを表示
これにより、リアルタイムで特定IPアドレスのアクセスがあれば即座に確認できます。
複数IPアドレスの同時監視
複数のIPアドレスを同時に監視したい場合は、egrep
を使って複数条件を指定します。
tail -f /var/log/apache2/access.log | egrep "192.168.1.10|192.168.1.11|192.168.1.12"
|
で区切ることで、複数のIPアドレスを並列で監視できます。
特定の条件でフィルタリング
特定のリソース(例: 管理画面やログインページ)へのアクセスをフィルタリングする方法も有効です。
tail -f /var/log/apache2/access.log | grep "192.168.1.10" | grep "/admin"
これにより、特定IPから管理画面へのアクセスだけを監視できます。
一定時間ごとに特定IPを監視するスクリプト
以下のスクリプトは、5分ごとに特定IPアドレスのアクセス回数をチェックします。
#!/bin/bash
IP="192.168.1.10"
LOG="/var/log/apache2/access.log"
COUNT=$(grep "$IP" $LOG | wc -l)
echo "$(date): $IP アクセス回数: $COUNT" >> /var/log/ip_monitor.log
- スクリプトを
/usr/local/bin/ip_monitor.sh
として保存し、実行権限を付与します。
chmod +x /usr/local/bin/ip_monitor.sh
- 定期的に実行するには、
cron
ジョブを追加します。
*/5 * * * * /usr/local/bin/ip_monitor.sh
これにより、特定IPアドレスのアクセス回数を定期的に記録できます。
大量アクセスがあった場合の通知設定
アクセス回数が一定以上になった場合に通知するスクリプト例です。
#!/bin/bash
IP="192.168.1.10"
LOG="/var/log/apache2/access.log"
THRESHOLD=100
COUNT=$(grep "$IP" $LOG | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
echo "$IPが $COUNT 回アクセスしています" | mail -s "警告: 高頻度アクセス検知" admin@example.com
fi
これにより、設定したしきい値を超えるアクセスがあればメールで通知されます。
自動的にログ監視を行うスクリプトの作成
特定のIPアドレスが異常なアクセスをしていないかを自動的に監視するために、シェルスクリプトを作成して定期的にログを解析する方法を解説します。しきい値を超えた場合に通知やブロックを行うことで、サーバーのセキュリティを強化できます。
シンプルなログ監視スクリプト
以下のスクリプトは、特定のIPアドレスのアクセス回数を集計し、しきい値を超えた場合に警告を出します。
#!/bin/bash
LOGFILE="/var/log/apache2/access.log"
TARGET_IP="192.168.1.10"
THRESHOLD=100
ALERT_LOG="/var/log/ip_alert.log"
# アクセス回数の集計
COUNT=$(grep "$TARGET_IP" $LOGFILE | wc -l)
# しきい値を超えた場合の処理
if [ $COUNT -gt $THRESHOLD ]; then
echo "$(date): 警告 - $TARGET_IP が $COUNT 回アクセスしています" >> $ALERT_LOG
echo "IP $TARGET_IP の異常なアクセスを検知しました。現在の回数: $COUNT"
fi
スクリプトの説明
LOGFILE
:解析対象のApacheログファイルTARGET_IP
:監視対象のIPアドレスTHRESHOLD
:アクセスのしきい値ALERT_LOG
:警告を記録するログファイル
しきい値を超えるとip_alert.log
に記録され、ターミナルにも警告が表示されます。
複数IPを監視するスクリプト
複数のIPアドレスを監視する場合は、IPアドレスをリストにしてループ処理を行います。
#!/bin/bash
LOGFILE="/var/log/apache2/access.log"
IP_LIST=("192.168.1.10" "192.168.1.20" "192.168.1.30")
THRESHOLD=100
ALERT_LOG="/var/log/ip_alert.log"
for IP in "${IP_LIST[@]}"; do
COUNT=$(grep "$IP" $LOGFILE | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
echo "$(date): 警告 - $IP が $COUNT 回アクセスしています" >> $ALERT_LOG
echo "IP $IP の異常なアクセスを検知しました。現在の回数: $COUNT"
fi
done
このスクリプトでは、配列IP_LIST
に複数のIPアドレスを指定し、それぞれのアクセス回数を監視します。
スクリプトの自動実行設定
スクリプトを定期的に実行するにはcron
を使用します。
- スクリプトに実行権限を付与します。
chmod +x /usr/local/bin/ip_monitor.sh
cron
ジョブを設定します。
crontab -e
以下を追加し、5分ごとにスクリプトを実行するよう設定します。
*/5 * * * * /usr/local/bin/ip_monitor.sh
通知を追加する
しきい値を超えた場合にメールで通知する機能を追加できます。
if [ $COUNT -gt $THRESHOLD ]; then
echo "$IP が $COUNT 回アクセスしました。" | mail -s "高頻度アクセス警告" admin@example.com
fi
これにより、異常なアクセスをリアルタイムで検知し、迅速に対応できます。
アラート通知システムの導入
特定のIPアドレスが一定回数以上アクセスした場合に、メールやSlackで自動通知を送る仕組みを導入することで、異常なアクセスを即座に把握できます。これにより、不正アクセスや攻撃を迅速に検知し、セキュリティ対応が強化されます。
メールでアラート通知を送る方法
メールを使った通知はシンプルで、すぐに実装可能です。以下のスクリプトを使えば、しきい値を超えたアクセスがあった際に自動で警告メールが送信されます。
#!/bin/bash
LOGFILE="/var/log/apache2/access.log"
TARGET_IP="192.168.1.10"
THRESHOLD=100
COUNT=$(grep "$TARGET_IP" $LOGFILE | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
SUBJECT="【警告】$TARGET_IP からの高頻度アクセス検知"
MESSAGE="$TARGET_IP が $COUNT 回アクセスしました。確認をお願いします。"
echo "$MESSAGE" | mail -s "$SUBJECT" admin@example.com
fi
必要な環境設定
mail
コマンドが使用できるように、mailutils
やpostfix
などのメール送信ツールをインストールしておく必要があります。- Debian/Ubuntu系の場合:
sudo apt update
sudo apt install mailutils
- CentOS/RHEL系の場合:
sudo yum install mailx
Slackでアラートを送信する方法
Slackはリアルタイム通知に便利です。Webフックを使って簡単にApacheのログ監視スクリプトと連携できます。
SlackのWebフックURLを取得
- Slackの「Incoming Webhooks」アプリを追加します。
- 通知を送るチャンネルを選択し、WebフックURLを取得します。
- WebフックURL例:
https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZ
Slack通知スクリプト
#!/bin/bash
LOGFILE="/var/log/apache2/access.log"
TARGET_IP="192.168.1.10"
THRESHOLD=100
WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZ"
COUNT=$(grep "$TARGET_IP" $LOGFILE | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
MESSAGE="$TARGET_IP が $COUNT 回アクセスしました。確認してください。"
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$MESSAGE\"}" $WEBHOOK_URL
fi
スクリプトの説明
curl
を使用してSlackのWebフックURLにJSON形式でメッセージを送信します。- しきい値を超えた場合、指定のチャンネルに通知が送られます。
スクリプトの自動実行設定
このSlack通知スクリプトをcron
に登録して自動的に実行することで、ログ監視を継続的に行えます。
- 実行権限を付与します。
chmod +x /usr/local/bin/slack_alert.sh
cron
ジョブを追加します。
*/5 * * * * /usr/local/bin/slack_alert.sh
複数IPを監視する場合
複数のIPアドレスを監視する場合は、IPリストを配列にしてループ処理を追加します。
IP_LIST=("192.168.1.10" "192.168.1.20" "192.168.1.30")
for IP in "${IP_LIST[@]}"; do
COUNT=$(grep "$IP" $LOGFILE | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
MESSAGE="$IP が $COUNT 回アクセスしました。"
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$MESSAGE\"}" $WEBHOOK_URL
fi
done
これで、複数IPを同時に監視し、Slackで異常なアクセスを通知するシステムが構築できます。
アクセス制限ルールの設定
特定のIPアドレスからの不正なアクセスや攻撃が続く場合は、Apacheの設定を変更してアクセス自体を制限することが効果的です。Apacheでは.htaccess
ファイルやhttpd.conf
を使って特定IPをブロックするルールを簡単に設定できます。
特定のIPアドレスをブロックする方法
.htaccessを使用したIPブロック
サイト全体または特定のディレクトリで特定のIPアドレスを拒否するには、.htaccess
ファイルを使用します。
Order Allow,Deny
Deny from 192.168.1.10
Allow from all
- Order Allow,Deny:デフォルトで全て許可し、特定のIPを拒否します。
- Deny from:ブロックするIPアドレスを指定します。
複数のIPアドレスをブロックする場合は以下のように記述します。
Order Allow,Deny
Deny from 192.168.1.10
Deny from 192.168.1.20
Deny from 203.0.113.5
Allow from all
サブネット単位でのブロック
特定の範囲(サブネット)をブロックしたい場合は、CIDR表記を用います。
Deny from 192.168.1.0/24
これにより、192.168.1.0
から 192.168.1.255
までのIPがブロックされます。
httpd.confでIPアドレスをブロックする
Apacheのメイン設定ファイル(httpd.conf
やapache2.conf
)で直接IPをブロックする方法もあります。
<Directory "/var/www/html">
Order Allow,Deny
Deny from 192.168.1.10
Allow from all
</Directory>
この方法は、サーバー全体や特定のディレクトリ単位で適用できます。
特定のファイルやURLにアクセス制限を設定
管理画面など重要なファイルへのアクセスを特定のIPアドレスだけに制限することも可能です。
<Location /admin>
Order Deny,Allow
Deny from all
Allow from 203.0.113.5
</Location>
- Deny from all:デフォルトですべてのIPを拒否
- Allow from:許可するIPアドレスのみ管理画面にアクセス可能
特定の国からのアクセスをブロック
国単位でのブロックはGeoIP
モジュールを使用します。
- GeoIPモジュールをインストールします。
sudo apt install libapache2-mod-geoip
- Apacheの設定ファイルに以下を追加します。
GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
Deny from env=BlockCountry
これにより、中国(CN)からのアクセスをブロックします。
アクセス制限の動作確認
設定を反映した後、Apacheを再起動して動作を確認します。
sudo systemctl restart apache2
制限されたIPアドレスからアクセスを試み、403 Forbidden
エラーが表示されることを確認してください。
一時的なアクセス解除方法
一時的にIPアドレスの制限を解除したい場合は、#
でコメントアウトして設定を無効化できます。
#Deny from 192.168.1.10
Apacheを再起動すればアクセスが許可されます。
このように、Apacheでは簡単な設定で柔軟にアクセス制限を設けることができ、サーバーを守る重要な手段となります。
まとめ
本記事では、Apacheで特定のIPアドレスのアクセスを監視し、不正なアクセスや攻撃を検知・対処する方法について解説しました。
Apacheのアクセスログを利用して、特定のIPアドレスのアクセス回数を集計・監視し、自動的にアラートを送る仕組みを導入することで、サーバーのセキュリティを大幅に強化できます。
さらに、アクセス制限ルールを設定することで、疑わしいIPアドレスからのアクセスを事前にブロックし、システムを守ることが可能です。
これらの手法を活用し、定期的にログを監視・分析することで、不正アクセスの兆候を早期に発見し、サーバーの安定稼働を維持しましょう。
コメント