データベーステーブル設計

スキーマ定義、インデックス設計、セキュリティデータ統合

1. ER 図 (Entity Relationship Diagram)

一元管理を支える監視ノード・セキュリティ・コンテナ情報に関する ER 図です。

erDiagram NODES ||--|| NODE_API_KEYS : "has (1:1)" NODES ||--o{ NODE_METRICS_HISTORY : "reports" NODES ||--o{ NODE_DOCKER_CONTAINERS : "caches" NODES ||--o{ DOCKER_COMMANDS : "receives" NODES ||--o{ SECURITY_EVENTS : "logs" NODES ||--o{ BLOCKED_IPS : "blocks" NODES { string id PK string name string hostname string role string region string status string agent_version text fail2ban_status "JSON" text os_updates "JSON" text ssh_status "JSON" text vpn_status "JSON" datetime created_at datetime updated_at } NODE_API_KEYS { string id PK string node_id FK, UK string key_hash UK datetime created_at datetime last_used_at } SECURITY_EVENTS { string id PK string node_id FK datetime timestamp string event_type "login_fail / banned / anomaly" string source_ip string severity "info / warning / critical" text details "JSON" } BLOCKED_IPS { string id PK string node_id FK string ip_address string reason datetime blocked_at datetime expires_at }

2. 一元管理用 JSON フィールドのデータ構造

nodes テーブル内の非正規化 JSON フィールドには、エージェントが毎サイクル収集する system/security/network 構成データを格納します。

2.1. os_updates (OSパッチ管理)

{
  "security": 1,         // 未適用のセキュリティパッチ数
  "regular": 4,          // 一般的なパッケージアップデート数
  "checked_at": "2026-07-01T14:30:00Z"
}

2.2. fail2ban_status (ファイアウォール・ブロックIP)

{
  "enabled": true,
  "jails": ["sshd", "nginx-http-auth"],
  "banned_ips": [
    { "ip": "203.0.113.4", "jail": "sshd", "banned_at": "2026-07-01T14:05:00Z" }
  ]
}

2.3. ssh_status (ログインセッション)

{
  "active_sessions": [
    { "user": "root", "ip": "192.168.1.100", "login_time": "2026-07-01T12:00:00Z" }
  ]
}

2.4. vpn_status (VPN構成)

{
  "interface": "wg0",
  "enabled": true,
  "rx_bytes": 1289458290,
  "tx_bytes": 5128495029,
  "endpoint": "vpn-gateway.example.com:51820",
  "peers": [
    { "public_key": "abcde...", "allowed_ips": ["10.8.0.2/32"], "latest_handshake": "2026-07-01T14:28:10Z" }
  ]
}

3. セキュリティ関連テーブルスキーマ

3.1. security_events テーブル

各ノードで検知された、不審なアクセスや Fail2ban による新規ブロックイベントを時系列で保存し、アラートエンジンが検知対象にします。

カラム名 データ型 制約 説明
id TEXT PRIMARY KEY (UUID) イベント一意識別子
node_id TEXT NOT NULL, FOREIGN KEY nodes.id への外部キー
timestamp TEXT (datetime) NOT NULL 検知日時
event_type TEXT NOT NULL イベントタイプ (ssh_login_failed, ip_banned, port_scan)
source_ip TEXT 攻撃元 / 接続元 IP アドレス
severity TEXT NOT NULL 危険度レベル (info, warning, critical)
details TEXT (JSON) イベント詳細(攻撃ペイロード、ログスニペットなど)

3.2. blocked_ips テーブル

各ノードのファイアウォール(ufw / iptables / Fail2ban)で一時的・永続的に拒否するブロックIPのリストです。一元管理コンソールから IP の追加・解除指示がエージェントへ SSE で即時反映されます。

カラム名 データ型 制約 説明
id TEXT PRIMARY KEY (UUID) レコード識別子
node_id TEXT NOT NULL, FOREIGN KEY 対象ノードのID
ip_address TEXT NOT NULL 拒否対象の IP アドレス
reason TEXT ブロックの理由(例: "SSH ブルートフォース攻撃")
blocked_at TEXT (datetime) NOT NULL ブロック開始日時
expires_at TEXT (datetime) 自動解除日時(NULL は永続ブロック)