運用
監査ログ
Vaultの監査ログの設定と分析
最終更新: 2026/2/17
監査ログ
Vaultの監査ログは、すべての操作を記録し、セキュリティ監査とコンプライアンス対応を実現します。
監査ログとは
監査ログは、Vaultへのすべてのリクエストとレスポンスを記録するログです。
記録される情報
- リクエスト情報: 操作、パス、パラメータ
- 認証情報: トークン、ユーザー、ポリシー
- レスポンス情報: ステータス、データ
- タイムスタンプ: 操作日時
- クライアント情報: IPアドレス
監査ログの重要性少なくとも1つの監査デバイスが有効でない場合、Vaultはすべてのリクエストを拒否します。これにより、監査証跡が確実に記録されます。
監査デバイスの種類
1. ファイル
用途: ローカルファイルシステムへの出力
# ファイルベースの監査ログを有効化
vault audit enable file file_path=/var/log/vault/audit.log
設定オプション:
vault audit enable file \
file_path=/var/log/vault/audit.log \
log_raw=false \
hmac_accessor=true \
mode=0600 \
format=json
2. Syslog
用途: Syslogサーバーへの出力
# Syslogへの出力を有効化
vault audit enable syslog \
tag="vault" \
facility="AUTH"
3. Socket
用途: TCPまたはUNIXソケットへの出力
# TCPソケット
vault audit enable socket \
address="syslog.example.com:514" \
socket_type="tcp"
# UNIXソケット
vault audit enable socket \
address="/var/run/vault-audit.sock" \
socket_type="unix"
監査ログの形式
JSON形式
{
"time": "2024-01-15T10:30:45.123456Z",
"type": "response",
"auth": {
"client_token": "hmac-sha256:abc123...",
"accessor": "hmac-sha256:def456...",
"display_name": "token-myuser",
"policies": ["default", "myapp-read"],
"token_policies": ["default", "myapp-read"],
"metadata": {
"username": "myuser"
},
"entity_id": "xyz789...",
"token_type": "service"
},
"request": {
"id": "abc123-def456-ghi789",
"operation": "read",
"client_token": "hmac-sha256:abc123...",
"client_token_accessor": "hmac-sha256:def456...",
"namespace": {
"id": "root"
},
"path": "secret/data/myapp/config",
"data": null,
"remote_address": "192.168.1.100"
},
"response": {
"data": {
"data": "hmac-sha256:...",
"metadata": "hmac-sha256:..."
}
},
"error": ""
}
フィールドの説明
| フィールド | 説明 |
|---|---|
time | タイムスタンプ(UTC) |
type | ログタイプ(request/response) |
auth.client_token | トークン(HMAC化) |
auth.display_name | 表示名 |
auth.policies | 適用されたポリシー |
request.operation | 操作(read/write/delete等) |
request.path | アクセスパス |
request.remote_address | クライアントIPアドレス |
response.data | レスポンスデータ(HMAC化) |
error | エラーメッセージ |
HMAC化
HMACとは
**HMAC(Hash-based Message Authentication Code)**は、機密情報を一方向ハッシュ化する仕組みです。
特徴:
- 元の値を復元できない
- 同じ値は常に同じHMACになる
- 値の比較が可能
HMAC化される情報
デフォルトでHMAC化される情報:
- トークン
- トークンアクセサー
- シークレットデータ
- パスワード
HMAC化の無効化(非推奨)
# 生のデータをログに記録(非推奨)
vault audit enable file \
file_path=/var/log/vault/audit.log \
log_raw=true
log_rawの使用
log_raw=trueは開発環境でのデバッグ目的のみに使用してください。本番環境では絶対に使用しないでください。監査ログの管理
監査デバイスの一覧
vault audit list
出力例:
Path Type Description
---- ---- -----------
file/ file n/a
syslog/ syslog n/a
監査デバイスの詳細確認
vault audit list -detailed
監査デバイスの無効化
vault audit disable file
監査デバイスの無効化すべての監査デバイスを無効化すると、Vaultはリクエストを受け付けなくなります。少なくとも1つの監査デバイスを有効にしておく必要があります。
ログローテーション
logrotateの設定
/etc/logrotate.d/vault:
/var/log/vault/audit.log {
daily
rotate 30
compress
delaycompress
notifempty
create 0640 vault vault
sharedscripts
postrotate
systemctl reload vault
endscript
}
設定の説明:
daily: 毎日ローテーションrotate 30: 30日分保持compress: 圧縮delaycompress: 1日遅れて圧縮create 0640 vault vault: 新しいファイルの権限とオーナー
手動ローテーション
# ログファイルを移動
sudo mv /var/log/vault/audit.log /var/log/vault/audit.log.1
# Vaultにログファイルを再オープンさせる
sudo systemctl reload vault
ログの分析
基本的な分析
# 特定のユーザーの操作を検索
grep "myuser" /var/log/vault/audit.log
# 特定のパスへのアクセスを検索
grep "secret/data/myapp/config" /var/log/vault/audit.log
# エラーを検索
grep '"error":' /var/log/vault/audit.log | grep -v '""'
# 特定のIPアドレスからのアクセス
grep "192.168.1.100" /var/log/vault/audit.log
jqを使用した分析
# 操作の種類別に集計
cat /var/log/vault/audit.log | \
jq -r '.request.operation' | \
sort | uniq -c | sort -rn
# 最もアクセスされたパス
cat /var/log/vault/audit.log | \
jq -r '.request.path' | \
sort | uniq -c | sort -rn | head -10
# エラーの集計
cat /var/log/vault/audit.log | \
jq -r 'select(.error != "") | .error' | \
sort | uniq -c | sort -rn
# 時間帯別のアクセス数
cat /var/log/vault/audit.log | \
jq -r '.time' | \
cut -d'T' -f2 | cut -d':' -f1 | \
sort | uniq -c
特定の期間の分析
# 特定の日のログを抽出
cat /var/log/vault/audit.log | \
jq -r 'select(.time | startswith("2024-01-15"))'
# 特定の時間帯のログを抽出
cat /var/log/vault/audit.log | \
jq -r 'select(.time | startswith("2024-01-15T10:"))'
セキュリティ監査
不審なアクセスの検出
# 失敗した認証試行
cat /var/log/vault/audit.log | \
jq -r 'select(.error != "" and .request.path | contains("auth"))'
# 権限エラー
cat /var/log/vault/audit.log | \
jq -r 'select(.error | contains("permission denied"))'
# 深夜のアクセス(例:午前2時〜5時)
cat /var/log/vault/audit.log | \
jq -r 'select(.time | test("T0[2-5]:"))'
# 通常と異なるIPアドレスからのアクセス
cat /var/log/vault/audit.log | \
jq -r 'select(.request.remote_address | test("^(?!192\\.168\\.)"))'
ユーザー行動の分析
# 特定のユーザーの操作履歴
cat /var/log/vault/audit.log | \
jq -r 'select(.auth.display_name == "token-myuser") |
"\(.time) \(.request.operation) \(.request.path)"'
# ユーザーごとのアクセス数
cat /var/log/vault/audit.log | \
jq -r '.auth.display_name' | \
sort | uniq -c | sort -rn
ログ集約
Elasticsearch + Kibana
Fluentdの設定:
<source>
@type tail
path /var/log/vault/audit.log
pos_file /var/log/td-agent/vault-audit.log.pos
tag vault.audit
<parse>
@type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
<match vault.audit>
@type elasticsearch
host elasticsearch.example.com
port 9200
index_name vault-audit
type_name _doc
<buffer>
flush_interval 10s
</buffer>
</match>
Kibanaでの可視化:
- 操作の種類別グラフ
- ユーザー別アクセス数
- エラー率の推移
- IPアドレス別アクセス
Splunk
inputs.conf:
[monitor:///var/log/vault/audit.log]
disabled = false
index = vault
sourcetype = vault:audit
props.conf:
[vault:audit]
SHOULD_LINEMERGE = false
KV_MODE = json
TIME_PREFIX = "time":"
TIME_FORMAT = %Y-%m-%dT%H:%M:%S.%NZ
CloudWatch Logs(AWS)
# CloudWatch Logs Agentの設定
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/vault/audit.log",
"log_group_name": "/aws/vault/audit",
"log_stream_name": "{instance_id}",
"timezone": "UTC"
}
]
}
}
}
}
コンプライアンス対応
GDPR対応
# 特定のユーザーのデータアクセス履歴
cat /var/log/vault/audit.log | \
jq -r 'select(.auth.metadata.username == "user@example.com") |
"\(.time) \(.request.operation) \(.request.path)"'
PCI DSS対応
要件:
- すべてのアクセスを記録
- ログの改ざん防止
- 定期的なログレビュー
- ログの長期保存(1年以上)
実装:
# ログの署名(改ざん防止)
openssl dgst -sha256 -sign private.key \
-out audit.log.sig audit.log
# 署名の検証
openssl dgst -sha256 -verify public.key \
-signature audit.log.sig audit.log
SOC 2対応
要件:
- アクセス制御の証跡
- 変更管理の記録
- インシデント対応の記録
レポート生成
日次レポート
#!/bin/bash
# /usr/local/bin/vault-daily-report.sh
DATE=$(date +%Y-%m-%d)
REPORT_FILE="/reports/vault-audit-$DATE.txt"
LOG_FILE="/var/log/vault/audit.log"
echo "Vault Audit Report - $DATE" > "$REPORT_FILE"
echo "================================" >> "$REPORT_FILE"
# 総リクエスト数
echo "Total Requests:" >> "$REPORT_FILE"
grep "$DATE" "$LOG_FILE" | wc -l >> "$REPORT_FILE"
# エラー数
echo "Total Errors:" >> "$REPORT_FILE"
grep "$DATE" "$LOG_FILE" | \
jq -r 'select(.error != "")' | wc -l >> "$REPORT_FILE"
# トップ10ユーザー
echo "Top 10 Users:" >> "$REPORT_FILE"
grep "$DATE" "$LOG_FILE" | \
jq -r '.auth.display_name' | \
sort | uniq -c | sort -rn | head -10 >> "$REPORT_FILE"
# トップ10パス
echo "Top 10 Paths:" >> "$REPORT_FILE"
grep "$DATE" "$LOG_FILE" | \
jq -r '.request.path' | \
sort | uniq -c | sort -rn | head -10 >> "$REPORT_FILE"
月次レポート
#!/bin/bash
# /usr/local/bin/vault-monthly-report.sh
MONTH=$(date +%Y-%m)
REPORT_FILE="/reports/vault-audit-$MONTH.txt"
echo "Vault Audit Monthly Report - $MONTH" > "$REPORT_FILE"
echo "====================================" >> "$REPORT_FILE"
# 月間総リクエスト数
echo "Monthly Total Requests:" >> "$REPORT_FILE"
grep "$MONTH" /var/log/vault/audit.log* | wc -l >> "$REPORT_FILE"
# 日別リクエスト数
echo "Daily Request Count:" >> "$REPORT_FILE"
grep "$MONTH" /var/log/vault/audit.log* | \
jq -r '.time' | cut -d'T' -f1 | \
sort | uniq -c >> "$REPORT_FILE"
ベストプラクティス
1. 複数の監査デバイス
# ファイルとSyslogの両方を有効化
vault audit enable file file_path=/var/log/vault/audit.log
vault audit enable syslog tag="vault"
2. ログの暗号化
# ログファイルの暗号化
gpg --encrypt --recipient admin@example.com audit.log
3. アクセス制限
# ログファイルの権限設定
sudo chmod 640 /var/log/vault/audit.log
sudo chown vault:vault /var/log/vault/audit.log
4. 定期的なレビュー
# 週次でログをレビュー
0 9 * * 1 /usr/local/bin/vault-weekly-audit-review.sh
トラブルシューティング
監査ログが記録されない
確認事項:
# 監査デバイスの確認
vault audit list
# ログファイルの権限確認
ls -l /var/log/vault/audit.log
# ディスク容量の確認
df -h /var/log
ログファイルが大きくなりすぎる
解決策:
# ログローテーションの設定
sudo logrotate -f /etc/logrotate.d/vault
# 古いログの削除
find /var/log/vault -name "audit.log.*" -mtime +30 -delete
次のステップ
監査ログを理解したら、次はトラブルシューティングで問題解決の方法を学びましょう。
監査ログの重要性監査ログは、セキュリティインシデントの調査、コンプライアンス対応、運用改善に不可欠です。定期的にレビューし、異常を早期に検出してください。