Przejdź do głównej zawartości

Uprawnienia, sandboksy i tryby zatwierdzania w Claude Code, Codex i Cursorze

Uprawnienia i sandboksy w Claude Code, Codex i Cursorze to trzy osobne mechanizmy: warstwa zatwierdzania decyduje, czy akcja się wykona, sandboks systemowy ogranicza, co polecenie powłoki może czytać i zapisywać, a lista dozwolonych hostów ogranicza, z czym to polecenie może się połączyć. Praca bez nadzoru jest bezpieczna dopiero wtedy, gdy ustawione są wszystkie trzy, a nie sama warstwa zatwierdzania.

Agent poprosił o zgodę czterdzieści razy podczas jednego refaktoringu, więc ktoś dodał flagę obejścia „tylko na dziś”. Dwa tygodnie później flaga siedzi w jobie CI, który triażuje publiczne zgłoszenia, runner trzyma token do publikacji paczki w npm, a nikt nie potrafi powiedzieć, która granica zatrzymałaby wstrzyknięty curl. Ta strona jest dla developera, który konfiguruje sesję, dla tech leada, który odpowiada za wspólne ustawienia, i dla CTO, który podpisuje się pod tym, do czego agenci bez nadzoru mają dostęp. To krok 4 ścieżki developera, po kontekście repozytorium, bo każdy kolejny krok, od worktree po potok od zgłoszenia do PR, zakłada, że te granice już istnieją.

  • Macierz mechanizmów zatwierdzania, sandboksa, sieci i poświadczeń w Claude Code v2.1.283, Codex CLI 0.157.1 i Cursorze.
  • Tabelę ustawień dla każdej klasy ryzyka i typu uruchomienia (interaktywne, w tle, CI).
  • Konfigurację do zacommitowania dla wszystkich trzech narzędzi, w tym job GitHub Actions z Codex.
  • Test kanarkowy, który dowodzi, że granica trzyma, zamiast ufać plikowi ustawień.
  • Trzy prompty do skopiowania i typowe awarie ze sposobami wyjścia.

Jakich trzech warstw potrzebuje każde uruchomienie agenta?

Dział zatytułowany „Jakich trzech warstw potrzebuje każde uruchomienie agenta?”

Dostawcy różnie nazywają odpowiedzi na te same trzy pytania. Mocna odpowiedź na jedno nie zastępuje pozostałych.

WarstwaNa jakie pytanie odpowiadaClaude CodeCodexCursor
ZatwierdzanieCzy ta akcja się wykona i kto mówi „tak”?Tryby uprawnień i reguły allow/ask/denyPolityka zatwierdzania i auto-reviewRun modes i Auto-review
Sandboks systemowyCo uruchomione polecenie może czytać i zapisywać?Sandboksowane narzędzie BashSandboks albo profil uprawnieńSandboks dla poleceń powłoki
Ruch wychodzącyZ czym uruchomione polecenie może się połączyć?Proxy sandboksa z listą dozwolonych domenUstawienie sieci w profiluNiezweryfikowane (niżej)

Warstwa zatwierdzania ocenia tekst polecenia, zanim się uruchomi. Sandboks egzekwuje system operacyjny na działającym procesie. Przewodnik Anthropic po sandboksie ujmuje tę różnicę wprost: granica sandboksa „holds regardless of what the model chose to run and even if an allowed command does more than its name suggests”. Reguła deny na Bash(curl *) zatrzyma curl, ale nie python -c, który sam otworzy gniazdo sieciowe; sandboks zatrzyma oba.

Poza tymi trzema warstwami leży granica zewnętrzna: laptop, kontener, maszyna wirtualna albo środowisko chmurowe, w którym działa agent, razem z jego poświadczeniami. Jej wybór opisują środowiska efemeryczne, a katalog narzędzi porównanie sandboksów dla agentów.

Jak Claude Code, Codex i Cursor wypadają w porównaniu uprawnień i sandboksów?

Dział zatytułowany „Jak Claude Code, Codex i Cursor wypadają w porównaniu uprawnień i sandboksów?”

Sprawdzone 2026-09-26 na claude --help 2.1.283 oraz dokumentacji Anthropic o uprawnieniach, sandboksie i środowiskach chmurowych; na codex --help 0.157.1, kodzie źródłowym z tagu rust-v0.157.1 i README openai/codex-action; oraz na paczce @cursor/sdk 1.0.32. Dokumentacja Cursora była tego dnia nieosiągalna z naszego środowiska, więc kolumna Cursora zawiera tylko to, co potwierdza paczka SDK albo sprawdzenie dokumentacji z 2026-08-28.

