rakit-agent/hermes
step 06

Rahasia & credential: bukan di memory

Kesalahan paling umum: ngetik "inget ya, API key gw adalah sk-abc..." ke agent. Jangan. Memory itu teks yang di-inject ke prompt tiap sesi, kebaca model, dan bisa bocor lewat output. Credential punya rumah sendiri.

Aturan satu kalimat

Rahasia (API key, bot token, password) → ~/.hermes/.env. Setting (model, backend, limit) → config.yaml. Fakta soal lo → memory. Kalau dua-duanya keset, config.yaml menang buat setting non-rahasia.

Kenapa memory bukan tempatnya

  • MEMORY.md / USER.md masuk ke system prompt setiap sesi. Artinya tiap request ke provider LLM bawa rahasia lo.
  • Model bisa "kepeleset" nge-quote isinya di jawaban, log, atau di skill yang dia bikin sendiri.
  • Memory itu dikirim lewat provider eksternal kalau lo pake Mem0/Hindsight.
  • Memory punya scanner yang nolak pola credential/exfiltration, tapi jangan ngandelin itu sebagai satu-satunya pagar.

Cara yang bener: .env

~/.hermes/.env
# provider LLM
OPENROUTER_API_KEY=sk-or-...
# messaging
TELEGRAM_BOT_TOKEN=7123456789:AAH...
TELEGRAM_ALLOWED_USERS=123456789
# tools
XAI_API_KEY=xai-...
# sandbox batas tulis (opsional)
HERMES_WRITE_SAFE_ROOT=/home/bima/projects

Atau lewat CLI, yang otomatis ngerutein key ke file yang bener:

bash
$ hermes config set OPENROUTER_API_KEY sk-or-...   # → masuk .env
$ hermes config set model.default openrouter/...  # → masuk config.yaml
$ chmod 600 ~/.hermes/.env                        # cuma lo yang bisa baca

Referensi dari config, bukan nilai

Kalau sebuah config butuh secret (misal MCP server), tulis ${NAMA_VAR} di config.yaml dan taruh nilainya di .env. Jadi config.yaml aman di-commit / di-share buat konten.

~/.hermes/config.yaml
mcp_servers:
  github:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
    env:
      GITHUB_TOKEN: ${GITHUB_TOKEN}     # nilai asli di .env

Sub-proses MCP cuma nerima env var yang lo deklarasiin eksplisit di blok env, bukan seluruh environment lo.

Pagar bawaan yang ngejaga rahasia

PagarEfek
Blocked write pathsAgent gak bisa nulis ke .env, auth.json, ~/.ssh/, ~/.aws/, ~/.netrc, data pairing. Tanpa prompt, langsung tolak.
security.redact_secrets: true (default)API key, token, password di-redact dari output tool dan log.
Log auto-redacterrors.log dan gateway.log gak nyimpen secret mentah.
Scanner memory & contextNolak entri yang keliatan kayak "baca credential" atau exfiltration.

Pagar nulis bukan pagar baca. Agent dengan terminal nyala tetep bisa cat ~/.hermes/.env kalau disuruh atau kalau kena injection. Makanya: taruh larangan baca di SOUL.md, tambah deny rule "*cat*.env*" kalau perlu, dan buat bot publik pake backend docker/ssh biar .env host-nya gak ada di sana.

Credential tool pihak ketiga (contoh: X / xurl)

Beberapa tool nyimpen credential-nya sendiri, misal xurl di ~/.xurl. Aturan dari skill resminya tegas:

  • Agent gak boleh baca, print, parse, upload, atau kirim ~/.xurl ke konteks LLM.
  • Lo isi file itu manual di mesin lo sendiri. Registrasi & rotasi credential dilakuin di luar sesi agent.
  • Jangan pernah paste credential ke chat agent. Jangan pake --verbose di sesi agent.

Pola yang sama berlaku buat tool apapun: credential diisi manusia di luar sesi, agent cuma manggil CLI-nya.

Buat konten: cara nunjukin tanpa bocor

  • Rekam layar pake env dummy: TELEGRAM_BOT_TOKEN=xxxx:REDACTED.
  • Pake profile terpisah buat demo (hermes -p demo) biar .env asli gak kebuka.
  • hermes config get bisa nge-resolve ${VAR} jadi nilai asli di beberapa versi. Jangan jalanin itu on-camera buat key yang kepake.
  • Abis rekaman, rotasi token yang sempet keliatan. Selalu.