Gateway
Izolacja w piaskownicy
OpenClaw może uruchamiać narzędzia wewnątrz backendów piaskownicy, aby zmniejszyć zasięg potencjalnych szkód. Jest to opcjonalne i kontrolowane przez konfigurację (agents.defaults.sandbox lub agents.list[].sandbox). Jeśli piaskownica jest wyłączona, narzędzia działają na hoście. Gateway pozostaje na hoście; po włączeniu wykonywanie narzędzi odbywa się w izolowanej piaskownicy.
Co trafia do piaskownicy
- Wykonywanie narzędzi (
exec,read,write,edit,apply_patch,processitd.). - Opcjonalna przeglądarka w piaskownicy (
agents.defaults.sandbox.browser).
Szczegóły przeglądarki w piaskownicy
- Domyślnie przeglądarka w piaskownicy uruchamia się automatycznie (zapewnia dostępność CDP), gdy narzędzie przeglądarki jej potrzebuje. Skonfiguruj przez
agents.defaults.sandbox.browser.autoStartiagents.defaults.sandbox.browser.autoStartTimeoutMs. - Domyślnie kontenery przeglądarki w piaskownicy używają dedykowanej sieci Docker (
openclaw-sandbox-browser) zamiast globalnej siecibridge. Skonfiguruj za pomocąagents.defaults.sandbox.browser.network. - Opcjonalne
agents.defaults.sandbox.browser.cdpSourceRangeogranicza przychodzący ruch CDP na krawędzi kontenera za pomocą listy dozwolonych CIDR (na przykład172.21.0.1/32). - Dostęp obserwatora noVNC jest domyślnie chroniony hasłem; OpenClaw emituje krótkotrwały URL z tokenem, który udostępnia lokalną stronę startową i otwiera noVNC z hasłem we fragmencie URL (nie w logach zapytania/nagłówków).
agents.defaults.sandbox.browser.allowHostControlpozwala sesjom w piaskownicy jawnie wskazywać przeglądarkę hosta jako cel.- Opcjonalne listy dozwolonych bramkują
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
Nie trafia do piaskownicy:
- Sam proces Gateway.
- Każde narzędzie jawnie dopuszczone do działania poza piaskownicą (np.
tools.elevated).- Exec z podwyższonymi uprawnieniami omija piaskownicę i używa skonfigurowanej ścieżki wyjścia (
gatewaydomyślnie albonode, gdy celem exec jestnode). - Jeśli piaskownica jest wyłączona,
tools.elevatednie zmienia wykonywania (już odbywa się na hoście). Zobacz Tryb z podwyższonymi uprawnieniami.
- Exec z podwyższonymi uprawnieniami omija piaskownicę i używa skonfigurowanej ścieżki wyjścia (
Tryby
agents.defaults.sandbox.mode kontroluje, kiedy używana jest piaskownica:
off
Bez piaskownicy.
non-main
Piaskownica tylko dla sesji innych niż główne (domyślne, jeśli chcesz, aby zwykłe czaty działały na hoście).
"non-main" opiera się na session.mainKey (domyślnie "main"), a nie na identyfikatorze agenta. Sesje grup/kanałów używają własnych kluczy, więc są liczone jako inne niż główne i będą uruchamiane w piaskownicy.
all
Każda sesja działa w piaskownicy.
Zakres
agents.defaults.sandbox.scope kontroluje, ile kontenerów jest tworzonych:
"agent"(domyślnie): jeden kontener na agenta."session": jeden kontener na sesję."shared": jeden kontener współdzielony przez wszystkie sesje w piaskownicy.
Backend
agents.defaults.sandbox.backend kontroluje, który runtime zapewnia piaskownicę:
"docker"(domyślnie, gdy piaskownica jest włączona): lokalny runtime piaskownicy oparty na Dockerze."ssh": ogólny zdalny runtime piaskownicy oparty na SSH."openshell": runtime piaskownicy oparty na OpenShell.
Konfiguracja specyficzna dla SSH znajduje się w agents.defaults.sandbox.ssh. Konfiguracja specyficzna dla OpenShell znajduje się w plugins.entries.openshell.config.
Wybór backendu
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Gdzie działa | Lokalny kontener | Dowolny host dostępny przez SSH | Piaskownica zarządzana przez OpenShell |
| Konfiguracja | scripts/sandbox-setup.sh |
Klucz SSH + host docelowy | Włączony Plugin OpenShell |
| Model obszaru roboczego | Montowanie bind lub kopiowanie | Zdalny kanoniczny (jednorazowe zasilenie) | mirror lub remote |
| Kontrola sieci | docker.network (domyślnie: brak) |
Zależy od zdalnego hosta | Zależy od OpenShell |
| Piaskownica przeglądarki | Obsługiwana | Nieobsługiwana | Jeszcze nieobsługiwana |
| Montowania bind | docker.binds |
N/D | N/D |
| Najlepsze dla | Lokalny development, pełna izolacja | Przeniesienie obciążenia na zdalną maszynę | Zarządzane zdalne piaskownice z opcjonalną dwukierunkową synchronizacją |
Backend Docker
Piaskownica jest domyślnie wyłączona. Jeśli włączysz piaskownicę i nie wybierzesz backendu, OpenClaw użyje backendu Docker. Wykonuje narzędzia i przeglądarki w piaskownicy lokalnie przez gniazdo demona Docker (/var/run/docker.sock). Izolacja kontenera piaskownicy jest określana przez przestrzenie nazw Docker.
Aby udostępnić GPU hosta piaskownicom Docker, ustaw agents.defaults.sandbox.docker.gpus albo nadpisanie dla agenta agents.list[].sandbox.docker.gpus. Wartość jest przekazywana do flagi Docker --gpus jako osobny argument, na przykład "all" lub "device=GPU-uuid", i wymaga zgodnego runtime hosta, takiego jak NVIDIA Container Toolkit.
Backend SSH
Użyj backend: "ssh", gdy chcesz, aby OpenClaw uruchamiał w piaskownicy exec, narzędzia plikowe i odczyty multimediów na dowolnej maszynie dostępnej przez SSH.
{
agents: {
defaults: {
sandbox: {
mode: "all",
backend: "ssh",
scope: "session",
workspaceAccess: "rw",
ssh: {
target: "user@gateway-host:22",
workspaceRoot: "/tmp/openclaw-sandboxes",
strictHostKeyChecking: true,
updateHostKeys: true,
identityFile: "~/.ssh/id_ed25519",
certificateFile: "~/.ssh/id_ed25519-cert.pub",
knownHostsFile: "~/.ssh/known_hosts",
// Or use SecretRefs / inline contents instead of local files:
// identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },
// certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },
// knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },
},
},
},
},
}
Jak to działa
- OpenClaw tworzy zdalny katalog główny dla danego zakresu w
sandbox.ssh.workspaceRoot. - Przy pierwszym użyciu po utworzeniu lub odtworzeniu OpenClaw jednorazowo zasila ten zdalny obszar roboczy z lokalnego obszaru roboczego.
- Następnie
exec,read,write,edit,apply_patch, odczyty multimediów z promptu i przygotowanie przychodzących multimediów działają bezpośrednio na zdalnym obszarze roboczym przez SSH. - OpenClaw nie synchronizuje automatycznie zdalnych zmian z powrotem do lokalnego obszaru roboczego.
Materiał uwierzytelniający
identityFile,certificateFile,knownHostsFile: używają istniejących plików lokalnych i przekazują je przez konfigurację OpenSSH.identityData,certificateData,knownHostsData: używają ciągów inline albo SecretRefs. OpenClaw rozwiązuje je przez normalną migawkę runtime sekretów, zapisuje do plików tymczasowych z0600i usuwa je po zakończeniu sesji SSH.- Jeśli zarówno
*File, jak i*Datasą ustawione dla tego samego elementu,*Datama pierwszeństwo w tej sesji SSH.
Konsekwencje zdalnego kanonicznego modelu
To jest model zdalny kanoniczny. Zdalny obszar roboczy SSH staje się rzeczywistym stanem piaskownicy po początkowym zasileniu.
- Lokalne na hoście edycje wykonane poza OpenClaw po kroku zasilenia nie są widoczne zdalnie, dopóki nie odtworzysz piaskownicy.
openclaw sandbox recreateusuwa zdalny katalog główny dla danego zakresu i ponownie zasila go z lokalnego obszaru roboczego przy następnym użyciu.- Piaskownica przeglądarki nie jest obsługiwana w backendzie SSH.
- Ustawienia
sandbox.docker.*nie mają zastosowania do backendu SSH.
Backend OpenShell
Użyj backend: "openshell", gdy chcesz, aby OpenClaw uruchamiał narzędzia w piaskownicy w zdalnym środowisku zarządzanym przez OpenShell. Pełny przewodnik konfiguracji, referencję konfiguracji i porównanie trybów obszaru roboczego znajdziesz na dedykowanej stronie OpenShell.
OpenShell ponownie wykorzystuje ten sam główny transport SSH i zdalny most systemu plików co ogólny backend SSH oraz dodaje cykl życia specyficzny dla OpenShell (sandbox create/get/delete, sandbox ssh-config) wraz z opcjonalnym trybem obszaru roboczego mirror.
{
agents: {
defaults: {
sandbox: {
mode: "all",
backend: "openshell",
scope: "session",
workspaceAccess: "rw",
},
},
},
plugins: {
entries: {
openshell: {
enabled: true,
config: {
from: "openclaw",
mode: "remote", // mirror | remote
remoteWorkspaceDir: "/sandbox",
remoteAgentWorkspaceDir: "/agent",
},
},
},
},
}
Tryby OpenShell:
mirror(domyślnie): lokalny obszar roboczy pozostaje kanoniczny. OpenClaw synchronizuje pliki lokalne do OpenShell przed exec i synchronizuje zdalny obszar roboczy z powrotem po exec.remote: obszar roboczy OpenShell jest kanoniczny po utworzeniu piaskownicy. OpenClaw jednorazowo zasila zdalny obszar roboczy z lokalnego obszaru roboczego, a następnie narzędzia plikowe i exec działają bezpośrednio na zdalnej piaskownicy bez synchronizowania zmian z powrotem.
Szczegóły zdalnego transportu
- OpenClaw prosi OpenShell o konfigurację SSH specyficzną dla piaskownicy przez
openshell sandbox ssh-config <name>. - Rdzeń zapisuje tę konfigurację SSH do pliku tymczasowego, otwiera sesję SSH i ponownie wykorzystuje ten sam zdalny most systemu plików używany przez
backend: "ssh". - W trybie
mirrorróżni się tylko cykl życia: synchronizacja lokalnego obszaru do zdalnego przed exec, a następnie synchronizacja z powrotem po exec.
Obecne ograniczenia OpenShell
- piaskownica przeglądarki nie jest jeszcze obsługiwana
sandbox.docker.bindsnie jest obsługiwane w backendzie OpenShell- parametry runtime specyficzne dla Docker w
sandbox.docker.*nadal dotyczą tylko backendu Docker
Tryby obszaru roboczego
OpenShell ma dwa modele obszaru roboczego. To część, która w praktyce ma największe znaczenie.
mirror (lokalny kanoniczny)
Użyj plugins.entries.openshell.config.mode: "mirror", gdy chcesz, aby lokalny obszar roboczy pozostał kanoniczny.
Zachowanie:
- Przed
execOpenClaw synchronizuje lokalny obszar roboczy do piaskownicy OpenShell. - Po
execOpenClaw synchronizuje zdalny obszar roboczy z powrotem do lokalnego obszaru roboczego. - Narzędzia plikowe nadal działają przez most piaskownicy, ale lokalny obszar roboczy pozostaje źródłem prawdy między turami.
Użyj tego, gdy:
- edytujesz pliki lokalnie poza OpenClaw i chcesz, aby te zmiany automatycznie pojawiały się w sandboxie
- chcesz, aby sandbox OpenShell zachowywał się możliwie podobnie do backendu Docker
- chcesz, aby obszar roboczy hosta odzwierciedlał zapisy sandboxa po każdym wykonaniu exec
Kompromis: dodatkowy koszt synchronizacji przed i po exec.
remote (OpenShell canonical)
Użyj plugins.entries.openshell.config.mode: "remote", gdy chcesz, aby obszar roboczy OpenShell stał się kanoniczny.
Zachowanie:
- Gdy sandbox jest tworzony po raz pierwszy, OpenClaw jednorazowo zasila zdalny obszar roboczy z lokalnego obszaru roboczego.
- Następnie
exec,read,write,editiapply_patchdziałają bezpośrednio na zdalnym obszarze roboczym OpenShell. - OpenClaw nie synchronizuje zdalnych zmian z powrotem do lokalnego obszaru roboczego po exec.
- Odczyty multimediów w czasie promptu nadal działają, ponieważ narzędzia plików i multimediów czytają przez most sandboxa zamiast zakładać lokalną ścieżkę hosta.
- Transport odbywa się przez SSH do sandboxa OpenShell zwróconego przez
openshell sandbox ssh-config.
Ważne konsekwencje:
- Jeśli po kroku zasilania edytujesz pliki na hoście poza OpenClaw, zdalny sandbox nie zobaczy tych zmian automatycznie.
- Jeśli sandbox zostanie odtworzony, zdalny obszar roboczy zostanie ponownie zasilony z lokalnego obszaru roboczego.
- Przy
scope: "agent"lubscope: "shared"ten zdalny obszar roboczy jest współdzielony w tym samym zakresie.
Użyj tego, gdy:
- sandbox powinien działać głównie po zdalnej stronie OpenShell
- chcesz obniżyć narzut synchronizacji na turę
- nie chcesz, aby lokalne edycje hosta po cichu nadpisywały stan zdalnego sandboxa
Wybierz mirror, jeśli traktujesz sandbox jako tymczasowe środowisko wykonywania. Wybierz remote, jeśli traktujesz sandbox jako rzeczywisty obszar roboczy.
Cykl życia OpenShell
Sandboxy OpenShell są nadal zarządzane przez normalny cykl życia sandboxa:
openclaw sandbox listpokazuje środowiska uruchomieniowe OpenShell oraz Dockeropenclaw sandbox recreateusuwa bieżące środowisko uruchomieniowe i pozwala OpenClaw odtworzyć je przy następnym użyciu- logika czyszczenia również uwzględnia backend
W trybie remote odtworzenie jest szczególnie ważne:
- odtworzenie usuwa kanoniczny zdalny obszar roboczy dla tego zakresu
- następne użycie zasila świeży zdalny obszar roboczy z lokalnego obszaru roboczego
W trybie mirror odtworzenie głównie resetuje zdalne środowisko wykonywania, ponieważ lokalny obszar roboczy i tak pozostaje kanoniczny.
Dostęp do obszaru roboczego
agents.defaults.sandbox.workspaceAccess kontroluje co sandbox może widzieć:
none (default)
Narzędzia widzą obszar roboczy sandboxa pod ~/.openclaw/sandboxes.
ro
Montuje obszar roboczy agenta tylko do odczytu w /agent (wyłącza write/edit/apply_patch).
rw
Montuje obszar roboczy agenta do odczytu i zapisu w /workspace.
Z backendem OpenShell:
- tryb
mirrornadal używa lokalnego obszaru roboczego jako kanonicznego źródła między turami exec - tryb
remoteużywa zdalnego obszaru roboczego OpenShell jako kanonicznego źródła po początkowym zasileniu workspaceAccess: "ro"i"none"nadal ograniczają zachowanie zapisu w ten sam sposób
Przychodzące multimedia są kopiowane do aktywnego obszaru roboczego sandboxa (media/inbound/*).
Niestandardowe montowania bind
agents.defaults.sandbox.docker.binds montuje dodatkowe katalogi hosta w kontenerze. Format: host:container:mode (np. "/home/user/source:/source:rw").
Globalne i przypisane do agenta montowania bind są scalane (nie zastępowane). Przy scope: "shared" montowania bind przypisane do agenta są ignorowane.
agents.defaults.sandbox.browser.binds montuje dodatkowe katalogi hosta tylko w kontenerze przeglądarki sandboxa.
- Gdy jest ustawione (w tym
[]), zastępujeagents.defaults.sandbox.docker.bindsdla kontenera przeglądarki. - Gdy jest pominięte, kontener przeglądarki używa zastępczo
agents.defaults.sandbox.docker.binds(zgodność wsteczna).
Przykład (źródło tylko do odczytu + dodatkowy katalog danych):
{
agents: {
defaults: {
sandbox: {
docker: {
binds: ["/home/user/source:/source:ro", "/var/data/myapp:/data:ro"],
},
},
},
list: [
{
id: "build",
sandbox: {
docker: {
binds: ["/mnt/cache:/cache:rw"],
},
},
},
],
},
}
Obrazy i konfiguracja
Domyślny obraz Docker: openclaw-sandbox:bookworm-slim
Build the default image
Z checkoutu źródłowego:
scripts/sandbox-setup.sh
Z instalacji npm (checkout źródłowy nie jest potrzebny):
docker build -t openclaw-sandbox:bookworm-slim - <<'DOCKERFILE'
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
bash ca-certificates curl git jq python3 ripgrep \
&& rm -rf /var/lib/apt/lists/*
RUN useradd --create-home --shell /bin/bash sandbox
USER sandbox
WORKDIR /home/sandbox
CMD ["sleep", "infinity"]
DOCKERFILE
Domyślny obraz nie zawiera Node. Jeśli Skill wymaga Node (lub innych środowisk uruchomieniowych), przygotuj niestandardowy obraz albo zainstaluj przez sandbox.docker.setupCommand (wymaga wyjścia do sieci + zapisywalnego katalogu głównego + użytkownika root).
OpenClaw nie zastępuje po cichu brakującego openclaw-sandbox:bookworm-slim zwykłym debian:bookworm-slim. Uruchomienia sandboxa wskazujące domyślny obraz szybko kończą się błędem z instrukcją budowania, dopóki go nie zbudujesz, ponieważ dołączony obraz zawiera python3 dla pomocników zapisu/edycji sandboxa.
Optional: build the common image
Dla bardziej funkcjonalnego obrazu sandboxa z typowymi narzędziami (na przykład curl, jq, nodejs, python3, git):
Z checkoutu źródłowego:
scripts/sandbox-common-setup.sh
Z instalacji npm najpierw zbuduj domyślny obraz (patrz wyżej), a następnie zbuduj na nim obraz common, używając scripts/docker/sandbox/Dockerfile.common z repozytorium.
Następnie ustaw agents.defaults.sandbox.docker.image na openclaw-sandbox-common:bookworm-slim.
Optional: build the sandbox browser image
Z checkoutu źródłowego:
scripts/sandbox-browser-setup.sh
Z instalacji npm zbuduj przy użyciu scripts/docker/sandbox/Dockerfile.browser z repozytorium.
Domyślnie kontenery sandboxa Docker działają bez sieci. Nadpisz to za pomocą agents.defaults.sandbox.docker.network.
Sandbox browser Chromium defaults
Dołączony obraz przeglądarki sandboxa stosuje również konserwatywne domyślne ustawienia startowe Chromium dla obciążeń kontenerowych. Bieżące ustawienia domyślne kontenera obejmują:
--remote-debugging-address=127.0.0.1--remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>--user-data-dir=${HOME}/.chrome--no-first-run--no-default-browser-check--disable-3d-apis--disable-gpu--disable-dev-shm-usage--disable-background-networking--disable-extensions--disable-features=TranslateUI--disable-breakpad--disable-crash-reporter--disable-software-rasterizer--no-zygote--metrics-recording-only--renderer-process-limit=2--no-sandbox, gdynoSandboxjest włączone.- Trzy flagi utwardzania grafiki (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) są opcjonalne i przydatne, gdy kontenery nie mają obsługi GPU. UstawOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0, jeśli Twoje obciążenie wymaga WebGL lub innych funkcji 3D/przeglądarki. --disable-extensionsjest domyślnie włączone i można je wyłączyć przezOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0dla przepływów zależnych od rozszerzeń.--renderer-process-limit=2jest kontrolowane przezOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, gdzie0zachowuje domyślne ustawienie Chromium.
Jeśli potrzebujesz innego profilu środowiska uruchomieniowego, użyj niestandardowego obrazu przeglądarki i podaj własny punkt wejścia. Dla lokalnych (niekontenerowych) profili Chromium użyj browser.extraArgs, aby dodać dodatkowe flagi startowe.
Network security defaults
network: "host"jest blokowane.network: "container:<id>"jest domyślnie blokowane (ryzyko obejścia przez dołączenie do przestrzeni nazw).- Awaryjne obejście:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
Instalacje Docker i skonteneryzowany Gateway znajdują się tutaj: Docker
W przypadku wdrożeń Gateway Docker scripts/docker/setup.sh może zainicjować konfigurację sandboxa. Ustaw OPENCLAW_SANDBOX=1 (lub true/yes/on), aby włączyć tę ścieżkę. Możesz nadpisać lokalizację gniazda za pomocą OPENCLAW_DOCKER_SOCKET. Pełna konfiguracja i dokumentacja env: Docker.
setupCommand (jednorazowa konfiguracja kontenera)
setupCommand uruchamia się raz po utworzeniu kontenera sandboxa (nie przy każdym uruchomieniu). Wykonuje się wewnątrz kontenera przez sh -lc.
Ścieżki:
- Globalnie:
agents.defaults.sandbox.docker.setupCommand - Dla agenta:
agents.list[].sandbox.docker.setupCommand
Typowe pułapki
- Domyślne
docker.networkto"none"(brak ruchu wychodzącego), więc instalacje pakietów zakończą się niepowodzeniem. docker.network: "container:<id>"wymagadangerouslyAllowContainerNamespaceJoin: truei jest przeznaczone wyłącznie do sytuacji awaryjnych.readOnlyRoot: trueuniemożliwia zapisy; ustawreadOnlyRoot: falsealbo przygotuj niestandardowy obraz.usermusi być rootem do instalacji pakietów (pomińuseralbo ustawuser: "0:0").- Wykonanie w piaskownicy nie dziedziczy hostowego
process.env. Użyjagents.defaults.sandbox.docker.env(albo niestandardowego obrazu) dla kluczy API Skills.
Polityka narzędzi i wyjścia awaryjne
Zasady zezwalania/odmawiania narzędzi nadal obowiązują przed regułami piaskownicy. Jeśli narzędzie jest zabronione globalnie albo dla danego agenta, piaskownica go nie przywróci.
tools.elevated to jawne wyjście awaryjne, które uruchamia exec poza piaskownicą (domyślnie gateway, albo node, gdy celem exec jest node). Dyrektywy /exec mają zastosowanie tylko do autoryzowanych nadawców i utrzymują się w ramach sesji; aby trwale wyłączyć exec, użyj odmowy w polityce narzędzi (zobacz Piaskownica kontra polityka narzędzi kontra podniesione uprawnienia).
Debugowanie:
- Użyj
openclaw sandbox explain, aby sprawdzić efektywny tryb piaskownicy, politykę narzędzi i klucze konfiguracji do naprawy. - Zobacz Piaskownica kontra polityka narzędzi kontra podniesione uprawnienia, aby poznać model myślowy dla pytania „dlaczego to jest zablokowane?”.
Utrzymuj to zablokowane.
Nadpisania wieloagentowe
Każdy agent może nadpisać piaskownicę i narzędzia: agents.list[].sandbox oraz agents.list[].tools (plus agents.list[].tools.sandbox.tools dla polityki narzędzi piaskownicy). Zobacz Wieloagentowa piaskownica i narzędzia, aby poznać pierwszeństwo.
Minimalny przykład włączenia
{
agents: {
defaults: {
sandbox: {
mode: "non-main",
scope: "session",
workspaceAccess: "none",
},
},
},
}
Powiązane
- Wieloagentowa piaskownica i narzędzia — nadpisania dla poszczególnych agentów i pierwszeństwo
- OpenShell — konfiguracja zarządzanego zaplecza piaskownicy, tryby obszaru roboczego i odniesienie konfiguracji
- Konfiguracja piaskownicy
- Piaskownica kontra polityka narzędzi kontra podniesione uprawnienia — debugowanie pytania „dlaczego to jest zablokowane?”
- Bezpieczeństwo