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.
| Effect | Rezultat |
|---|---|
| allow | jedziemy bez pytania |
| ask | czekamy na decyzję klienta (raz/zawsze/odrzuć) |
| deny | blokada — nawet zatwierdzone „zawsze” nie przebije deny |
{
"$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" }
]
}Brak pasującej reguły = zachowanie domyślne jak ask. Nie licz na „domyślnie allow”.
Dostępne akcje i ich zasoby
| Akcja | Zasó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!) |
| shell | tekst komendy z parsera; komendy złożone dają kilka zasobów |
| subagent | ID agenta-docelowego |
| skill | ID skilla |
| question | "*" |
| webfetch | URL |
| websearch | fraza wyszukiwania |
| external_directory | granica 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.
| Agent | Dodatkowa polityka |
|---|---|
| build | pytania dozwolone |
| plan | pytania OK; edycje zablokowane poza ~/.opencode/plan |
| general | zakaz pytań i zakaz odpalania subagentów |
| explore | tylko read/glob/grep/webfetch/websearch; ask dla katalogów zewnętrznych i .env |
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
{
"permissions": [
{ "action": "shell", "resource": "*", "effect": "ask" },
{ "action": "shell", "resource": "git status *", "effect": "allow" }
],
"agents": {
"reviewer": {
"mode": "subagent",
"permissions": [
{ "action": "edit", "resource": "*", "effect": "deny" }
]
}
}
}{
"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ór | Efekt |
|---|---|
| Allow once | zgoda na ten jeden request |
| Allow always | zgoda + zapis szablonu (np. prefix shell) jako trwałej reguły allow projektu |
| Reject | odrzucenie tego i wszystkich oczekujących próśb w sesji |
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": [
{ "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.