DB Hooks

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.

Pfad/var/www/scripts/hooks/
Hook-TypPreToolUse (Bash)
VerhaltenBlocking (Exit 1 bei Violation)

Übersicht

HookBlockiertEmpfehlung
block_direct_db.pymysql/mariadb mit PasswortMCP-DB Tools
block_direct_task_db.pyINSERT/UPDATE/DELETE auf Task-TabellenMCP-Tasks Tools
block_password_exposure.pyPasswörter im Klartext in Bash-CommandsEnvironment-Variablen

block_direct_db.py

Verhindert Bash-Befehle mit direktem Datenbank-Login.

Blockierte Patterns

mysql -u user -ppassword
mariadb -u user -p
mysql --password=xxx
mariadb --password=xxx

Fehlermeldung

BLOCKIERT: Direkte Datenbankzugriffe sind aus Sicherheitsgründen nicht erlaubt.

Verwende stattdessen die MCP-DB Tools:
  - db_select(query, params)  : SELECT-Abfragen ausführen
  - db_schema()               : Datenbank-Schema anzeigen
  - db_stats()                : Statistiken abrufen

Vorteile von MCP-DB:
  - Keine Credentials im Code/Verlauf
  - Automatische Query-Validierung
  - SQL-Injection Schutz
  - Audit-Logging aller Abfragen
  - Enforced Read-Only Zugriff

block_direct_task_db.py

Verhindert direkte SQL-Operationen auf Task-Tabellen.

Blockierte Patterns

INSERT INTO tasks ...
UPDATE tasks SET ...
DELETE FROM tasks ...
INSERT INTO task_assignments ...
UPDATE task_results ...
DELETE FROM task_comments ...

Fehlermeldung

BLOCKIERT: Direkte SQL-Operationen auf Task-Tabellen sind nicht erlaubt.

Verwende stattdessen die MCP-Tasks Tools:
  - tasks_list()              : Tasks auflisten
  - tasks_create(title, ...)  : Task erstellen
  - tasks_get(id)             : Task-Details abrufen
  - tasks_update(id, ...)     : Task aktualisieren
  - tasks_status(id, status)  : Status ändern
  - tasks_assign(id, ...)     : Task zuweisen
  - tasks_result(id, ...)     : Ergebnis speichern
  - tasks_execute(id, model)  : Mit Ollama ausführen

block_password_exposure.py

Verhindert Passwort-Exposition in Bash-Commands. Passwörter im Klartext sind sichtbar in ps aux, /proc/*/cmdline, bash_history und Logs.

Blockierte Patterns

DB_PASSWORD="wert"
MARIADB_ROOT_PASSWORD="wert"
API_KEY="wert"
TOKEN="wert"
SECRET="wert"
--password=wert

Erlaubte Patterns

$DB_PASSWORD              # Variable verwenden
${DB_PASSWORD}            # Variable verwenden
DB_PASSWORD=""            # Leere Zuweisung
get_db_password()         # Getter-Funktion

Fehlermeldung

BLOCKIERT: Passwort-Exposition im Bash-Command erkannt!

RICHTIG: Passwort aus Environment laden
  ./venv/bin/python script.py
  # Script lädt Passwort via get_db_password()

FALSCH:
  DB_PASSWORD="xxx" ./venv/bin/python script.py

Verhalten

Erfolg (erlaubt)

{
  "allowed": true,
  "message": ""
}
Exit Code: 0

Blockiert

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "BLOCKIERT: ..."
  }
}
Exit Code: 1

Fehler (Fail-Open)

{
  "allowed": true,
  "message": "Hook error (fail-open): ..."
}
Exit Code: 0

Konfiguration

In /root/.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {"type": "command", "command": "/var/www/scripts/hooks/block_direct_db.py"},
          {"type": "command", "command": "/var/www/scripts/hooks/block_direct_task_db.py"},
          {"type": "command", "command": "/var/www/scripts/hooks/block_password_exposure.py"}
        ]
      }
    ]
  }
}

Sicherheitskonzept

┌─────────────────────────────────────────────┐
│  Claude Code                                │
│  └─ Bash Tool → mysql -u root -p...         │
└─────────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────────┐
│  PreToolUse Hook                            │
│  ├─ block_direct_db.py                      │
│  ├─ block_direct_task_db.py                 │
│  └─ block_password_exposure.py              │
│     └─ Pattern Match? → BLOCK (Exit 1)      │
└─────────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────────┐
│  MCP-Server (stattdessen)                   │
│  ├─ MCP-DB: db_select(), db_schema()        │
│  └─ MCP-Tasks: tasks_*(), quality_*()       │
└─────────────────────────────────────────────┘

Verwandte Dokumentation