プロジェクト

全般

プロフィール

バグ #339

未完了

Security-2: 監査ログ・異常検出 (4h)

Redmine Admin さんが約11時間前に追加.

ステータス:
新規
優先度:
高め
担当者:
-
開始日:
2025-06-07
期日:
進捗率:

0%

予定工数:

説明

監査ログシステムと異常活動検出機能を実装する。

実装内容

監査ログシステム

export class AuditLogger {
  private redis: Redis;
  private redmineManager: RedmineManager;

  async log(event: AuditEvent) {
    const entry = {
      id: crypto.randomUUID(),
      ...event,
      timestamp: new Date().toISOString()
    };

    // Redisに保存(90日間保持)
    await this.redis.zadd(
      'audit:log',
      Date.now(),
      JSON.stringify(entry)
    );

    // 重要イベントはRedmineにも記録
    if (event.severity === 'high' || event.severity === 'critical') {
      await this.redmineManager.createAuditTicket(entry);
    }

    // リアルタイム異常検出
    await this.detectAnomalies(entry);
  }

  async getAuditTrail(userId: string, timeRange: { start: number, end: number }) {
    const logs = await this.redis.zrangebyscore(
      'audit:log',
      timeRange.start,
      timeRange.end
    );

    return logs.map(log => JSON.parse(log))
               .filter(entry => entry.userId === userId || userId === 'admin');
  }
}

異常活動検出

private async detectAnomalies(event: AuditEvent) {
  // 短期間での大量操作検出
  const recentCount = await this.redis.zcount(
    `user:activity:${event.userId}`,
    Date.now() - 60000,  // 1分間
    Date.now()
  );

  if (recentCount > 20) {
    await this.log({
      userId: 'system',
      action: 'anomaly_detected',
      severity: 'high',
      details: { 
        type: 'rapid_operations',
        target_user: event.userId,
        count: recentCount
      }
    });
  }

  // 異常時間帯アクセス検出
  const hour = new Date().getHours();
  if (hour < 6 || hour > 22) { // 深夜・早朝
    await this.log({
      userId: 'system',
      action: 'unusual_time_access',
      severity: 'medium',
      details: {
        user: event.userId,
        hour,
        action: event.action
      }
    });
  }
}

成果物

  • 監査ログシステム実装
  • 異常活動検出機能
  • リアルタイムアラート機能

作業時間: 4時間

依存: Security-1完了

表示するデータがありません

他の形式にエクスポート: Atom PDF