ネットワークセキュリティ基礎から実践まで第9編:セキュリティモニタリングとログ分析
Network Security Series Part 9: Security Monitoring and Log Analysis
序論:セキュリティモニタリングの重要性
ネットワークセキュリティにおいて「見えないものは守れない」という言葉があります。どんなに強力なファイアウォールと侵入検知システムを備えていても、リアルタイムで何が起きているかを把握できなければ、セキュリティインシデントに効果的に対応することはできません。セキュリティモニタリングとログ分析は、組織のセキュリティ態勢を維持し、脅威に迅速に対応するための核心的な能力です。
この第9編では、様々なログの種類と集中ログ管理システムの構築方法、ELK Stackを活用したログ分析プラットフォームの構成、SIEM(Security Information and Event Management)の概念と活用、そして異常検知と脅威インテリジェンスの活用方法について学びます。
1. ログの種類と重要性
1.1 システムログ(System Logs)
システムログはオペレーティングシステムレベルで発生するすべてのイベントを記録します。Linuxシステムでは/var/log/ディレクトリに保存され、Windowsではイベントビューアーを通じて確認できます。
- /var/log/syslog(または/var/log/messages):システム全体のメッセージとイベント
- /var/log/auth.log:認証関連イベント(ログイン試行、sudo使用など)
- /var/log/kern.log:カーネルレベルメッセージ
- /var/log/dmesg:起動時のハードウェアおよびドライバーメッセージ
- /var/log/cron:cronジョブの実行記録
# リアルタイムログモニタリング
tail -f /var/log/auth.log
# 特定パターンの検索
grep "Failed password" /var/log/auth.log
# 最近のログイン失敗試行を確認
lastb | head -20
1.2 アプリケーションログ(Application Logs)
アプリケーションログは各サービスやアプリケーションが生成するログです。Webサーバー、データベース、メールサーバーなど、各サービスごとに固有のログ形式を持っています。
- Apache/Nginxアクセスログ:Webリクエスト記録
- Apache/Nginxエラーログ:エラーおよび警告メッセージ
- MySQL/PostgreSQLログ:クエリ実行およびエラー
- アプリケーション独自のログ:ビジネスロジック関連イベント
# Nginxアクセスログ形式の例
# 192.168.1.100 - - [22/Jan/2026:10:15:32 +0900] "GET /api/users HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."
# アクセス頻度の高いIPを確認
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# HTTPステータスコード別統計
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
1.3 セキュリティログ(Security Logs)
セキュリティログはセキュリティ関連イベントを専門的に記録します。ファイアウォール、IDS/IPS、アンチウイルスなどのセキュリティ機器やソフトウェアが生成します。
- ファイアウォールログ:許可/ブロックされた接続記録
- IDS/IPSログ:検知された攻撃試行
- 監査ログ(Audit Log):システム変更事項の追跡
- VPNログ:リモートアクセス記録
# Linux auditdログの確認
ausearch -m USER_LOGIN -ts today
# iptablesログの確認(ロギングが設定されている場合)
grep "iptables" /var/log/syslog
# SELinux拒否ログの確認
ausearch -m avc -ts recent
1.4 ネットワークログ(Network Logs)
ネットワークログはネットワークトラフィックと接続情報を記録します。ルーター、スイッチ、プロキシサーバーなどで生成されます。
- NetFlow/sFlow:ネットワークトラフィックフローデータ
- DNSクエリログ:ドメイン照会記録
- DHCPログ:IP割り当て記録
- プロキシログ:Webトラフィック記録
2. 集中ログ管理システム
2.1 rsyslogを活用した集中ロギング
rsyslogはLinuxシステムで最も広く使用されているシステムロギングデーモンです。リモートログ収集とフィルタリング機能を提供します。
# 集中ログサーバー設定(/etc/rsyslog.conf)
# UDP 514ポートでリモートログを受信
$ModLoad imudp
$UDPServerRun 514
# TCP 514ポートでリモートログを受信(より安定的)
$ModLoad imtcp
$InputTCPServerRun 514
# リモートホスト別にログを分離保存
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# クライアント設定(/etc/rsyslog.conf)
# すべてのログをリモートサーバーに送信(TCP)
*.* @@192.168.1.10:514
# 特定のfacilityのみ送信
auth,authpriv.* @@192.168.1.10:514
kern.* @@192.168.1.10:514
2.2 syslog-ngを活用した高度なログ管理
syslog-ngはrsyslogよりも柔軟な設定とフィルタリング機能を提供します。複雑なログルーティングとパースが必要な環境に適しています。
# syslog-ngサーバー設定(/etc/syslog-ng/syslog-ng.conf)
@version: 3.35
source s_network {
tcp(ip("0.0.0.0") port(514));
udp(ip("0.0.0.0") port(514));
};
destination d_hosts {
file("/var/log/remote/$HOST/$PROGRAM.log"
create-dirs(yes)
dir-perm(0755)
perm(0644));
};
filter f_security {
facility(auth, authpriv) or
match("attack" value("MESSAGE")) or
match("failed" value("MESSAGE"));
};
log {
source(s_network);
filter(f_security);
destination(d_hosts);
};
2.3 ログ保持ポリシー
ログ保持ポリシーは規制遵守とストレージ管理の観点から重要です。logrotateを活用して自動化できます。
# /etc/logrotate.d/security-logs
/var/log/remote/*/*.log {
daily
rotate 90
compress
delaycompress
missingok
notifempty
create 0644 root root
sharedscripts
postrotate
/usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
3. ELK Stack構築
3.1 ELK Stack概要
ELK StackはElasticsearch、Logstash、Kibanaの組み合わせで、大規模ログデータの収集、保存、分析、可視化のための強力なプラットフォームです。最近ではBeatsが追加されElastic Stackとも呼ばれています。
- Elasticsearch:分散検索および分析エンジン、ログデータの保存
- Logstash:データ収集、パース、変換パイプライン
- Kibana:データ可視化およびダッシュボード
- Beats:軽量データコレクター(Filebeat、Metricbeatなど)
3.2 Elasticsearchインストールと設定
# Elasticsearchインストール(Ubuntu/Debian)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch
# 基本設定(/etc/elasticsearch/elasticsearch.yml)
cluster.name: security-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
# セキュリティ設定(Elasticsearch 8.x)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# JVMヒープメモリ設定(/etc/elasticsearch/jvm.options.d/heap.options)
-Xms4g
-Xmx4g
# サービス開始
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# 状態確認
curl -X GET "localhost:9200/_cluster/health?pretty"
3.3 Logstashパイプライン構成
# Logstashインストール
sudo apt install logstash
# パイプライン設定(/etc/logstash/conf.d/security-logs.conf)
input {
beats {
port => 5044
}
syslog {
port => 5514
type => "syslog"
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
# SSHログイン失敗の検知
if [syslog_program] == "sshd" and [syslog_message] =~ /Failed password/ {
grok {
match => { "syslog_message" => "Failed password for %{USER:ssh_user} from %{IP:src_ip}" }
}
mutate {
add_tag => ["ssh_failed_login"]
}
}
# GeoIP情報の追加
if [src_ip] {
geoip {
source => "src_ip"
target => "geoip"
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "security-logs-%{+YYYY.MM.dd}"
}
}
3.4 Filebeatを活用したログ収集
# Filebeat設定(/etc/filebeat/filebeat.yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/auth.log
- /var/log/syslog
fields:
log_type: system
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
fields:
log_type: nginx_error
output.logstash:
hosts: ["localhost:5044"]
# または直接Elasticsearchに送信
# output.elasticsearch:
# hosts: ["localhost:9200"]
# index: "filebeat-%{+yyyy.MM.dd}"
3.5 Kibanaダッシュボード構成
# Kibanaインストールと設定
sudo apt install kibana
# 設定(/etc/kibana/kibana.yml)
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
# サービス開始
sudo systemctl enable kibana
sudo systemctl start kibana
Kibanaでセキュリティダッシュボードを構成する際は、以下の可視化を含めることをお勧めします:
- ログイン失敗の推移:時間帯別の失敗ログイン試行グラフ
- 上位攻撃ソースIP:最も多くの失敗試行をしたIPリスト
- 地理的分布:攻撃試行の地理的位置を示す地図
- イベントタイプ別分布:パイチャートでイベントタイプを表示
- リアルタイムログストリーム:最新セキュリティイベントリスト
4. SIEMの概念と活用
4.1 SIEMとは?
SIEM(Security Information and Event Management)はセキュリティ情報管理(SIM)とセキュリティイベント管理(SEM)を組み合わせたソリューションです。様々なソースからログを収集し、相関分析を通じてセキュリティ脅威を検知します。
- ログ収集と正規化:様々な形式のログを標準化
- リアルタイムモニタリング:セキュリティイベントのリアルタイム監視
- 相関分析:複数のイベントを関連付けて攻撃パターンを識別
- アラートと対応:脅威検知時の自動アラート発信
- 規制遵守レポート:監査およびコンプライアンスレポートの生成
4.2 オープンソースSIEM:Wazuh
WazuhはOSSECをベースとしたオープンソースSIEMソリューションで、ELK Stackと統合して使用できます。
# Wazuhサーバーインストール(シングルノード)
curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh
sudo bash wazuh-install.sh -a
# Wazuhエージェントインストール(クライアント)
curl -sO https://packages.wazuh.com/4.7/wazuh-agent-4.7.0-1.x86_64.rpm
sudo rpm -ivh wazuh-agent-4.7.0-1.x86_64.rpm
# エージェント設定
sudo sed -i 's/MANAGER_IP/192.168.1.10/' /var/ossec/etc/ossec.conf
sudo systemctl enable wazuh-agent
sudo systemctl start wazuh-agent
4.3 SIEMルールの作成
<!-- Wazuhカスタムルール(/var/ossec/etc/rules/local_rules.xml)-->
<group name="custom_rules">
<!-- 短時間内の複数SSH失敗試行検知 -->
<rule id="100001" level="10" frequency="5" timeframe="60">
<if_matched_sid>5710</if_matched_sid>
<same_source_ip />
<description>SSHブルートフォース攻撃検知:1分以内に5回以上の失敗</description>
<group>authentication_failures,pci_dss_10.2.4,</group>
</rule>
<!-- 異常な時間帯のログイン検知 -->
<rule id="100002" level="8">
<if_sid>5501</if_sid>
<time>12am - 6am</time>
<description>異常な時間帯のログイン成功</description>
</rule>
<!-- 重要ファイル変更検知 -->
<rule id="100003" level="12">
<if_sid>550</if_sid>
<match>/etc/passwd|/etc/shadow|/etc/sudoers</match>
<description>重要システムファイル変更検知</description>
</rule>
</group>
5. 異常検知
5.1 ベースライン設定
異常を検知するには、まず正常な活動パターンを把握する必要があります。ベースラインは時間帯別、曜日別、ユーザー別に設定できます。
- ネットワークトラフィック:平均帯域幅使用量、プロトコル分布
- ログインパターン:一般的なログイン時間、場所
- プロセスアクティビティ:通常実行されるプロセスリスト
- ファイルアクセス:一般的なファイルアクセスパターン
5.2 異常の種類
- ボリューム異常:異常に高いまたは低いトラフィック/ログボリューム
- 時間異常:異常な時間帯のアクティビティ
- 地理的異常:予期しない場所からのアクセス
- 振る舞い異常:普段と異なるユーザー行動パターン
- プロトコル異常:異常なプロトコル使用やポートアクセス
5.3 機械学習ベースの異常検知
ElasticsearchのML機能を活用して自動的に異常を検知できます。
// Elasticsearch ML ジョブ作成例
PUT _ml/anomaly_detectors/security_login_anomaly
{
"description": "ログイン異常検知",
"analysis_config": {
"bucket_span": "15m",
"detectors": [
{
"function": "high_count",
"field_name": "event.action",
"by_field_name": "source.ip",
"detector_description": "IP別の異常に高いログイン試行"
}
],
"influencers": ["source.ip", "user.name"]
},
"data_description": {
"time_field": "@timestamp"
},
"datafeed_config": {
"indices": ["security-logs-*"],
"query": {
"bool": {
"filter": [
{"term": {"event.category": "authentication"}}
]
}
}
}
}
6. 脅威インテリジェンスの活用
6.1 脅威インテリジェンスとは?
脅威インテリジェンス(Threat Intelligence)はサイバー脅威に関する収集・分析された情報を意味します。これを活用することで、既知の脅威を事前に検知し対応できます。
- 戦術的インテリジェンス:IOC(侵害指標)、悪性IP、ドメインリスト
- 運用的インテリジェンス:攻撃者のTTP(戦術、技法、手順)
- 戦略的インテリジェンス:脅威動向、攻撃グループ分析
6.2 脅威フィードの統合
# 悪性IPリストのダウンロードと適用
wget -O /etc/threat-intel/malicious-ips.txt https://example.com/threat-feeds/ips.txt
# Logstashで脅威インテリジェンスを活用
filter {
translate {
field => "src_ip"
destination => "threat_match"
dictionary_path => "/etc/threat-intel/malicious-ips.txt"
fallback => "clean"
}
if [threat_match] != "clean" {
mutate {
add_tag => ["threat_detected"]
add_field => { "threat_source" => "ip_blocklist" }
}
}
}
6.3 MISP(Malware Information Sharing Platform)
MISPは脅威インテリジェンスを共有・管理するためのオープンソースプラットフォームです。
# MISP APIを活用したIOC照会
from pymisp import PyMISP
misp = PyMISP('https://misp.example.com', 'your-api-key', ssl=True)
# 特定IPの照会
result = misp.search(controller='attributes', value='192.168.1.100')
# 最近のイベント照会
events = misp.search(controller='events', timestamp='7d')
# IOCのエクスポート
iocs = misp.search(controller='attributes', type_attribute='ip-dst', to_ids=True)
7. セキュリティダッシュボード構成例
7.1 核心セキュリティ指標(KPI)
効果的なセキュリティモニタリングのために、以下の指標をダッシュボードに含める必要があります:
- MTTD(Mean Time To Detect):脅威検知までの平均所要時間
- MTTR(Mean Time To Respond):対応までの平均所要時間
- 1日あたりのセキュリティイベント数:深刻度別に分類
- ブロックされた攻撃数:ファイアウォール/IPSでブロックした試行
- 脆弱性状況:未パッチシステム数
7.2 リアルタイムアラート設定
# Elasticsearch Watcherアラート設定
PUT _watcher/watch/ssh_bruteforce_alert
{
"trigger": {
"schedule": { "interval": "1m" }
},
"input": {
"search": {
"request": {
"indices": ["security-logs-*"],
"body": {
"query": {
"bool": {
"must": [
{ "match": { "tags": "ssh_failed_login" }},
{ "range": { "@timestamp": { "gte": "now-5m" }}}
]
}
},
"aggs": {
"by_ip": {
"terms": { "field": "src_ip", "min_doc_count": 10 }
}
}
}
}
}
},
"condition": {
"compare": { "ctx.payload.aggregations.by_ip.buckets.0.doc_count": { "gte": 10 }}
},
"actions": {
"send_email": {
"email": {
"to": "security@example.com",
"subject": "[ALERT] SSHブルートフォース攻撃検知",
"body": "IP {{ctx.payload.aggregations.by_ip.buckets.0.key}}から5分間で{{ctx.payload.aggregations.by_ip.buckets.0.doc_count}}回のSSHログイン失敗が発生しました。"
}
},
"webhook": {
"webhook": {
"method": "POST",
"url": "https://hooks.slack.com/services/xxx/yyy/zzz",
"body": "{\"text\": \"SSHブルートフォース攻撃検知: {{ctx.payload.aggregations.by_ip.buckets.0.key}}\"}"
}
}
}
}
8. 実践ログ分析シナリオ
8.1 Webサーバー侵害調査
# 疑わしいリクエストパターンの検索
grep -E "(union.*select|script>|../|cmd=|exec\()" /var/log/nginx/access.log
# 特定IPのすべてのアクティビティを追跡
grep "192.168.1.100" /var/log/nginx/access.log | less
# 異常に大きなレスポンスサイズ(データ流出の疑い)
awk '$10 > 1000000 {print $1, $7, $10}' /var/log/nginx/access.log
# 404エラー多発(スキャニングの疑い)
awk '$9 == 404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
8.2 権限昇格試行の検知
# sudo使用記録の分析
grep "sudo:" /var/log/auth.log | grep -v "session opened\|session closed"
# 失敗したsudo試行
grep "sudo:.*authentication failure" /var/log/auth.log
# suコマンドの使用記録
grep "su\[" /var/log/auth.log
# 疑わしいcronジョブの確認
grep "CRON" /var/log/syslog | grep -v "session"
結論
セキュリティモニタリングとログ分析は、組織のセキュリティ態勢を維持する核心的な活動です。この編で扱った内容をまとめると:
- ログの種類:システム、アプリケーション、セキュリティ、ネットワークログの特性と活用方法
- 集中ログ管理:rsyslog、syslog-ngを活用したログ集約化
- ELK Stack:Elasticsearch、Logstash、Kibanaを活用したログ分析プラットフォーム
- SIEM:セキュリティイベント相関分析と自動化された脅威検知
- 異常検知:ベースライン設定と機械学習ベースの検知
- 脅威インテリジェンス:外部脅威情報を活用した事前検知
効果的なセキュリティモニタリングのためには、ツールだけでは十分ではありません。組織の環境とビジネスを理解し、継続的に検知ルールを改善し、アラート疲れ(Alert Fatigue)を管理することが重要です。
次の第10編では、侵害インシデントが発生した場合にどのように対応し、デジタルフォレンジックを通じてインシデントを分析する方法について学びます。セキュリティインシデント対応プロセスと実際のフォレンジック技法を通じてシリーズを締めくくります。