MechanizmClaude Code 2.1.283Codex CLI 0.157.1Cursor
Tryby zatwierdzaniadefault (widoczny jako Manual), acceptEdits, plan, auto, dontAsk, bypassPermissions; przełączanie Shift+Tabapproval_policy: untrusted, on-request (domyślny), granular, never. Flaga -a przyjmuje tylko on-request i neverStrona Run modes w sekcji Agent security; zgłaszane tryby to Auto-review (domyślny), Allowlist i Run Everything (niezweryfikowane, 2026-09-26)
Model zatwierdza zamiast ciebieTryb auto: klasyfikator (domyślnie Claude Sonnet 5) ocenia akcje. Od v2.1.283 (kanał latest) to tryb startowy sesji interaktywnychAuto-review: approvals_reviewer = "auto_review" w konfiguracji albo --approve-for-meAuto-review (opcja SDK local.autoReview)
Reguły poleceńpermissions.allow, ask, deny, sprawdzane w kolejności deny, ask, allowPliki .rules (eksperymentalne) decydują, które polecenia mogą działać poza sandboksemHooki: JSON przez stdio, które „can observe, block, or modify behavior”
Sandboks systemowyPolecenia Bash, PowerShell i Monitor. macOS Seatbelt, Linux i WSL2 bubblewrap; natywny Windows nieobsługiwanyKażde polecenie powłoki wygenerowane przez model. macOS Seatbelt, Linux i WSL2 bubblewrap; WSL1 odrzucanylocal.sandboxOptions w SDK; /sandbox na liście poleceń CLI
Domyślna granica zapisuKatalog roboczy, katalog tymczasowy użytkownika i katalogi dodane przez --add-dirProfil :workspace zapisuje w katalogu roboczym; :read-only nie zapisuje nicNiezweryfikowane
Domyślna siećŻadna domena nie jest dozwolona z góry; pierwsze użycie hosta wywołuje pytanie albo, w trybie auto, trafia do klasyfikatora:workspace „does not grant network access” (README codex-action; potwierdzone lokalnie, patrz test kanarkowy)Niezweryfikowane
Lista dozwolonych hostówsandbox.network.allowedDomains, deniedDomains, strictAllowlist, zarządzane allowManagedDomainsOnlyNazwane profile [permissions] mają reguły allow i deny per domena (beta); starsze network_access działa na zasadzie wszystko albo nicNiezweryfikowane
Sekrety w środowiskusandbox.credentials: deny albo mask dla plików i zmiennych; domyślnie nic nie jest chronioneshell_environment_policy: ignore_default_excludes ma domyślnie true, więc zmienne *KEY*, *SECRET*, *TOKEN* trafiają do poleceń, dopóki nie ustawisz falseNiezweryfikowane
Pełne obejście--dangerously-skip-permissions; odmowa pod rootem albo sudo poza rozpoznanym sandboksem--dangerously-bypass-approvals-and-sandboxNiezweryfikowane
Blokada administratoraUstawienia zarządzane: disableBypassPermissionsMode, disableAutoMode, sandbox.failIfUnavailable, allowManagedDomainsOnlyrequirements.toml: allowed_approval_policies, allowed_approvals_reviewers, allowed_permission_profiles, experimental_network, rules (sprawdzone w config_requirements.rs z tagu rust-v0.157.1)Warstwa ustawień mdm (settingSources w SDK)

Uwagi: sandboks Claude Code obejmuje tylko polecenia powłoki; narzędzia Read, Edit i Write podlegają regułom uprawnień, nie sandboksowi. Profile uprawnień Codex (beta, od 0.138.0) i starsze wartości --sandbox „do not compose”, więc w jednej konfiguracji wybierz jedno z nich.

Jakie ustawienia pasują do klasy ryzyka i typu uruchomienia?

Dział zatytułowany „Jakie ustawienia pasują do klasy ryzyka i typu uruchomienia?”

Klasa ryzyka należy do zmiany, nie do zespołu. Uruchomienie dostaje ustawienia najwyższej klasy, jakiej może dotknąć: zadanie „tylko dokumentacja” w repozytorium z kodem rozliczeń działa z ustawieniami rozliczeń, chyba że sandboks odcina mu te ścieżki. Tech lead odpowiada za tę tabelę w każdym repozytorium; CTO albo właściciel bezpieczeństwa podpisuje wiersz krytyczny i każdy wyjątek.

