Sari la conținut
Toate articolele

· 7 min de citit

Claude Code pentru tooling de securitate: tool-uri pe Odin v1

Rulează Claude Code pe modelele Odin cu comanda claudeodin și construiește parsere de loguri, un normalizator de recon și un harness YARA, cu limită de cost și sandbox.

Majoritatea echipelor de securitate au o grămadă de scripturi mici: un parser pentru un format ciudat de loguri, un convertor între output-urile a două scannere, un harness care rulează reguli pe fișiere de test. Claude Code se pricepe exact la genul ăsta de instrumente, iar cu InterOdin poate rula pe Odin v1, care nu refuză munca legitimă de securitate. Articolul acoperă configurarea, cum îl ții în siguranță și trei instrumente care merită construite: un parser de loguri, un normalizator de date de recon pentru un angajament autorizat și un harness de test pentru YARA.

De ce o comandă separată, claudeodin

Scriptul de configurare InterOdin nu îți modifică instalarea obișnuită de Claude Code. Adaugă o a doua comandă, claudeodin, care rulează același Claude Code pe modelele Odin, cu propriul folder de setări, ~/.claude-odin.

Separarea asta contează în practică:

  • Comanda ta obișnuită claude își păstrează contul Claude, setările, sesiunile și istoricul. Nu se suprascrie nimic.
  • claudeodin are propriul istoric, așa că sesiunile de securitate cu date din sample-uri și notițe din angajamente rămân separate de sesiunile tale de zi cu zi.
  • Poți alege în funcție de sarcină. Folosește claude pentru munca generală și claudeodin când e vorba de triaj malware, conținut de detecție sau tooling pentru un test.

Configurare

Ai nevoie de Node.js 18 sau mai nou, de Claude Code deja instalat și de o cheie API InterOdin (începe cu io-sk-) din consolă.

bash
curl -fsSL https://docs.interodin.com/claude-code-setup.mjs -o claude-code-setup.mjsnode claude-code-setup.mjsclaudeodin

Scriptul îți cere cheia fără să o afișeze pe ecran și scrie setările în ~/.claude-odin. E scurt și nu are dependențe, așa că citește-l înainte să-l rulezi. Într-o sesiune, /status îți arată ce URL de bază e activ.

Ca să anulezi totul mai târziu:

bash
node claude-code-setup.mjs delete

Comanda șterge launcher-ul și setările adăugate de script. Ghidul complet, inclusiv configurarea manuală, este la Claude Code on InterOdin.

Alegerea modelului cu /model

În claudeodin, meniul /model afișează Odin v1 și Odin Flash.

  • Odin v1 (odin-v1): cel mai capabil model, cu o fereastră de context de 1.000.000 de tokeni și thinking activat implicit. Folosește-l pentru proiectarea unui instrument, citirea unui codebase mare sau depanarea unui parser pe un format real, haotic.
  • Odin Flash (odin-flash): mai rapid și mai ieftin, cu un context de 262.144 de tokeni. Bun pentru modificări mici, redenumiri, scrierea de teste și schimbări repetitive.

Un ritm des întâlnit: planifici și construiești prima versiune pe Odin v1, apoi treci pe Odin Flash pentru curățenie.

O limită de știut: modelele acceptă doar text. Dacă lipești o captură de ecran dintr-un log viewer, cererea eșuează. Lipește în schimb liniile de log.

Pune o limită lunară de cost pe cheie

O sesiune de agent nu e o singură cerere. Fiecare apel de instrument, fiecare fișier citit și fiecare reîncercare e un apel API separat, iar o sesiune lungă se adună. Creează o cheie API separată doar pentru Claude Code și setează-i în consolă o limită lunară de cost. Dacă o sesiune se învârte toată noaptea în jurul unui test care pică, limita plafonează paguba. Facturarea se face prin credite preplătite în EUR sau USD, fără abonament; vezi prețurile pentru tarifele actuale.

Rulează-l într-un container sau VM când execută comenzi

Claude Code poate rula comenzi în shell și poate edita fișiere. Implicit, cere confirmare înainte de fiecare. Mulți dezactivează confirmările după ce capătă încredere într-un flux de lucru, și exact atunci contează izolarea.

Odin v1 răspunde direct, deci frâna din partea modelului e mai mică. Pune frâna în mediu:

  • Rulează claudeodin într-un container sau VM de unică folosință, în care e montat doar folderul proiectului.
  • Ține în afara acelui mediu credențialele, cheile SSH și datele clienților de care instrumentul nu are nevoie.
  • Nu-l lăsa niciodată să execute sample-uri de malware. Orice lucru cu sample-uri își are locul într-un VM de analiză dedicat și izolat, iar harness-ul trebuie doar să citească fișierele, niciodată să le ruleze.
  • Pentru tooling de recon, asigură-te că mediul nu poate ajunge la ținte reale decât dacă sunt în scope-ul tău scris.

Un container minimal pentru un proiect de tooling arată așa:

bash
docker run --rm -it \  -v "$PWD":/work -w /work \  -e INTERODIN_API_KEY \  python:3.12 bash

Instalează Node.js și Claude Code înăuntru, rulează acolo scriptul de configurare, iar sesiunea nu poate atinge decât /work.

Instrumentul 1: un parser de loguri

Începe cu ceva cu risc mic. Să zicem că proxy-ul tău scrie într-un format custom pe care SIEM-ul nu îl parsează. Dă-i lui Claude Code un eșantion de linii reale (anonimizate) și un obiectiv clar:

