DB Hooks
Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.
| Pfad | /var/www/scripts/hooks/ |
|---|---|
| Hook-Typ | PreToolUse (Bash) |
| Verhalten | Blocking (Exit 1 bei Violation) |
Übersicht
| Hook | Blockiert | Empfehlung |
|---|---|---|
| block_direct_db.py | mysql/mariadb mit Passwort | MCP-DB Tools |
| block_direct_task_db.py | INSERT/UPDATE/DELETE auf Task-Tabellen | MCP-Tasks Tools |
| block_password_exposure.py | Passwörter im Klartext in Bash-Commands | Environment-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_*() │
└─────────────────────────────────────────────┘