Klasa ryzykaWarstwa zatwierdzaniaSystem plikówSiećPoświadczenia w środowisku
Niska (dokumentacja, narzędzia wewnętrzne)Model recenzujący (tryb auto, auto-review)Zapis w katalogu roboczymTylko rejestry paczekNic poza tokenem repozytorium tylko do odczytu
Średnia (logika funkcji za flagą)Model recenzujący plus reguły ask na git push i zmiany zależnościZapis w katalogu roboczym, odczyt ścieżek z sekretami zablokowanyRejestry plus nazwane hosty wewnętrzne, ścisła listaZamaskowane albo brak
Wysoka (publiczne API, testy, konfiguracja CI)Model recenzujący dla kodu; reguły ask na .github/, ścieżki testów i konfiguracji CIZapis w katalogu roboczym; edycja konfiguracji CI wymaga zgodyŚcisła lista, bez symboli wieloznacznych (wildcardów) dla hostów, które przyjmują przesyłane plikiBrak
Krytyczna (uwierzytelnianie, pieniądze, migracje, sekrety, sam harness)Tryb Manual albo plan; nigdy obejścieZapis w katalogu roboczym wewnątrz jednorazowego kontenera albo VMŻadnego ruchu poza mirrorem rejestruNigdy żadnych produkcyjnych poświadczeń

W uruchomieniu w tle albo w CI nikt nie odpowie na pytanie, więc typ uruchomienia ogranicza wybór warstwy zatwierdzania:

Typ uruchomieniaWarstwa zatwierdzania, która działaCo zastępuje człowiekaGranica zewnętrzna
InteraktywneDowolny tryb; tryb auto albo auto-review przy długich zadaniachTy, przy pytaniach, które zostałyTwój laptop, więc cały ciężar niesie sandboks
W tle albo w chmurzeModel recenzujący; obejście tylko w jednorazowej VM albo kontenerzeKlasyfikator lub recenzent plus poziom sieci środowiska chmurowegoVM dostawcy albo twój własny runner
CIDokładna lista dozwolonych narzędzi (dontAsk) albo never z profilemSama lista: wszystko spoza niej jest odrzucaneJednorazowy runner z wąsko ograniczonymi tokenami

Zacommituj bazowe ustawienia zespołu do repozytorium, a elementy nienegocjowalne przenieś do ustawień zarządzanych, których użytkownik nie nadpisze. Dystrybucję jednej polityki na wszystkie narzędzia opisuje polityka zarządzana.

Bazowe ustawienia projektu w .claude/settings.json (klasa średnia): sandboks włączony, bez ponawiania poza sandboksem, ograniczony ruch wychodzący, dwa tokeny zabrane poleceniom w sandboksie i pytanie przy pushu i edycji CI:

{
"permissions": {
"deny": ["Read(./.env)", "Read(./.env.*)", "Bash(terraform apply *)"],
"ask": ["Bash(git push *)", "Edit(/.github/**)"]
},
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"network": {
"allowedDomains": ["registry.npmjs.org", "github.com", "api.github.com", "codeload.github.com"]
},
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "NPM_TOKEN", "mode": "deny" },
{ "name": "GITHUB_TOKEN", "mode": "deny" }
]
}
}
}

Ustawienia zarządzane dla organizacji, dostarczane przez MDM albo z serwera, trzymają klucze, których sklonowane repozytorium nie może ustawić ani poluzować:

{
"permissions": { "disableBypassPermissionsMode": "disable" },
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false,
"network": { "strictAllowlist": true, "allowManagedDomainsOnly": true }
}
}
  • Lista wymienia konkretne hosty GitHuba zamiast *.github.com, bo symbol wieloznaczny pasowałby też do gist.github.com i uploads.github.com, czyli miejsc, do których wstrzyknięte polecenie mogłoby wysłać dane.
  • Ustawienia projektu nie uruchomią sesji w trybie auto ani bypassPermissions; te wartości są tam ignorowane. Tryb startowy ustaw w ustawieniach użytkownika albo zarządzanych.
  • strictAllowlist odrzuca hosty spoza listy zamiast pytać i nie działa w plikach ustawień repozytorium. Wymaga v2.1.219 lub nowszej.
  • Na Linuksie i WSL2 najpierw zainstaluj bubblewrap i socat. Uruchom /sandbox w sesji: jeśli widzisz tylko zakładkę Dependencies, sandboks nie działa.
  • /permissions pokazuje każdą aktywną regułę i plik, z którego pochodzi, oraz ostatnie odmowy trybu auto.