text
Write parse_proxy.py. Input: lines like the ones in samples/proxy.log.Output: one JSON object per line with timestamp (ISO 8601 UTC), src_ip,user, method, url, status, bytes, user_agent. Lines that do not match goto stderr with the line number. Add pytest tests using the sample lines,including the two malformed ones at the end.

La ce să te aștepți: un parser construit în jurul unei singure expresii regulate compilate sau al unui tokenizer mic, conversia timestamp-urilor cu fusul orar tratat explicit, teste care acoperă liniile normale și pe cele malformate și o notă despre orice câmp pe care a trebuit să-l ghicească, de exemplu dacă un - în coloana user înseamnă valoare goală. Rulează singur testele înainte să ai încredere în output.

Instrumentul 2: un normalizator de date de recon pentru un angajament autorizat

Într-un test, datele vin de la mai multe instrumente, în mai multe formate. Un normalizator le îmbină într-un singur inventar. Regula de design esențială: scope-ul e impus în cod, nu din memorie.

Pune scope-ul din regulile de angajament într-un fișier, de exemplu:

text
# scope.txt, from the signed rules of engagement192.0.2.0/24198.51.100.0/25

Apoi cere:

text
Build normalize.py for an authorized external test. Inputs: nmap XMLfiles in raw/nmap/ and a CSV export from our web scanner in raw/web/.Output: inventory.json with one entry per host: ip, hostnames, open portswith service and version, and web findings. Load scope.txt and drop anyhost outside it, logging each dropped host to out_of_scope.log. The toolonly reads files; it must not send any network traffic.

Te poți aștepta la un parser pentru fiecare input, un pas de îmbinare după adresa IP, filtrare pe scope cu modulul Python ipaddress și teste care includ un host din afara range-ului, ca să dovedească faptul că e eliminat. Logul out-of-scope e o dovadă utilă mai târziu: arată că datele pe care nu erai autorizat să le testezi n-au ajuns niciodată în raport.

Odată ce inventarul există, instrumentul poate apela direct API-ul ca să redacteze notițe pentru angajament. Odin Flash se potrivește bine pentru acest gen de rezumat:

python
from openai import OpenAIimport jsonimport os
client = OpenAI(    base_url="https://api.interodin.com/v1",    api_key=os.environ["INTERODIN_API_KEY"],)
inventory = json.load(open("inventory.json", encoding="utf-8"))
resp = client.chat.completions.create(    model="odin-flash",    messages=[        {            "role": "system",            "content": "You help a penetration tester on an authorized engagement. "                       "Summarize the attack surface by host. Do not suggest "                       "testing anything outside the provided inventory.",        },        {"role": "user", "content": json.dumps(inventory, indent=2)},    ],)print(resp.choices[0].message.content)

Prompturile și răspunsurile trimise prin API nu sunt stocate niciodată, doar metadatele de facturare. Chiar și așa, scoate numele clienților de care nu ai nevoie. Ca să transformi aceste notițe într-un livrabil, vezi Rapoarte de pentest scrise cu AI.

Instrumentul 3: un harness de test pentru YARA

Regulile sunt doar atât de bune cât testarea lor. Un harness rulează un set de reguli pe două foldere, sample-uri cunoscute și fișiere despre care știi că sunt benigne, și raportează ratările și false pozitivele.

text
Write yara_harness.py using yara-python. Compile every .yar file inrules/. Scan positives/ (each file should match) and benign/ (nothingshould match). Never execute any file, only read it. Print a table ofrule, true positives, misses and false positives, and exit non-zero ifany rule has a false positive so CI can catch it.

Miezul a ceea ce primești înapoi arată cam așa:

python
import pathlibimport yara
rules = yara.compile(filepaths={p.stem: str(p) for p in pathlib.Path("rules").glob("*.yar")})
def scan(folder):    results = {}    for path in pathlib.Path(folder).rglob("*"):        if path.is_file():            results[str(path)] = [m.rule for m in rules.match(str(path))]    return results

Ține folderul de pozitive în VM-ul de analiză izolat și umple folderul benign cu un set larg de fișiere curate: installere, scripturi și documente din propriul tău mediu. Pentru scrierea regulilor propriu-zise, vezi Reguli Sigma și YARA cu AI. Pentru triajul din care provin string-urile, vezi Analiza malware cu Odin.

Revizuiește ce construiește

Un instrument scris de un agent rămâne instrumentul tău, iar în securitate un bug discret poate însemna o detecție ratată sau un host din afara scope-ului ajuns în raport. Înainte să te bazezi pe oricare dintre aceste instrumente:

  • Citește diff-ul. Caută căi hardcodate, excepții înghițite și orice atinge rețeaua când n-ar trebui.
  • Rulează singur testele și adaugă un caz la care agentul nu s-a gândit, cum ar fi un fișier gol sau o linie într-un encoding neașteptat.
  • Dă-i un input cunoscut, cu un răspuns cunoscut. Parserul ar trebui să reproducă fidel liniile tale de exemplu, normalizatorul ar trebui să elimine host-ul de test din afara scope-ului, iar harness-ul ar trebui să semnaleze un fals pozitiv introdus intenționat.
  • Păstrează în repository, lângă cod, prompturile pe care le-ai folosit, ca următorul om să vadă ce i s-a cerut instrumentului.

Primii pași

Creează în consolă o cheie API cu limită lunară de cost, rulează scriptul de configurare și urmează ghidul pentru Claude Code. Pentru folosirea directă a API-ului, începe cu quickstart-ul. Ține fiecare instrument și fiecare țintă în limitele scope-ului autorizat și ale Politicii de utilizare acceptabile.