プロジェクト

全般

プロフィール

バグ #340

未完了

Security-3: 鍵管理・セッション強化 (4h)

Redmine Admin さんが14日前に追加.

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

0%

予定工数:

説明

SSH鍵管理とセッション管理の強化を実装する。

実装内容

SSH鍵管理強化

class SSHKeyManager {
  private keyRotationInterval = 30 * 24 * 60 * 60 * 1000; // 30日

  async rotateKeys() {
    // SSH鍵の定期ローテーション
    const currentKeys = await this.getCurrentKeys();
    
    for (const host of this.managedHosts) {
      if (this.shouldRotateKey(host)) {
        await this.generateNewKeyPair(host);
        await this.deployNewKey(host);
        await this.removeOldKey(host);
        
        await this.auditLogger.log({
          userId: 'system',
          action: 'ssh_key_rotated',
          severity: 'medium',
          details: { host }
        });
      }
    }
  }

  private async generateNewKeyPair(host: string) {
    // 新しいSSH鍵ペア生成
    const keyPair = crypto.generateKeyPairSync('rsa', {
      modulusLength: 4096,
      publicKeyEncoding: { type: 'spki', format: 'pem' },
      privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
    });

    // 暗号化して保存
    await this.storeEncryptedKey(host, keyPair);
  }
}

セッション管理強化

class SessionManager {
  private sessionTimeout = 4 * 60 * 60 * 1000; // 4時間

  async createSession(userId: string, tokenData: any) {
    const sessionId = crypto.randomUUID();
    const session = {
      userId,
      tokenData,
      createdAt: Date.now(),
      lastActivity: Date.now(),
      ipAddress: tokenData.ip
    };

    await this.redis.setex(
      `session:${sessionId}`,
      this.sessionTimeout / 1000,
      JSON.stringify(session)
    );

    return sessionId;
  }

  async validateSession(sessionId: string): Promise<boolean> {
    const session = await this.redis.get(`session:${sessionId}`);
    
    if (!session) {
      return false;
    }

    const sessionData = JSON.parse(session);
    
    // 非活動タイムアウトチェック
    if (Date.now() - sessionData.lastActivity > this.sessionTimeout) {
      await this.invalidateSession(sessionId);
      return false;
    }

    // 最終活動時刻更新
    sessionData.lastActivity = Date.now();
    await this.redis.setex(
      `session:${sessionId}`,
      this.sessionTimeout / 1000,
      JSON.stringify(sessionData)
    );

    return true;
  }
}

成果物

  • SSH鍵管理強化
  • セッション管理強化
  • 自動ローテーション機能

作業時間: 4時間

依存: Security-2完了

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

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