Uruchomienie w tle nie odpowie na pytanie, więc warstwa zatwierdzania decyduje sama, a poziom sieci środowiska staje się główną kontrolą ruchu wychodzącego.

  • Sesje chmurowe (claude.ai/code, routines) mają poziom Network access: None, Trusted (rejestry paczek, GitHub i SDK chmurowe; domyślny), Full albo Custom. Ruch do GitHuba, włączone konektory MCP i API Anthropic go omijają, więc wyłącz konektory, których zadanie nie potrzebuje.
  • Sesje chmurowe ignorują defaultMode: "bypassPermissions" i "dontAsk" z plików ustawień, więc repozytorium nie uruchomi takiej sesji w trybie obejścia.
  • Lokalne sesje w tle uruchamiane z --bg są odrzucane w trybie obejścia, dopóki raz nie zaakceptujesz ostrzeżenia w sesji interaktywnej. W sesjach w tle ścisły tryb sandboksa obejmuje też polecenia wpisane po !.

W CI agent styka się z niezaufanym tekstem: tytułami zgłoszeń, opisami pull requestów i diffami z forków. Daj jobowi dokładną listę dozwolonych narzędzi, sandboks ograniczony do katalogu roboczego i token ograniczony do jego jednego zadania. Utwardzanie GitHub Actions (pull_request_target, uprawnienia tokenów, OIDC) opisuje strona tożsamość agentów, poświadczenia i sekrety.

