</>Kurs OpenCode
Kurs/rozdział 0825 min

Uprawnienia i polityki

Reguły allow/ask/deny, kolejność łączenia, domyślne polityki agentów i twarde veta organizacji.

Model reguły: action + resource + effect

Uprawnienie odpowiada na pytanie: „czy agentowi wolno użyć ZASOBU w ramach AKCJI?”. Effect ma trzy wartości, a reguły są przetwarzane PORZĄDKOWO — ostatnia pasująca wygrywa, więc pisz od ogółu do wyjątków.

EffectRezultat
allowjedziemy bez pytania
askczekamy na decyzję klienta (raz/zawsze/odrzuć)
denyblokada — nawet zatwierdzone „zawsze” nie przebije deny
Klasyk: pytaj o shell, ale git status/diff wolno, push zabroniony
{
  "$schema": "https://opencode.ai/config.json",
  "permissions": [
    { "action": "shell", "resource": "*", "effect": "ask" },
    { "action": "shell", "resource": "git status *", "effect": "allow" },
    { "action": "shell", "resource": "git diff *", "effect": "allow" },
    { "action": "shell", "resource": "git push *", "effect": "deny" }
  ]
}
ℹ
Info

Brak pasującej reguły = zachowanie domyślne jak ask. Nie licz na „domyślnie allow”.

Dostępne akcje i ich zasoby

AkcjaZasób podlegający dopasowaniu
readścieżka wewnętrzna lub znormalizowana zewnętrzna
editścieżka celu dla edit/write/patch
globżądany wzorzec glob
grepżądany regex (NIE ścieżka!)
shelltekst komendy z parsera; komendy złożone dają kilka zasobów
subagentID agenta-docelowego
skillID skilla
question"*"
webfetchURL
websearchfraza wyszukiwania
external_directorygranica katalogu zewnętrznego, zwykle kończy się /*
<serwer>_<narzędzie>"*" dla narzędzia MCP
execute"*" — włącza/wyłącza Code Mode; narzędzia zagnieżdżone liczą się osobno

Dopasowanie i wildcardy

  • * = zero lub więcej znaków (także /), ? = dokładnie jeden znak; reszta to literal.
  • Wzorzec shell kończący się " *" łapie też komendę bez argumentów: "git status *" ≈ git status i git status --short.
  • Dla read/edit/external_directory działają ~/ i $HOME (rozwijane przy ładowaniu konfiguracji); zasoby shell zostają surowym tekstem.
  • Operacja może sprawdzać wiele zasobów (patch na kilka plików): choć jedno deny => deny; inaczej choć jedno ask => ask; else allow.
  • Łączenie plików: konfiguracja niższego priorytetu → globalne permissions → reguły agenta na końcu.

Domyślne polityki, o których warto wiedzieć

Każdy agent startuje z bazową polityką: allow *, ale external_directory i odczyt *.env/*.env.* → ask (env.example → allow). Agenci wbudowani dokładają własne warstwy.

AgentDodatkowa polityka
buildpytania dozwolone
planpytania OK; edycje zablokowane poza ~/.opencode/plan
generalzakaz pytań i zakaz odpalania subagentów
exploretylko read/glob/grep/webfetch/websearch; ask dla katalogów zewnętrznych i .env
⚠
Uwaga

Plik .env jest domyślnie za pytaniem (ask), ale to NIE sandbox. Agent ma siłę Twojego konta użytkownika przez shell — realne ogrodzenie to deny + polityki.

Reguły per agent i katalogi zewnętrzne

Wspólne bazy + zawężenia konkretnego agenta
{
  "permissions": [
    { "action": "shell", "resource": "*", "effect": "ask" },
    { "action": "shell", "resource": "git status *", "effect": "allow" }
  ],
  "agents": {
    "reviewer": {
      "mode": "subagent",
      "permissions": [
        { "action": "edit", "resource": "*", "effect": "deny" }
      ]
    }
  }
}
Dostęp do repo referencyjnego poza workspace: czytaj, nie pisz
{
  "permissions": [
    { "action": "external_directory", "resource": "~/projects/reference/*", "effect": "allow" },
    { "action": "read", "resource": "~/projects/reference/*", "effect": "allow" },
    { "action": "edit", "resource": "~/projects/reference/*", "effect": "deny" }
  ]
}

Fala zatwierdzania: raz / zawsze / odrzuć

WybórEfekt
Allow oncezgoda na ten jeden request
Allow alwayszgoda + zapis szablonu (np. prefix shell) jako trwałej reguły allow projektu
Rejectodrzucenie tego i wszystkich oczekujących próśb w sesji
✦
Wskazówka

Przykręć zaległości: przeglądaj zapisane „always” co jakiś czas i usuwaj za szerokie (narzędzia potrafią zapisywać *). Zawsze możesz dopisać deny, które je unieważni.

Policies — twarde weto ponad konfiguracją

Policy potrafi zamienić allow/ask na deny i nigdy nie grantuje dostępu. Globalne i konsolowe (organizacyjne) polityki biją projektowe — dokładnie do blokowania niebezpiecznych komend w firmowych repozytoriach.

experimental.policies: veta, którego repo nie podniesie
{
  "experimental": {
    "policies": [
      { "action": "provider.use", "resource": "*", "effect": "deny" },
      { "action": "provider.use", "resource": "anthropic", "effect": "allow" },
      { "action": "permission", "resource": "shell:sudo *", "effect": "deny" }
    ]
  }
}

Checklista twardych uprawnień

  • deny dla: git push, rm -rf, sudo, migracji produkcyjnych.
  • allow-lista rutyn: git status/diff/log, bun test, bun run lint.
  • Zewnętrzne katalogi wyłącznie read-only (external_directory + deny edit).
  • Oddzielne reguły skill/subagent dla agentów o niższym zaufaniu.
  • Test: uruchom zadanie i sprawdź, O CO agent pyta — każdy brak pytania w newralgicznym miejscu to dziura w regułach.
8. Uprawnienia i polityki — Kurs OpenCode