Agentsäkerhet: behörigheter, sandlåda, bekräftelse
Kunna begränsa vad en agent får göra och kräva bekräftelse för irreversibla handlingar.
Förkunskaper
Intuition
En agent som kan läsa är ett informationsproblem. En agent som kan skriva, skicka, betala eller radera är ett säkerhetsproblem.
Klassificera varje verktyg innan det kopplas in:
| Klass | Exempel | Regel |
|---|---|---|
| Läs, publikt | söka i dokumentation | fritt |
| Läs, känsligt | kunddata, personuppgifter | behörighetskontroll per användare, loggas |
| Skriv, återställbart | skapa utkast, kommentera | tillåtet, loggas, går att ångra |
| Skriv, oåterkalleligt | skicka mejl, betala, radera | kräver mänsklig bekräftelse av det konkreta anropet |
Bekräftelsen ska visa exakt vad som ska hända — mottagare, belopp, innehåll — inte «agenten vill skicka ett mejl, OK?».
Formellt
Sandlådans lager (som i AI-grafens labbrunner, ADR-003):
| Lager | Åtgärd | Stoppar |
|---|---|---|
| Nätverk | --network none | exfiltrering, nedladdning, metadatatjänster |
| Filsystem | read-only rootfs + tmpfs | persistens, manipulation av bilden |
| Användare | uid 65534, no-new-privileges | privilegieeskalering |
| Kapabiliteter | cap-drop ALL | kernel-operationer |
| Resurser | cpu, minne, pids, timeout | resursutmattning |
| Livstid | container tas bort efter körning | kvarvarande tillstånd |
Nätverksisoleringen är den viktigaste eftersom nästan all skada kräver att något lämnar maskinen eller hämtas in.
Budget som säkerhetsmekanism: max steg, max tokens, max verktygsanrop per körning och per användare och dag. Utan det kan en loopande agent kosta mer på en natt än tjänsten omsätter på en månad.
Loggning för granskning i efterhand: varje verktygsanrop med argument (trunkerade, maskerade), resultat, tidsstämpel och vem som initierade. Utan spår går en incident inte att utreda.
Gränsen som är lätt att missa: agentens behörighet ska vara användarens behörighet, inte systemets. En agent som kör med tjänstekontots rättigheter kan nås av vilken användare som helst för att komma åt vad som helst.
Kod
from dataclasses import dataclass
from enum import Enum
class Risk(Enum):
LAS = 1; SKRIV_ATERSTALLBAR = 2; OATERKALLELIG = 3
@dataclass
class Verktyg:
namn: str
risk: Risk
kor: callable
kraver_roll: str | None = None
async def kor_verktyg(v: Verktyg, args: dict, anvandare: dict, bekrafta, logg):
if v.kraver_roll and not har_roll(anvandare, v.kraver_roll):
return {"error": "saknar behörighet"} # användarens behörighet, inte systemets
if v.risk is Risk.OATERKALLELIG:
ok = await bekrafta(f"{v.namn}({sammanfatta(args)})") # visa det KONKRETA anropet
if not ok:
await logg("avbruten_av_anvandare", v.namn, args)
return {"error": "avbruten av användaren"}
await logg("verktyg_anropat", v.namn, args, anvandare["id"])
return await v.kor(args, som=anvandare) # kör som användaren
# Sandlåda för kodkörning — samma inställningar som plattformens labbrunner
docker run --rm --network none --read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=64m \
--user 65534:65534 --cap-drop ALL --security-opt no-new-privileges \
--cpus 1 --memory 512m --pids-limit 128 \
ai-grafen/lab-python:2026.09 timeout 60 python /work/kod.py
Behärskning innebär
- Begränsar en agents behörigheter till minsta nödvändiga
- Kräver bekräftelse för irreversibla handlingar
- Kör kod i sandlåda med rätt begränsningar
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- OWASP Top 10 for LLM Applications — CC BY-SA 4.0
- Docker — security (Apache-2.0) — Apache-2.0