dontAsk odrzuca wszystko, co wymagałoby pytania, więc lista dozwolonych narzędzi jest całą polityką. --permission-prompts none gwarantuje, że nic nie czeka na odpowiedź. --settings włącza sandboks dla tego uruchomienia i zabrania ponowienia polecenia poza nim, a reguła --disallowedTools trzyma testy, czyli wyrocznię, poza zasięgiem Edit (dopasuj /tests/** do układu repozytorium, w tej samej postaci ścieżki co pozostałe reguły na tej stronie):

Okno terminala
# CI: uruchom i napraw testy, nic więcej
claude -p "Run the test suite and fix failing tests in src/. Do not edit tests." \
--permission-mode dontAsk \
--permission-prompts none \
--settings '{"sandbox":{"enabled":true,"allowUnsandboxedCommands":false}}' \
--allowedTools "Read" "Edit" "Bash(npm test)" "Bash(npm run lint)" \
--disallowedTools "Edit(/tests/**)"

Sesje claude -p startują w trybie Manual, więc akcje spoza listy są odrzucane nawet bez --permission-mode. Przy jobie triażu tylko do odczytu --restricted usuwa narzędzia uruchamiające polecenia i WebFetch, chyba że wymieni je --tools, i odmawia bypassPermissions.

Plik ustawień to deklaracja. Test kanarkowy to dowód: polecenie, które przy danej polityce musi się nie udać, uruchomione tak, jak uruchamia je agent. Uruchom go przy ustawianiu polityki, przy każdej zmianie ustawień harnessu i po każdej aktualizacji narzędzia.

  1. Wybierz trzy próby dla danych ustawień: zapis poza katalogiem roboczym, odczyt ścieżki z sekretem i połączenie z hostem spoza listy dozwolonych.

  2. W Codex przepuść próby przez codex sandbox, który stosuje ten sam sandboks, jaki dostaje agent. Z codex-cli 0.157.1 na Linuksie to uruchomienie wypisało ok, potem Read-only file system dla /etc, a na koniec odmowę połączenia dla curl:

    Okno terminala
    codex sandbox -c 'default_permissions=":workspace"' -- sh -c \
    'echo ok > probe.txt && cat probe.txt; echo x > /etc/probe; curl -sS -m 5 https://example.com'
  3. W Claude Code i Cursorze uruchom prompt kanarkowy z sekcji niżej w sesji z ustawieniami, które wdrażasz. Każda próba musi zostać zablokowana albo odrzucona; przy ustawieniach dla pracy w tle i w CI pytanie o zgodę liczy się jako porażka.

  4. Zapisz wynik w pakiecie dowodów pull requesta, który zmienił ustawienia. Właściciel harnessu podpisuje wynik testu kanarkowego, a nie diff ustawień.

  5. Powtarzaj test kanarkowy w CI przy każdej zmianie .claude/settings.json, config.toml albo hooka. Zmiany w harnessie mają klasę krytyczną.

Co psuje się w uprawnieniach i sandboksach agentów i jak z tego wyjść

Dział zatytułowany „Co psuje się w uprawnieniach i sandboksach agentów i jak z tego wyjść”
  • Sandboks po cichu nie działa. Domyślnie, gdy brakuje bubblewrap albo socat albo system to natywny Windows, Claude Code tylko ostrzega i uruchamia polecenia bez sandboksa. Wyjście: ustaw sandbox.failIfUnavailable: true w ustawieniach zarządzanych, a na Ubuntu 24.04 i nowszym dodaj profil AppArmor dla bwrap z przewodnika Anthropic po sandboksie.
  • Agent ponawia polecenie poza sandboksem. Claude Code może powtórzyć zablokowane polecenie z dangerouslyDisableSandbox; przechodzi ono zwykłe zatwierdzanie, więc w trybie auto klasyfikator może je przepuścić. Wyjście: allowUnsandboxedCommands: false albo reguła ask na Bash(dangerouslyDisableSandbox:true).
  • Reguła deny omijana inną pisownią. Bash(curl *) nie pasuje do sh -c 'curl …'. Wyjście: traktuj reguły poleceń jako pierwsze sito; kontrolą ruchu wychodzącego jest lista dozwolonych hostów.
  • Ustawienia projektu, które nic nie robią. auto albo bypassPermissions jako defaultMode, strictAllowlist, wpisy mask dla poświadczeń i filesystem.disabled są ignorowane w ustawieniach .claude/ repozytorium. Wyjście: przenieś je do ustawień użytkownika albo zarządzanych.
  • Dozwolony host służy za wyjście. Symbol wieloznaczny na hoście, który przyjmuje przesyłane pliki albo gisty, pozwala wstrzykniętemu poleceniu wysłać dane przez zatwierdzoną domenę; wśród advisory samego Claude Code jest wyciek przez dozwoloną z góry domenę HuggingFace w WebFetch (Moderate, 2026-06-13); ten sam wzorzec dotyczy każdego dozwolonego hosta przyjmującego przesyłane pliki. Wyjście: dopuszczaj konkretne hosty, preferuj mirror rejestru i wpisz endpointy przesyłania plików do deniedDomains.
  • Sekrety jadą razem ze środowiskiem. Codex przekazuje poleceniom zmienne *TOKEN*, dopóki nie ustawisz ignore_default_excludes = false; Claude Code chroni tylko to, co wymienisz. Wyjście: usuń je albo zamaskuj, a produkcyjne poświadczenia trzymaj poza środowiskami agentów.
  • Codex odrzuca flagi. codex -a untrusted i -a on-failure kończą się w 0.157.1 błędem „invalid value”, codex exec -a never błędem „unexpected argument”, a profil razem z --sandbox się nie składa. Wyjście: untrusted i granular ustaw w config.toml, -a podawaj przed exec, wybierz profile albo starsze flagi, nie oba naraz.
  • Uruchomienie -p po cichu pomija zablokowaną pracę. W headless Claude Code z trybem auto trzy blokady klasyfikatora z rzędu albo 20 łącznie wstrzymują tryb auto; akcja się nie wykona, a Claude pracuje dalej. Wyjście: nie opieraj wyniku joba na kodzie wyjścia agenta; uruchom testy i lint w osobnym kroku CI i to one niech decydują o porażce.
  • Sam agent ma błędy. Wśród advisory bezpieczeństwa Claude Code jest ucieczka z sandboksa przez pomylenie ścieżek git worktree (High, 2026-06-25) i obejście okna zaufania do workspace przez plik ustawień kontrolowany przez repozytorium (High, 2026-03-18). Wyjście: zostań na wspieranym kanale, dla klasy krytycznej zachowaj zewnętrzny kontener i powtarzaj test kanarkowy po każdej aktualizacji.

Najczęstsze pytania

Czy tryb uprawnień to to samo co sandboks?

Nie. Tryb uprawnień albo polityka zatwierdzania decyduje, czy akcja się wykona i kto ją zatwierdza. Sandboks systemowy ogranicza, co uruchomione polecenie powłoki może czytać, zapisywać i z czym się łączyć. Praca bez nadzoru wymaga obu, a do tego listy dozwolonych hostów.

Które ustawienie pozwala bezpiecznie puścić agenta bez nadzoru?

Żadne w pojedynkę. Połącz warstwę zatwierdzania z modelem recenzującym albo listą dozwolonych narzędzi (tryb auto lub dontAsk w Claude Code, auto-review lub never w Codex) z sandboksem ograniczonym do katalogu roboczego, listą dozwolonych hostów i brakiem produkcyjnych poświadczeń w środowisku.

Kiedy wolno wyłączyć wszystkie kontrole uprawnień?

Tylko wewnątrz zewnętrznej granicy, którą kontrolujesz, na przykład jednorazowego kontenera albo maszyny wirtualnej bez produkcyjnych poświadczeń i z ograniczonym ruchem wychodzącym. Tak samo mówią opisy flag obejścia w pomocy obu narzędzi.