操作
バグ #339
未完了Security-2: 監査ログ・異常検出 (4h)
ステータス:
新規
優先度:
高め
担当者:
-
開始日:
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完了¶
表示するデータがありません
操作