1. 導入
IPAが公開する『情報セキュリティ10大脅威 2023』において、組織編の第1位は「ランサムウェアによる被害」、第2位は「サプライチェーンの弱点を悪用した攻撃」でした。これらは単なるウイルス対策ソフトの導入だけでは防ぎきれない高度な脅威です。特に攻撃者は、防御の薄いネットワークの境界や、信頼関係にあるパートナー企業の接続ポイントを狙ってきます。本稿では、これらの脅威を早期に検知し、被害を最小限に抑えるための「ログ監視の自動化」という技術的アプローチを解説します。
2. 基礎知識
ランサムウェアは、データを暗号化して身代金を要求するマルウェアです。一方、サプライチェーン攻撃は、ターゲット企業を直接攻撃するのではなく、セキュリティの甘い関連会社やツール提供元を経由して侵入する手口です。これらの防御には「侵入される前提」の備えが必要です。特に、サーバーの不審なログイン履歴や、大量のファイル操作ログを監視することは、インシデントの初期段階(偵察や横展開)を見抜くために不可欠です。
3. 実装/解決策
実務では、すべてのログを目視で確認することは不可能です。そのため、Pythonなどのスクリプトを用いて、特定のしきい値を超えた異常な動作を自動的にアラートとして通知する仕組みを構築します。
具体的には、以下の手順で監視を強化します。
・認証ログ(ログイン失敗回数)の監視:ブルートフォース攻撃を検知。
・ファイル操作ログの監視:短時間に大量のファイルが暗号化(変更)されていないか検知。
・特定IPからのアクセス監視:VPN経由の不正なアクセス元を特定。
4. サンプルプログラム
以下のコードは、サーバーのログイン失敗ログを解析し、短時間に一定回数以上の失敗があった場合に警告を出す簡単なサンプルです。
import re
from collections import defaultdict
import datetime
ログファイルからログイン失敗を抽出して検知する関数
def detect_brute_force(log_file_path, threshold=5):
# 失敗回数を格納する辞書
failed_attempts = defaultdict(int)
# 警告対象のIPリスト
alerts = []
with open(log_file_path, ‘r’) as f:
for line in f:
# ログから「Failed password」という文字列が含まれる行を抽出(SSHログを想定)
if “Failed password” in line:
# 正規表現でIPアドレスを抽出
match = re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})’, line)
if match:
ip = match.group(1)
failed_attempts[ip] += 1
# しきい値を超えたIPを特定
for ip, count in failed_attempts.items():
if count >= threshold:
alerts.append(f”警告: IP {ip} から {count} 回のログイン失敗を検知しました。”)
return alerts
実行例
実際の環境では /var/log/auth.log 等を指定
print(detect_brute_force(‘auth.log’))
5. 応用・注意点
ログ監視を実装する際に注意すべき点は、「誤検知(False Positive)」への対応です。例えば、社内システムの自動化ジョブが誤って大量の認証失敗を引き起こすケースなどが考えられます。
・ホワイトリスト運用:社内の正規の管理IPアドレスを監視対象から除外する設定を必ず組み込んでください。
・ログの集約:SIEM(セキュリティ情報イベント管理)ツール等の導入が難しい環境では、まずは重要なサーバーのログを別サーバーへ転送(Syslogなど)し、改ざん耐性を確保することが重要です。
「10大脅威」を他人事とせず、まずは自社の環境で「何が起きているか」を可視化する準備から始めてみてください。

コメント