運用

監査ログ

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

次のステップ

監査ログを理解したら、次はトラブルシューティングで問題解決の方法を学びましょう。

監査ログの重要性監査ログは、セキュリティインシデントの調査、コンプライアンス対応、運用改善に不可欠です。定期的にレビューし、異常を早期に検出してください。
© 2026 IBM Corporation. Licensed under CC BY 4.0.