データベーステーブル設計
スキーマ定義、インデックス設計、セキュリティデータ統合
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 は永続ブロック) |