Skip to content

Harjoitus 12: Estä vaaralliset Bash-komennot

Tavoite

Luoda PreToolUse-hook, joka estää vaaralliset komennot kuten rm -rf /, git reset --hard, git push --force.

Taustaa

PreToolUse on tärkein turvallisuusmekanismi, koska se:

  • On ennen kuin komento suoritetaan
  • Voi palauttaa "block"- päätöksen
  • Estää itseään shell-komennon suorittamista

Tämän mekanismin avulla voit estää:

  • Tiedostojen poistamisen tärkeistä hakemistoista
  • Versionhallinnan historician pöytzauksen
  • Force-pushin ja force-resetin

Tehtävä

Luo hook, joka estää seuraavat komennot:

Komento Miksi vaarallinen
rm -rf / Poistaa koko tiedostopoljeron
git reset --hard Pöllyttää kaikki paikalliset muutokset
git push --force Ylikirjoittaa etähaaran historian
shutdown / reboot Käynnistää uudelleen järjestelmän

Ratkaisu

Hook-skripti: .claude/hooks/block-dangerous.py

#!/usr/bin/env python3
import json, sys

data = json.load(sys.stdin)
cmd = data.get("tool_input", {}).get("command", "")

# Lista kielletyistä osioista
forbidden_patterns = [
    "rm -rf /",           # ei koskaan poista /
    "git reset --hard",   # estä historiikan pöytzays
    "git push --force",   # estä remote-overwrite
    "shutdown",           # estä järjestökäynnistys
    "reboot",             # sama juttu
    "chmod 777",          # liiallista oikeuksia
    ":(){:|:&};:",        # fork bomb
]

for pattern in forbidden_patterns:
    if pattern in cmd:
        print(json.dumps({
            "decision": "block",
            "reason": f"Dangerous command blocked by policy: {pattern}"
        }))
        sys.exit(2)

sys.exit(0)

Konfiguurointi: .claude/settings.json

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python .claude/hooks/block-dangerous.py"
          }
        ]
      }
    ]
  }
}

Miten se toimii?

graph LR
    A[Claude aikoo aja Bash] --> B[PreToolUse-hook käynnistyy]
    B --> C[Tarkista komento]
    C --> D{Vaarallinen?}
    D -->|Kyllä| E[BLOCK - exit 2]
    D -->|Ei| F[CONTINUE]

Esimerkiksi:

$ rm -rf /home/user/project
❌ BLOCKED: Dangerous command blocked by policy: rm -rf /

ADVANCED-VINKKI 06

Käytä hookia deterministiseen sääntöön, ei sellaiseen päätökseen jossa mallin tulee ymmärtää abstraktia liiketoimintakontekstia.


Lähde: Esimerkki 12 [S1], [S11]