From a00e926db76aab199680ec3f962d297febf05d4c Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Thu, 23 Apr 2026 08:07:46 +0000 Subject: [PATCH] chore(i18n): refresh uk translations --- docs/uk/gateway/security/audit-checks.md | 130 +++ docs/uk/gateway/security/index.md | 1253 ++++++++++------------ 2 files changed, 697 insertions(+), 686 deletions(-) create mode 100644 docs/uk/gateway/security/audit-checks.md diff --git a/docs/uk/gateway/security/audit-checks.md b/docs/uk/gateway/security/audit-checks.md new file mode 100644 index 000000000..cb7b722ab --- /dev/null +++ b/docs/uk/gateway/security/audit-checks.md @@ -0,0 +1,130 @@ +--- +read_when: + - Ви побачили конкретний `checkId` у виводі `openclaw security audit` і хочете дізнатися, що це означає + - Вам потрібен ключ/шлях виправлення для заданого результату перевірки + - Ви виконуєте тріаж рівня серйозності під час запуску аудиту безпеки +summary: Довідковий каталог `checkId`, які видає аудит безпеки openclaw +title: Перевірки аудиту безпеки +x-i18n: + generated_at: "2026-04-23T08:02:58Z" + model: gpt-5.4 + provider: openai + source_hash: b53a8dc798ecc8c37be43758b741c68772b10c92323ab3d26592d7b3cc2c795e + source_path: gateway/security/audit-checks.md + workflow: 15 +--- + +# Перевірки аудиту безпеки + +`openclaw security audit` видає структуровані результати перевірки з ключем `checkId`. Ця сторінка є довідковим каталогом для цих ідентифікаторів. Загальну модель загроз і рекомендації щодо посилення безпеки див. у [Security](/uk/gateway/security). + +Високосигнальні значення `checkId`, які ви найімовірніше побачите в реальних розгортаннях (не вичерпний список): + +| `checkId` | Серйозність | Чому це важливо | Основний ключ/шлях виправлення | Автовиправлення | +| ------------------------------------------------------------- | ------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | --------------- | +| `fs.state_dir.perms_world_writable` | critical | Інші користувачі/процеси можуть змінювати весь стан OpenClaw | права файлової системи для `~/.openclaw` | так | +| `fs.state_dir.perms_group_writable` | warn | Користувачі групи можуть змінювати весь стан OpenClaw | права файлової системи для `~/.openclaw` | так | +| `fs.state_dir.perms_readable` | warn | Каталог стану доступний для читання іншими | права файлової системи для `~/.openclaw` | так | +| `fs.state_dir.symlink` | warn | Ціль каталогу стану стає іншою межею довіри | структура файлової системи каталогу стану | ні | +| `fs.config.perms_writable` | critical | Інші можуть змінювати політику автентифікації/інструментів/конфігурацію | права файлової системи для `~/.openclaw/openclaw.json` | так | +| `fs.config.symlink` | warn | Символьні посилання для файлів конфігурації не підтримуються для запису й додають ще одну межу довіри | замініть на звичайний файл конфігурації або вкажіть `OPENCLAW_CONFIG_PATH` на реальний файл | ні | +| `fs.config.perms_group_readable` | warn | Користувачі групи можуть читати токени/налаштування конфігурації | права файлової системи для файла конфігурації | так | +| `fs.config.perms_world_readable` | critical | Конфігурація може розкривати токени/налаштування | права файлової системи для файла конфігурації | так | +| `fs.config_include.perms_writable` | critical | Файл включення конфігурації може бути змінений іншими | права файлів включення, на які посилається `openclaw.json` | так | +| `fs.config_include.perms_group_readable` | warn | Користувачі групи можуть читати включені секрети/налаштування | права файлів включення, на які посилається `openclaw.json` | так | +| `fs.config_include.perms_world_readable` | critical | Включені секрети/налаштування доступні для читання всім | права файлів включення, на які посилається `openclaw.json` | так | +| `fs.auth_profiles.perms_writable` | critical | Інші можуть впроваджувати або замінювати збережені облікові дані моделі | права `agents//agent/auth-profiles.json` | так | +| `fs.auth_profiles.perms_readable` | warn | Інші можуть читати API-ключі й OAuth-токени | права `agents//agent/auth-profiles.json` | так | +| `fs.credentials_dir.perms_writable` | critical | Інші можуть змінювати стан спарювання каналу/облікових даних | права файлової системи для `~/.openclaw/credentials` | так | +| `fs.credentials_dir.perms_readable` | warn | Інші можуть читати стан облікових даних каналу | права файлової системи для `~/.openclaw/credentials` | так | +| `fs.sessions_store.perms_readable` | warn | Інші можуть читати стенограми сеансів/метадані | права сховища сеансів | так | +| `fs.log_file.perms_readable` | warn | Інші можуть читати журнали, редаговані для приховування даних, але все ще чутливі | права файла журналу Gateway | так | +| `fs.synced_dir` | warn | Стан/конфігурація в iCloud/Dropbox/Drive розширює зону доступу до токенів/стенограм | перемістіть конфігурацію/стан за межі синхронізованих папок | ні | +| `gateway.bind_no_auth` | critical | Віддалене прив’язування без спільного секрету | `gateway.bind`, `gateway.auth.*` | ні | +| `gateway.loopback_no_auth` | critical | local loopback за зворотним проксі може стати неавтентифікованим | `gateway.auth.*`, налаштування проксі | ні | +| `gateway.trusted_proxies_missing` | warn | Заголовки зворотного проксі присутні, але не довірені | `gateway.trustedProxies` | ні | +| `gateway.http.no_auth` | warn/critical | HTTP API Gateway доступні з `auth.mode="none"` | `gateway.auth.mode`, `gateway.http.endpoints.*` | ні | +| `gateway.http.session_key_override_enabled` | info | Викликачі HTTP API можуть перевизначати `sessionKey` | `gateway.http.allowSessionKeyOverride` | ні | +| `gateway.tools_invoke_http.dangerous_allow` | warn/critical | Повторно вмикає небезпечні інструменти через HTTP API | `gateway.tools.allow` | ні | +| `gateway.nodes.allow_commands_dangerous` | warn/critical | Вмикає команди вузла з високим впливом (камера/екран/контакти/календар/SMS) | `gateway.nodes.allowCommands` | ні | +| `gateway.nodes.deny_commands_ineffective` | warn | Записи deny, схожі на шаблони, не збігаються з текстом shell або групами | `gateway.nodes.denyCommands` | ні | +| `gateway.tailscale_funnel` | critical | Доступність із публічного інтернету | `gateway.tailscale.mode` | ні | +| `gateway.tailscale_serve` | info | Доступ у Tailnet увімкнено через Serve | `gateway.tailscale.mode` | ні | +| `gateway.control_ui.allowed_origins_required` | critical | Control UI поза local loopback без явного списку дозволених browser-origin | `gateway.controlUi.allowedOrigins` | ні | +| `gateway.control_ui.allowed_origins_wildcard` | warn/critical | `allowedOrigins=["*"]` вимикає список дозволених browser-origin | `gateway.controlUi.allowedOrigins` | ні | +| `gateway.control_ui.host_header_origin_fallback` | warn/critical | Вмикає резервний варіант origin через заголовок Host (пониження захисту від DNS rebinding) | `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` | ні | +| `gateway.control_ui.insecure_auth` | warn | Увімкнено перемикач сумісності з небезпечною автентифікацією | `gateway.controlUi.allowInsecureAuth` | ні | +| `gateway.control_ui.device_auth_disabled` | critical | Вимикає перевірку ідентичності пристрою | `gateway.controlUi.dangerouslyDisableDeviceAuth` | ні | +| `gateway.real_ip_fallback_enabled` | warn/critical | Довіра до резервного `X-Real-IP` може дозволити підміну IP-адреси джерела через помилкову конфігурацію проксі | `gateway.allowRealIpFallback`, `gateway.trustedProxies` | ні | +| `gateway.token_too_short` | warn | Короткий спільний токен легше підібрати перебором | `gateway.auth.token` | ні | +| `gateway.auth_no_rate_limit` | warn | Відкрита автентифікація без обмеження частоти збільшує ризик brute-force | `gateway.auth.rateLimit` | ні | +| `gateway.trusted_proxy_auth` | critical | Ідентичність проксі тепер стає межею автентифікації | `gateway.auth.mode="trusted-proxy"` | ні | +| `gateway.trusted_proxy_no_proxies` | critical | Автентифікація trusted-proxy без IP-адрес довірених проксі є небезпечною | `gateway.trustedProxies` | ні | +| `gateway.trusted_proxy_no_user_header` | critical | Автентифікація trusted-proxy не може безпечно визначити ідентичність користувача | `gateway.auth.trustedProxy.userHeader` | ні | +| `gateway.trusted_proxy_no_allowlist` | warn | Автентифікація trusted-proxy приймає будь-якого автентифікованого користувача upstream | `gateway.auth.trustedProxy.allowUsers` | ні | +| `gateway.probe_auth_secretref_unavailable` | warn | Глибока перевірка не змогла розв’язати auth SecretRef у цьому шляху команди | джерело auth для глибокої перевірки / доступність SecretRef | ні | +| `gateway.probe_failed` | warn/critical | Не вдалася жива перевірка Gateway | доступність/автентифікація Gateway | ні | +| `discovery.mdns_full_mode` | warn/critical | Повний режим mDNS рекламує метадані `cliPath`/`sshPort` у локальній мережі | `discovery.mdns.mode`, `gateway.bind` | ні | +| `config.insecure_or_dangerous_flags` | warn | Увімкнено будь-які небезпечні/ризиковані прапорці налагодження | кілька ключів (див. деталі результату перевірки) | ні | +| `config.secrets.gateway_password_in_config` | warn | Пароль Gateway зберігається безпосередньо в конфігурації | `gateway.auth.password` | ні | +| `config.secrets.hooks_token_in_config` | warn | Bearer-токен hooks зберігається безпосередньо в конфігурації | `hooks.token` | ні | +| `hooks.token_reuse_gateway_token` | critical | Токен вхідного hooks також відкриває автентифікацію Gateway | `hooks.token`, `gateway.auth.token` | ні | +| `hooks.token_too_short` | warn | Полегшує brute force для вхідного hooks | `hooks.token` | ні | +| `hooks.default_session_key_unset` | warn | Агент hooks розгалужує виконання на згенеровані окремі сеанси для кожного запиту | `hooks.defaultSessionKey` | ні | +| `hooks.allowed_agent_ids_unrestricted` | warn/critical | Автентифіковані викликачі hooks можуть спрямовувати запити до будь-якого налаштованого агента | `hooks.allowedAgentIds` | ні | +| `hooks.request_session_key_enabled` | warn/critical | Зовнішній викликач може вибирати `sessionKey` | `hooks.allowRequestSessionKey` | ні | +| `hooks.request_session_key_prefixes_missing` | warn/critical | Немає обмеження на форму зовнішніх ключів сеансу | `hooks.allowedSessionKeyPrefixes` | ні | +| `hooks.path_root` | critical | Шлях hooks — це `/`, що полегшує колізії або хибну маршрутизацію вхідних запитів | `hooks.path` | ні | +| `hooks.installs_unpinned_npm_specs` | warn | Записи встановлення hooks не закріплені за незмінними npm-специфікаціями | метадані встановлення hooks | ні | +| `hooks.installs_missing_integrity` | warn | У записах встановлення hooks відсутні метадані цілісності | метадані встановлення hooks | ні | +| `hooks.installs_version_drift` | warn | Записи встановлення hooks розходяться з установленими пакетами | метадані встановлення hooks | ні | +| `logging.redact_off` | warn | Чутливі значення потрапляють у журнали/стан | `logging.redactSensitive` | так | +| `browser.control_invalid_config` | warn | Конфігурація керування браузером недійсна ще до запуску | `browser.*` | ні | +| `browser.control_no_auth` | critical | Керування браузером відкрите без автентифікації токеном/паролем | `gateway.auth.*` | ні | +| `browser.remote_cdp_http` | warn | Віддалений CDP через звичайний HTTP не має шифрування транспорту | профіль браузера `cdpUrl` | ні | +| `browser.remote_cdp_private_host` | warn | Віддалений CDP націлений на приватний/внутрішній хост | профіль браузера `cdpUrl`, `browser.ssrfPolicy.*` | ні | +| `sandbox.docker_config_mode_off` | warn | Конфігурація Docker для Sandbox присутня, але неактивна | `agents.*.sandbox.mode` | ні | +| `sandbox.bind_mount_non_absolute` | warn | Відносні bind mounts можуть розв’язуватися непередбачувано | `agents.*.sandbox.docker.binds[]` | ні | +| `sandbox.dangerous_bind_mount` | critical | Bind mount Sandbox націлений на заблоковані системні шляхи, облікові дані або шляхи сокета Docker | `agents.*.sandbox.docker.binds[]` | ні | +| `sandbox.dangerous_network_mode` | critical | Мережа Docker для Sandbox використовує режим `host` або `container:*` зі спільним простором імен | `agents.*.sandbox.docker.network` | ні | +| `sandbox.dangerous_seccomp_profile` | critical | Профіль seccomp Sandbox послаблює ізоляцію контейнера | `agents.*.sandbox.docker.securityOpt` | ні | +| `sandbox.dangerous_apparmor_profile` | critical | Профіль AppArmor Sandbox послаблює ізоляцію контейнера | `agents.*.sandbox.docker.securityOpt` | ні | +| `sandbox.browser_cdp_bridge_unrestricted` | warn | Міст CDP браузера Sandbox відкритий без обмеження діапазону джерел | `sandbox.browser.cdpSourceRange` | ні | +| `sandbox.browser_container.non_loopback_publish` | critical | Наявний контейнер браузера публікує CDP на інтерфейсах поза local loopback | конфігурація публікації контейнера браузера Sandbox | ні | +| `sandbox.browser_container.hash_label_missing` | warn | Наявний контейнер браузера передує поточним міткам хеша конфігурації | `openclaw sandbox recreate --browser --all` | ні | +| `sandbox.browser_container.hash_epoch_stale` | warn | Наявний контейнер браузера передує поточній епосі конфігурації браузера | `openclaw sandbox recreate --browser --all` | ні | +| `tools.exec.host_sandbox_no_sandbox_defaults` | warn | `exec host=sandbox` завершується безпечною відмовою, коли Sandbox вимкнено | `tools.exec.host`, `agents.defaults.sandbox.mode` | ні | +| `tools.exec.host_sandbox_no_sandbox_agents` | warn | Для окремого агента `exec host=sandbox` завершується безпечною відмовою, коли Sandbox вимкнено | `agents.list[].tools.exec.host`, `agents.list[].sandbox.mode` | ні | +| `tools.exec.security_full_configured` | warn/critical | Host exec працює з `security="full"` | `tools.exec.security`, `agents.list[].tools.exec.security` | ні | +| `tools.exec.auto_allow_skills_enabled` | warn | Погодження exec неявно довіряють бінарним файлам Skills | `~/.openclaw/exec-approvals.json` | ні | +| `tools.exec.allowlist_interpreter_without_strict_inline_eval` | warn | Дозволені списки інтерпретаторів допускають inline eval без примусового повторного погодження | `tools.exec.strictInlineEval`, `agents.list[].tools.exec.strictInlineEval`, allowlist погоджень exec | ні | +| `tools.exec.safe_bins_interpreter_unprofiled` | warn | Бінарні файли інтерпретатора/середовища виконання в `safeBins` без явних профілів розширюють ризик exec | `tools.exec.safeBins`, `tools.exec.safeBinProfiles`, `agents.list[].tools.exec.*` | ні | +| `tools.exec.safe_bins_broad_behavior` | warn | Інструменти з широкою поведінкою в `safeBins` послаблюють модель довіри з низьким ризиком для stdin-фільтра | `tools.exec.safeBins`, `agents.list[].tools.exec.safeBins` | ні | +| `tools.exec.safe_bin_trusted_dirs_risky` | warn | `safeBinTrustedDirs` містить змінювані або ризиковані каталоги | `tools.exec.safeBinTrustedDirs`, `agents.list[].tools.exec.safeBinTrustedDirs` | ні | +| `skills.workspace.symlink_escape` | warn | `skills/**/SKILL.md` у робочому просторі розв’язується за межі кореня робочого простору (дрейф ланцюжка символьних посилань) | стан файлової системи робочого простору `skills/**` | ні | +| `plugins.extensions_no_allowlist` | warn | Plugins установлені без явного списку дозволених Plugins | `plugins.allowlist` | ні | +| `plugins.installs_unpinned_npm_specs` | warn | Записи встановлення Plugins не закріплені за незмінними npm-специфікаціями | метадані встановлення Plugin | ні | +| `plugins.installs_missing_integrity` | warn | У записах встановлення Plugin відсутні метадані цілісності | метадані встановлення Plugin | ні | +| `plugins.installs_version_drift` | warn | Записи встановлення Plugin розходяться з установленими пакетами | метадані встановлення Plugin | ні | +| `plugins.code_safety` | warn/critical | Сканування коду Plugin виявило підозрілі або небезпечні шаблони | код Plugin / джерело встановлення | ні | +| `plugins.code_safety.entry_path` | warn | Шлях входу Plugin вказує на приховані розташування або `node_modules` | `entry` у маніфесті Plugin | ні | +| `plugins.code_safety.entry_escape` | critical | Точка входу Plugin виходить за межі каталогу Plugin | `entry` у маніфесті Plugin | ні | +| `plugins.code_safety.scan_failed` | warn | Сканування коду Plugin не вдалося завершити | шлях Plugin / середовище сканування | ні | +| `skills.code_safety` | warn/critical | Метадані/код інсталятора Skill містять підозрілі або небезпечні шаблони | джерело встановлення Skill | ні | +| `skills.code_safety.scan_failed` | warn | Сканування коду Skill не вдалося завершити | середовище сканування Skill | ні | +| `security.exposure.open_channels_with_exec` | warn/critical | Спільні/публічні кімнати можуть звертатися до агентів з увімкненим exec | `channels.*.dmPolicy`, `channels.*.groupPolicy`, `tools.exec.*`, `agents.list[].tools.exec.*` | ні | +| `security.exposure.open_groups_with_elevated` | critical | Відкриті групи + привілейовані інструменти створюють шляхи prompt injection з високим впливом | `channels.*.groupPolicy`, `tools.elevated.*` | ні | +| `security.exposure.open_groups_with_runtime_or_fs` | critical/warn | Відкриті групи можуть звертатися до інструментів команд/файлів без захисту Sandbox/робочого простору | `channels.*.groupPolicy`, `tools.profile/deny`, `tools.fs.workspaceOnly`, `agents.*.sandbox.mode` | ні | +| `security.trust_model.multi_user_heuristic` | warn | Конфігурація виглядає багатокористувацькою, тоді як модель довіри Gateway — personal-assistant | розділіть межі довіри або застосуйте посилення безпеки для спільних користувачів (`sandbox.mode`, deny інструментів/обмеження робочого простору) | ні | +| `tools.profile_minimal_overridden` | warn | Перевизначення агента обходять глобальний мінімальний профіль | `agents.list[].tools.profile` | ні | +| `plugins.tools_reachable_permissive_policy` | warn | Інструменти розширень доступні в контекстах із м’якою політикою | `tools.profile` + allow/deny інструментів | ні | +| `models.legacy` | warn | Сімейства застарілих моделей усе ще налаштовані | вибір моделі | ні | +| `models.weak_tier` | warn | Налаштовані моделі нижчі за поточні рекомендовані рівні | вибір моделі | ні | +| `models.small_params` | critical/info | Малі моделі + небезпечні поверхні інструментів підвищують ризик injection | вибір моделі + політика Sandbox/інструментів | ні | +| `summary.attack_surface` | info | Зведений підсумок стану автентифікації, каналів, інструментів і поверхні експозиції | кілька ключів (див. деталі результату перевірки) | ні | + +## Пов’язане + +- [Security](/uk/gateway/security) +- [Configuration](/uk/gateway/configuration) +- [Trusted proxy auth](/uk/gateway/trusted-proxy-auth) diff --git a/docs/uk/gateway/security/index.md b/docs/uk/gateway/security/index.md index 797b9b1ce..a503d91e8 100644 --- a/docs/uk/gateway/security/index.md +++ b/docs/uk/gateway/security/index.md @@ -1,13 +1,13 @@ --- read_when: - Додавання функцій, які розширюють доступ або автоматизацію -summary: Міркування безпеки та модель загроз для запуску AI Gateway з доступом до оболонки +summary: Міркування щодо безпеки та модель загроз для запуску AI Gateway із доступом до оболонки title: Безпека x-i18n: - generated_at: "2026-04-23T07:25:32Z" + generated_at: "2026-04-23T08:02:52Z" model: gpt-5.4 provider: openai - source_hash: 431bdfa6dca8d81d157ea39b09cedd849a067ee1be7a4ad1777a523ac1de5174 + source_hash: ccdc8d9a0eef88294d9f831ec4f24eb90b00631b9266d69df888a62468cb1dea source_path: gateway/security/index.md workflow: 15 --- @@ -15,29 +15,29 @@ x-i18n: # Безпека -**Модель довіри персонального асистента:** ці рекомендації припускають одну межу довіри для одного оператора на Gateway (модель одного користувача/персонального асистента). -OpenClaw **не** є ворожою багатокористувацькою межею безпеки для кількох зловмисних користувачів, які спільно використовують одного агента/Gateway. -Якщо вам потрібна робота зі змішаним рівнем довіри або зі зловмисними користувачами, розділіть межі довіри (окремі Gateway + облікові дані, в ідеалі окремі користувачі ОС/хости). +**Модель довіри персонального помічника:** ці рекомендації виходять із припущення про одну межу довіри оператора на Gateway (модель одного користувача/персонального помічника). +OpenClaw **не є** безпечною межею для ворожого багатокористувацького середовища, де кілька зловмисно налаштованих користувачів ділять один agent/Gateway. +Якщо вам потрібна робота зі змішаною довірою або ворожими користувачами, розділяйте межі довіри (окремий Gateway + облікові дані, а в ідеалі — окремі користувачі ОС/хости). -**На цій сторінці:** [Модель довіри](#scope-first-personal-assistant-security-model) | [Швидкий аудит](#quick-check-openclaw-security-audit) | [Посилена базова конфігурація](#hardened-baseline-in-60-seconds) | [Модель доступу до DM](#dm-access-model-pairing-allowlist-open-disabled) | [Посилення конфігурації](#configuration-hardening-examples) | [Реагування на інциденти](#incident-response) +**На цій сторінці:** [Модель довіри](#scope-first-personal-assistant-security-model) | [Швидкий аудит](#quick-check-openclaw-security-audit) | [Посилена базова конфігурація](#hardened-baseline-in-60-seconds) | [Модель доступу DM](#dm-access-model-pairing-allowlist-open-disabled) | [Посилення конфігурації](#configuration-hardening-examples) | [Реагування на інциденти](#incident-response) -## Спочатку про межі: модель безпеки персонального асистента +## Спочатку про межі: модель безпеки персонального помічника -Рекомендації з безпеки OpenClaw припускають розгортання **персонального асистента**: одна межа довіри для одного оператора, потенційно багато агентів. +Рекомендації з безпеки OpenClaw виходять із розгортання **персонального помічника**: одна межа довіри оператора, потенційно багато agent. -- Підтримувана безпекова модель: один користувач/межа довіри на Gateway (бажано один користувач ОС/хост/VPS на одну межу). -- Непідтримувана межа безпеки: один спільний Gateway/агент, який використовують взаємно недовірені або зловмисні користувачі. -- Якщо потрібна ізоляція від зловмисних користувачів, розділяйте за межами довіри (окремі Gateway + облікові дані, а в ідеалі окремі користувачі ОС/хости). -- Якщо кілька недовірених користувачів можуть надсилати повідомлення одному агенту з увімкненими інструментами, вважайте, що всі вони спільно користуються однаковими делегованими повноваженнями цього агента щодо інструментів. +- Підтримувана модель безпеки: один користувач/межа довіри на Gateway (бажано один користувач ОС/хост/VPS на одну межу). +- Непідтримувана межа безпеки: один спільний Gateway/agent, яким користуються взаємно недовірені або ворожо налаштовані користувачі. +- Якщо потрібна ізоляція ворожих користувачів, розділяйте за межами довіри (окремий Gateway + облікові дані, а в ідеалі — окремі користувачі ОС/хости). +- Якщо кілька недовірених користувачів можуть надсилати повідомлення одному agent із увімкненими інструментами, вважайте, що всі вони спільно користуються однаковими делегованими повноваженнями цього agent щодо інструментів. -Ця сторінка пояснює посилення захисту **в межах цієї моделі**. Вона не стверджує наявність ворожої багатокористувацької ізоляції в одному спільному Gateway. +Ця сторінка пояснює посилення захисту **в межах цієї моделі**. Вона не стверджує наявність ізоляції для ворожого багатокористувацького середовища на одному спільному Gateway. ## Швидка перевірка: `openclaw security audit` -Див. також: [Formal Verification (Security Models)](/uk/security/formal-verification) +Див. також: [Формальна верифікація (моделі безпеки)](/uk/security/formal-verification) -Запускайте це регулярно, особливо після зміни конфігурації або відкриття мережевих поверхонь: +Запускайте це регулярно (особливо після зміни конфігурації або відкриття мережевих поверхонь): ```bash openclaw security audit @@ -46,106 +46,92 @@ openclaw security audit --fix openclaw security audit --json ``` -`security audit --fix` навмисно лишається вузько спрямованим: він перемикає типові відкриті групові -політики на allowlists, відновлює `logging.redactSensitive: "tools"`, посилює -права доступу до state/config/include-file і використовує скидання Windows ACL замість -POSIX `chmod` під час роботи у Windows. +`security audit --fix` навмисно має вузький обсяг: він перемикає типові відкриті групові політики на allowlist, відновлює `logging.redactSensitive: "tools"`, посилює дозволи для state/config/include-файлів і використовує скидання Windows ACL замість POSIX `chmod` під час роботи у Windows. -Він виявляє типові небезпечні помилки конфігурації (відкритий доступ до Gateway auth, відкритий доступ до керування браузером, підвищені allowlists, права доступу до файлової системи, надто дозволяючі погодження exec та відкритий доступ до інструментів через канали). +Він виявляє типові небезпечні конфігурації (відкрита автентифікація Gateway, відкрите керування браузером, розширені allowlist, дозволи файлової системи, надто поблажливі схвалення exec та відкритий доступ до інструментів у каналах). -OpenClaw — це і продукт, і експеримент: ви підключаєте поведінку frontier-model до реальних поверхонь обміну повідомленнями та реальних інструментів. **«Ідеально безпечного» налаштування не існує.** Мета — свідомо визначити: +OpenClaw — це і продукт, і експеримент: ви підключаєте поведінку frontier-model до реальних поверхонь обміну повідомленнями та реальних інструментів. **Ідеально безпечного** налаштування не існує. Мета — свідомо визначити: - хто може спілкуватися з вашим ботом; - де боту дозволено діяти; - до чого бот може отримати доступ. -Починайте з найменшого доступу, який усе ще працює, і розширюйте його лише в міру зростання впевненості. +Починайте з найменшого доступу, який усе ще дає змогу працювати, і розширюйте його лише зі зростанням упевненості. ### Розгортання та довіра до хоста -OpenClaw припускає, що межа хоста і конфігурації є довіреною: +OpenClaw припускає, що хост і межа конфігурації є довіреними: -- Якщо хтось може змінювати state/config хоста Gateway (`~/.openclaw`, включно з `openclaw.json`), вважайте цю особу довіреним оператором. -- Запуск одного Gateway для кількох взаємно недовірених/зловмисних операторів **не є рекомендованою конфігурацією**. -- Для команд зі змішаним рівнем довіри розділяйте межі довіри окремими Gateway (або щонайменше окремими користувачами ОС/хостами). -- Рекомендована базова модель: один користувач на одну машину/хост (або VPS), один gateway для цього користувача та один або кілька агентів у цьому gateway. -- Усередині одного екземпляра Gateway автентифікований доступ оператора є довіреною роллю control plane, а не роллю окремого користувача-орендаря. -- Ідентифікатори сесій (`sessionKey`, ID сесій, мітки) — це селектори маршрутизації, а не токени авторизації. -- Якщо кілька людей можуть надсилати повідомлення одному агенту з увімкненими інструментами, кожен із них може керувати тим самим набором дозволів. Ізоляція сесій/пам’яті на рівні користувача допомагає приватності, але не перетворює спільного агента на авторизацію хоста на рівні окремого користувача. +- Якщо хтось може змінювати стан/конфігурацію хоста Gateway (`~/.openclaw`, включно з `openclaw.json`), вважайте його довіреним оператором. +- Запуск одного Gateway для кількох взаємно недовірених/ворожих операторів **не є рекомендованим налаштуванням**. +- Для команд зі змішаною довірою розділяйте межі довіри окремими Gateway (або щонайменше окремими користувачами ОС/хостами). +- Рекомендований варіант за замовчуванням: один користувач на машину/хост (або VPS), один gateway для цього користувача та один або більше agent у цьому gateway. +- Усередині одного екземпляра Gateway автентифікований доступ оператора — це довірена роль площини керування, а не роль окремого користувача-орендаря. +- Ідентифікатори сеансів (`sessionKey`, session IDs, labels) — це селектори маршрутизації, а не токени авторизації. +- Якщо кілька людей можуть надсилати повідомлення одному agent із доступом до інструментів, кожен із них може керувати тим самим набором дозволів. Ізоляція сеансів/пам’яті на рівні користувача допомагає конфіденційності, але не перетворює спільний agent на механізм авторизації хоста для окремих користувачів. -### Спільний простір Slack: реальний ризик +### Спільний робочий простір Slack: реальний ризик -Якщо «усі в Slack можуть написати боту», основний ризик — це делеговані повноваження щодо інструментів: +Якщо «усі в Slack можуть писати боту», основний ризик — це делеговані повноваження на використання інструментів: -- будь-який дозволений відправник може ініціювати виклики інструментів (`exec`, браузер, мережеві/файлові інструменти) в межах політики агента; -- ін’єкція prompt/content від одного відправника може спричинити дії, що впливають на спільний state, пристрої або результати; -- якщо один спільний агент має чутливі облікові дані/файли, будь-який дозволений відправник потенційно може ініціювати їх витік через використання інструментів. +- будь-який дозволений відправник може ініціювати виклики інструментів (`exec`, браузер, мережеві/файлові інструменти) в межах політики agent; +- ін’єкція prompt/контенту від одного відправника може спричинити дії, що впливають на спільний стан, пристрої або результати; +- якщо один спільний agent має чутливі облікові дані/файли, будь-який дозволений відправник потенційно може спровокувати їх ексфільтрацію через використання інструментів. -Для командних сценаріїв використовуйте окремі агенти/Gateway з мінімальним набором інструментів; агентів із персональними даними тримайте приватними. +Для командних сценаріїв використовуйте окремі agent/Gateway з мінімальним набором інструментів; agent із персональними даними тримайте приватними. -### Спільний корпоративний агент: прийнятний шаблон +### Спільний агент для компанії: допустимий шаблон -Це прийнятно, коли всі, хто використовує цього агента, перебувають в одній межі довіри (наприклад, одна корпоративна команда), а агент суворо обмежений бізнес-контекстом. +Це допустимо, коли всі користувачі такого agent перебувають в одній межі довіри (наприклад, одна корпоративна команда), а сам agent суворо обмежений бізнес-контекстом. -- запускайте його на виділеній машині/VM/контейнері; +- запускайте його на окремій машині/VM/container; - використовуйте окремого користувача ОС + окремий браузер/профіль/облікові записи для цього runtime; -- не входьте в цьому runtime до особистих облікових записів Apple/Google або до особистих профілів браузера/менеджера паролів. +- не входьте в цьому runtime до особистих облікових записів Apple/Google або особистих профілів браузера/менеджера паролів. -Якщо ви змішуєте особисті та корпоративні ідентичності в одному runtime, ви руйнуєте поділ і підвищуєте ризик доступу до персональних даних. +Якщо ви змішуєте особисті та корпоративні ідентичності в одному runtime, ви руйнуєте розділення та підвищуєте ризик витоку персональних даних. -## Концепція довіри до Gateway і Node +## Концепція довіри до Gateway і node -Розглядайте Gateway і Node як єдиний операторський домен довіри з різними ролями: +Розглядайте Gateway і node як один домен довіри оператора з різними ролями: -- **Gateway** — це control plane і поверхня політик (`gateway.auth`, політика інструментів, маршрутизація). -- **Node** — це поверхня віддаленого виконання, з’єднана з цим Gateway (команди, дії з пристроями, локальні для хоста можливості). -- Виклик, автентифікований у Gateway, вважається довіреним у межах Gateway. Після pairing дії Node є довіреними операторськими діями на цьому Node. -- `sessionKey` — це вибір маршрутизації/контексту, а не автентифікація на рівні окремого користувача. -- Погодження exec (allowlist + ask) — це захисні обмеження для наміру оператора, а не ворожа багатокористувацька ізоляція. -- Стандартний продуктний режим OpenClaw для довірених конфігурацій з одним оператором полягає в тому, що host exec на `gateway`/`node` дозволено без запитів на погодження (`security="full"`, `ask="off"`, якщо ви не посилите налаштування). Це навмисне UX-рішення, а не вразливість саме по собі. -- Погодження exec прив’язуються до точного контексту запиту та, за можливості, до прямих локальних файлових операндів; вони не моделюють семантично всі шляхи runtime/interpreter loader. Для сильних меж використовуйте sandboxing та ізоляцію хоста. +- **Gateway** — це площина керування та поверхня політик (`gateway.auth`, політика інструментів, маршрутизація). +- **Node** — це поверхня віддаленого виконання, спарена з цим Gateway (команди, дії на пристрої, локальні можливості хоста). +- Виклик, автентифікований у Gateway, є довіреним у межах Gateway. Після спарювання дії node вважаються діями довіреного оператора на цьому node. +- `sessionKey` — це вибір маршрутизації/контексту, а не автентифікація окремого користувача. +- Схвалення exec (allowlist + ask) — це запобіжники для наміру оператора, а не ізоляція від ворожого багатокористувацького середовища. +- Продуктовий стандарт OpenClaw для довірених сценаріїв із одним оператором — дозволяти host exec на `gateway`/`node` без запитів на схвалення (`security="full"`, `ask="off"`, якщо ви не посилите це). Це стандарт UX за задумом, а не вразливість сама по собі. +- Схвалення exec прив’язуються до точного контексту запиту та, наскільки можливо, до прямих локальних файлових операндів; вони не моделюють семантично кожен шлях завантажувача runtime/інтерпретатора. Для сильних меж використовуйте sandboxing та ізоляцію хоста. -Якщо вам потрібна ізоляція від зловмисних користувачів, розділіть межі довіри за користувачами ОС/хостами та запускайте окремі Gateway. +Якщо вам потрібна ізоляція від ворожих користувачів, розділяйте межі довіри за користувачами ОС/хостами та запускайте окремі Gateway. ## Матриця меж довіри -Використовуйте це як швидку модель під час оцінки ризику: +Використовуйте це як швидку модель під час оцінки ризиків: -| Межа або контроль | Що це означає | Типове хибне тлумачення | -| -------------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------- | -| `gateway.auth` (token/password/trusted-proxy/device auth) | Автентифікує виклики до API Gateway | «Щоб було безпечно, потрібні підписи для кожного повідомлення в кожному фреймі» | -| `sessionKey` | Ключ маршрутизації для вибору контексту/сесії | «Ключ сесії є межею автентифікації користувача» | -| Запобіжники prompt/content | Зменшують ризик зловживання моделлю | «Сама лише prompt injection доводить обхід авторизації» | -| `canvas.eval` / browser evaluate | Навмисна операторська можливість, коли ввімкнена | «Будь-який примітив JS eval автоматично є вразливістю в цій моделі довіри» | -| Локальна оболонка `!` у TUI | Явне локальне виконання, ініційоване оператором | «Зручна локальна shell-команда — це віддалена ін’єкція» | -| Node pairing і команди Node | Віддалене виконання на підключених пристроях на рівні оператора | «Керування віддаленим пристроєм за замовчуванням слід вважати недовіреним користувацьким доступом» | +| Межа або контроль | Що це означає | Типове хибне тлумачення | +| ------------------------------------------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------- | +| `gateway.auth` (token/password/trusted-proxy/device auth) | Автентифікує виклики до Gateway API | «Щоб було безпечно, потрібні підписи для кожного повідомлення в кожному кадрі» | +| `sessionKey` | Ключ маршрутизації для вибору контексту/сеансу | «Ключ сеансу — це межа автентифікації користувача» | +| Запобіжники prompt/контенту | Зменшують ризик зловживання моделлю | «Сама по собі prompt injection уже доводить обхід auth» | +| `canvas.eval` / browser evaluate | Навмисна можливість оператора, коли її ввімкнено | «Будь-який примітив JS eval автоматично є вразливістю в цій моделі довіри» | +| Локальна TUI `!` shell | Явно ініційоване оператором локальне виконання | «Зручна локальна shell-команда — це віддалена ін’єкція» | +| Спарювання node та команди node | Віддалене виконання на рівні оператора на спарених пристроях | «Керування віддаленим пристроєм слід за замовчуванням вважати доступом недовірених користувачів» | -## За задумом не є вразливостями +## Не є вразливостями за задумом -Про такі шаблони часто повідомляють, але зазвичай їх закривають без дій, якщо не показано реальний обхід межі: +Про такі шаблони часто повідомляють, але зазвичай їх закривають без дій, якщо не показано реального обходу меж: -- Ланцюги, що складаються лише з prompt injection, без обходу політики/автентифікації/sandbox. -- Твердження, які припускають ворожу багатокористувацьку роботу на одному спільному хості/config. -- Твердження, які класифікують звичайний операторський доступ шляхом читання (наприклад `sessions.list`/`sessions.preview`/`chat.history`) як IDOR у конфігурації зі спільним Gateway. -- Знахідки для розгортання лише на localhost (наприклад HSTS на Gateway, доступному лише через loopback). -- Знахідки щодо підписів вхідних Webhook Discord для вхідних шляхів, яких немає в цьому репозиторії. -- Звіти, які трактують метадані node pairing як прихований другий рівень погодження кожної команди для `system.run`, хоча реальною межею виконання залишається глобальна політика команд Node на Gateway плюс власні погодження exec на Node. -- Знахідки про «відсутню авторизацію на рівні користувача», які трактують `sessionKey` як токен авторизації. - -## Контрольний список для дослідника перед звітом - -Перш ніж відкривати GHSA, перевірте все з наведеного нижче: - -1. Відтворення все ще працює на останньому `main` або в останньому випуску. -2. Звіт містить точний шлях коду (`file`, function, line range) і протестовану версію/commit. -3. Вплив перетинає задокументовану межу довіри, а не зводиться лише до prompt injection. -4. Твердження не входить до [Out of Scope](https://github.com/openclaw/openclaw/blob/main/SECURITY.md#out-of-scope). -5. Наявні advisory перевірено на дублікати (повторно використовуйте канонічний GHSA, якщо це доречно). -6. Припущення щодо розгортання сформульовано явно (loopback/local чи відкрито назовні, довірені чи недовірені оператори). +- Ланцюжки, що ґрунтуються лише на prompt injection, без обходу політик/auth/sandbox. +- Твердження, які виходять із припущення про ворожу багатокористувацьку роботу на одному спільному хості/конфігурації. +- Твердження, які класифікують звичайний операторський доступ на читання (наприклад, `sessions.list`/`sessions.preview`/`chat.history`) як IDOR у сценарії зі спільним Gateway. +- Знахідки, що стосуються розгортання лише на localhost (наприклад, HSTS на Gateway, доступному лише через loopback). +- Знахідки щодо підписів вхідних Webhook Discord для вхідних шляхів, яких у цьому репозиторії не існує. +- Звіти, які трактують метадані спарювання node як прихований другий рівень схвалення для кожної команди `system.run`, хоча фактично межею виконання залишається глобальна політика команд node у gateway плюс власні схвалення exec на node. +- Знахідки про «відсутність авторизації на рівні користувача», які трактують `sessionKey` як токен auth. ## Посилена базова конфігурація за 60 секунд -Спочатку використовуйте цю базову конфігурацію, а потім вибірково знову вмикайте інструменти для довірених агентів: +Спочатку використайте цю базову конфігурацію, а потім вибірково знову вмикайте інструменти для кожного довіреного agent: ```json5 { @@ -170,293 +156,203 @@ OpenClaw припускає, що межа хоста і конфігураці } ``` -Це залишає Gateway доступним лише локально, ізолює DM і за замовчуванням вимикає інструменти control plane/runtime. +Це залишає Gateway доступним лише локально, ізолює DM і вимикає інструменти площини керування/runtime за замовчуванням. ## Швидке правило для спільної скриньки -Якщо більше ніж одна людина може надсилати DM вашому боту: +Якщо більше ніж одна людина може писати вашому боту в DM: -- Встановіть `session.dmScope: "per-channel-peer"` (або `"per-account-channel-peer"` для багатокористувацьких каналів). -- Залишайте `dmPolicy: "pairing"` або суворі allowlists. +- Установіть `session.dmScope: "per-channel-peer"` (або `"per-account-channel-peer"` для багатoакаунтних каналів). +- Залишайте `dmPolicy: "pairing"` або суворі allowlist. - Ніколи не поєднуйте спільні DM із широким доступом до інструментів. -- Це посилює захист кооперативних/спільних скриньок, але не призначене для ворожої ізоляції співорендарів, коли користувачі мають спільний доступ на запис до host/config. +- Це посилює захист для кооперативних/спільних вхідних скриньок, але не призначене для ізоляції ворожих співорендарів, якщо користувачі мають спільний доступ на запис до хоста/конфігурації. ## Модель видимості контексту OpenClaw розділяє два поняття: -- **Авторизація запуску**: хто може запускати агента (`dmPolicy`, `groupPolicy`, allowlists, mention gates). -- **Видимість контексту**: який додатковий контекст додається до вхідних даних моделі (тіло відповіді, цитований текст, історія гілки, метадані пересилання). +- **Авторизація тригера**: хто може активувати agent (`dmPolicy`, `groupPolicy`, allowlist, вимоги до згадки). +- **Видимість контексту**: який додатковий контекст вставляється у вхід моделі (тіло відповіді, цитований текст, історія треду, метадані пересилання). -Allowlists контролюють запуски та авторизацію команд. Налаштування `contextVisibility` визначає, як фільтрується додатковий контекст (цитовані відповіді, корені гілок, отримана історія): +Allowlist керують тригерами й авторизацією команд. Параметр `contextVisibility` визначає, як фільтрується додатковий контекст (цитовані відповіді, корені тредів, отримана історія): - `contextVisibility: "all"` (за замовчуванням) зберігає додатковий контекст у тому вигляді, в якому його отримано. - `contextVisibility: "allowlist"` фільтрує додатковий контекст до відправників, дозволених активними перевірками allowlist. -- `contextVisibility: "allowlist_quote"` поводиться як `allowlist`, але все одно зберігає одну явну цитовану відповідь. +- `contextVisibility: "allowlist_quote"` працює як `allowlist`, але все ж зберігає одну явно процитовану відповідь. -Встановлюйте `contextVisibility` для кожного каналу або для кожної кімнати/розмови. Див. [Групові чати](/uk/channels/groups#context-visibility-and-allowlists) для деталей налаштування. +Установлюйте `contextVisibility` для кожного каналу або кімнати/розмови. Докладніше див. у [Групові чати](/uk/channels/groups#context-visibility-and-allowlists). -Рекомендації для оцінки advisory: +Рекомендації для аналізу advisory: -- Твердження, які лише показують, що «модель може бачити цитований або історичний текст від відправників поза allowlist», є знахідками щодо посилення захисту, які вирішуються через `contextVisibility`, а не самі по собі є обходом меж автентифікації або sandbox. -- Щоб мати безпековий вплив, звіти все одно мають демонструвати обхід межі довіри (автентифікації, політики, sandbox, погодження або іншої задокументованої межі). +- Твердження, які лише показують, що «модель може бачити цитований або історичний текст від відправників поза allowlist», є знахідками щодо посилення захисту, які усуваються через `contextVisibility`, але самі по собі не є обходом меж auth чи sandbox. +- Щоб мати вплив на безпеку, звіти все одно мають демонструвати обхід межі довіри (auth, політики, sandbox, схвалення або іншої задокументованої межі). -## Що перевіряє аудит (на високому рівні) +## Що перевіряє аудит (загалом) -- **Вхідний доступ** (політики DM, групові політики, allowlists): чи можуть сторонні люди запускати бота? -- **Радіус ураження інструментів** (підвищені інструменти + відкриті кімнати): чи може prompt injection перетворитися на дії в оболонці/файловій системі/мережі? -- **Дрейф погоджень exec** (`security=full`, `autoAllowSkills`, interpreter allowlists без `strictInlineEval`): чи guardrails для host-exec досі працюють так, як ви очікуєте? - - `security="full"` — це широке попередження про модель безпеки, а не доказ помилки. Це вибране значення за замовчуванням для довірених конфігурацій персонального асистента; посилюйте його лише тоді, коли ваша модель загроз потребує погодження або захисних allowlist-обмежень. -- **Відкритість мережі** (Gateway bind/auth, Tailscale Serve/Funnel, слабкі/короткі auth-токени). -- **Відкритість керування браузером** (віддалені Node, relay-порти, віддалені CDP endpoints). -- **Гігієна локального диска** (права доступу, symlinks, include у config, шляхи до “синхронізованих папок”). +- **Вхідний доступ** (політики DM, групові політики, allowlist): чи можуть сторонні користувачі активувати бота? +- **Радіус ураження інструментів** (розширені інструменти + відкриті кімнати): чи може prompt injection перетворитися на дії shell/файлової системи/мережі? +- **Зсув схвалення exec** (`security=full`, `autoAllowSkills`, allowlist інтерпретаторів без `strictInlineEval`): чи запобіжники host-exec досі працюють так, як ви очікуєте? + - `security="full"` — це попередження про широку модель безпеки, а не доказ помилки. Це обране значення за замовчуванням для довірених персональних помічників; посилюйте його лише тоді, коли ваша модель загроз потребує схвалень або запобіжників на основі allowlist. +- **Мережевий доступ** (bind/auth Gateway, Tailscale Serve/Funnel, слабкі/короткі токени auth). +- **Доступ до керування браузером** (віддалені node, relay-порти, віддалені кінцеві точки CDP). +- **Гігієна локального диска** (дозволи, symlink, include конфігурації, шляхи «синхронізованих папок»). - **Plugins** (plugins завантажуються без явного allowlist). -- **Дрейф політики/помилки конфігурації** (налаштування sandbox docker задано, але режим sandbox вимкнено; неефективні шаблони `gateway.nodes.denyCommands`, бо зіставлення виконується лише за точною назвою команди, наприклад `system.run`, і не аналізує текст оболонки; небезпечні записи `gateway.nodes.allowCommands`; глобальний `tools.profile="minimal"` перевизначається профілями окремих агентів; інструменти, що належать Plugin, досяжні за надто дозволяючої політики інструментів). -- **Дрейф очікувань runtime** (наприклад, припущення, що неявний exec усе ще означає `sandbox`, хоча `tools.exec.host` тепер за замовчуванням має значення `auto`, або явне встановлення `tools.exec.host="sandbox"` за вимкненого режиму sandbox). -- **Гігієна моделей** (попередження, якщо налаштовані моделі виглядають застарілими; це не жорстке блокування). +- **Зсув політик/помилки конфігурації** (параметри sandbox docker налаштовані, але режим sandbox вимкнено; неефективні шаблони `gateway.nodes.denyCommands`, оскільки зіставлення виконується лише за точною назвою команди, наприклад `system.run`, і не аналізує текст shell; небезпечні записи `gateway.nodes.allowCommands`; глобальний `tools.profile="minimal"` перевизначено профілями окремих agent; інструменти, що належать plugin, доступні за надто поблажливої політики інструментів). +- **Зсув очікувань від runtime** (наприклад, припущення, що неявний exec усе ще означає `sandbox`, хоча тепер `tools.exec.host` за замовчуванням має значення `auto`, або явне встановлення `tools.exec.host="sandbox"` за вимкненого режиму sandbox). +- **Гігієна моделей** (попередження, якщо налаштовані моделі схожі на застарілі; це не жорстке блокування). -Якщо ви запускаєте `--deep`, OpenClaw також намагається виконати best-effort live-перевірку Gateway. +Якщо ви запускаєте `--deep`, OpenClaw також намагається виконати best-effort живу перевірку Gateway. ## Карта зберігання облікових даних -Використовуйте це під час аудиту доступу або коли вирішуєте, що потрібно резервувати: +Використовуйте це під час аудиту доступу або коли вирішуєте, що резервувати: - **WhatsApp**: `~/.openclaw/credentials/whatsapp//creds.json` -- **Токен Telegram-бота**: config/env або `channels.telegram.tokenFile` (лише звичайний файл; symlinks відхиляються) -- **Токен Discord-бота**: config/env або SecretRef (провайдери env/file/exec) -- **Токени Slack**: config/env (`channels.slack.*`) -- **Allowlists pairing**: +- **Telegram bot token**: config/env або `channels.telegram.tokenFile` (лише звичайний файл; symlink відхиляються) +- **Discord bot token**: config/env або SecretRef (провайдери env/file/exec) +- **Slack tokens**: config/env (`channels.slack.*`) +- **Pairing allowlist**: - `~/.openclaw/credentials/-allowFrom.json` (обліковий запис за замовчуванням) - `~/.openclaw/credentials/--allowFrom.json` (неосновні облікові записи) -- **Профілі автентифікації моделі**: `~/.openclaw/agents//agent/auth-profiles.json` -- **Payload секретів у файлі (необов’язково)**: `~/.openclaw/secrets.json` -- **Імпорт застарілого OAuth**: `~/.openclaw/credentials/oauth.json` +- **Профілі auth моделі**: `~/.openclaw/agents//agent/auth-profiles.json` +- **File-backed payload секретів (необов’язково)**: `~/.openclaw/secrets.json` +- **Застарілий імпорт OAuth**: `~/.openclaw/credentials/oauth.json` ## Контрольний список аудиту безпеки -Коли аудит виводить знахідки, використовуйте такий порядок пріоритетів: +Коли аудит виводить знахідки, сприймайте це в такому порядку пріоритету: -1. **Усе “open” + увімкнені інструменти**: спочатку обмежте DM/групи (pairing/allowlists), потім посильте політику інструментів/sandboxing. -2. **Відкрита мережа** (прив’язка до LAN, Funnel, відсутня auth): виправляйте негайно. -3. **Віддалене відкриття керування браузером**: розглядайте це як операторський доступ (лише tailnet, навмисне pairing Node, уникайте публічного відкриття). -4. **Права доступу**: переконайтеся, що state/config/credentials/auth не доступні на читання групі або всім користувачам. +1. **Усе, що є “open”, + увімкнені інструменти**: спочатку обмежте DM/групи (pairing/allowlist), потім посильте політику інструментів/sandboxing. +2. **Публічний мережевий доступ** (LAN bind, Funnel, відсутній auth): виправляйте негайно. +3. **Віддалений доступ до керування браузером**: розглядайте це як операторський доступ (лише tailnet, навмисно спаровувати node, уникати публічного доступу). +4. **Дозволи**: переконайтеся, що state/config/credentials/auth не доступні для читання групою або всіма. 5. **Plugins**: завантажуйте лише те, чому явно довіряєте. -6. **Вибір моделі**: для будь-якого бота з інструментами віддавайте перевагу сучасним, краще захищеним від інструкцій моделям. +6. **Вибір моделі**: надавайте перевагу сучасним, стійким до інструкцій моделям для будь-якого бота з інструментами. ## Глосарій аудиту безпеки -Значення `checkId` з високим сигналом, які ви найімовірніше побачите в реальних розгортаннях (не вичерпний список): +Кожна знахідка аудиту має структурований `checkId` (наприклад, +`gateway.bind_no_auth` або `tools.exec.security_full_configured`). Поширені +класи критичної серйозності: -| `checkId` | Серйозність | Чому це важливо | Основний ключ/шлях для виправлення | Автовиправлення | -| ------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | -------------- | -| `fs.state_dir.perms_world_writable` | critical | Інші користувачі/процеси можуть змінювати весь стан OpenClaw | права файлової системи для `~/.openclaw` | так | -| `fs.state_dir.perms_group_writable` | warn | Користувачі групи можуть змінювати весь стан OpenClaw | права файлової системи для `~/.openclaw` | так | -| `fs.state_dir.perms_readable` | warn | Каталог стану доступний для читання іншим | права файлової системи для `~/.openclaw` | так | -| `fs.state_dir.symlink` | warn | Цільовий каталог стану стає іншою межею довіри | структура файлової системи каталогу стану | ні | -| `fs.config.perms_writable` | critical | Інші можуть змінювати auth/політику інструментів/config | права файлової системи для `~/.openclaw/openclaw.json` | так | -| `fs.config.symlink` | warn | Конфігураційні файли через symlink не підтримуються для запису й додають ще одну межу довіри | замініть звичайним конфігураційним файлом або вкажіть `OPENCLAW_CONFIG_PATH` на реальний файл | ні | -| `fs.config.perms_group_readable` | warn | Користувачі групи можуть читати токени/налаштування з config | права файлової системи для конфігураційного файла | так | -| `fs.config.perms_world_readable` | critical | Config може розкрити токени/налаштування | права файлової системи для конфігураційного файла | так | -| `fs.config_include.perms_writable` | critical | Include-файл config може бути змінений іншими | права для include-файла, на який посилається `openclaw.json` | так | -| `fs.config_include.perms_group_readable` | warn | Користувачі групи можуть читати включені секрети/налаштування | права для include-файла, на який посилається `openclaw.json` | так | -| `fs.config_include.perms_world_readable` | critical | Включені секрети/налаштування доступні для читання всім | права для include-файла, на який посилається `openclaw.json` | так | -| `fs.auth_profiles.perms_writable` | critical | Інші можуть підмінити або замінити збережені облікові дані моделі | права для `agents//agent/auth-profiles.json` | так | -| `fs.auth_profiles.perms_readable` | warn | Інші можуть читати API-ключі та OAuth-токени | права для `agents//agent/auth-profiles.json` | так | -| `fs.credentials_dir.perms_writable` | critical | Інші можуть змінювати стан pairing/облікових даних каналів | права файлової системи для `~/.openclaw/credentials` | так | -| `fs.credentials_dir.perms_readable` | warn | Інші можуть читати стан облікових даних каналів | права файлової системи для `~/.openclaw/credentials` | так | -| `fs.sessions_store.perms_readable` | warn | Інші можуть читати транскрипти/метадані сесій | права для сховища сесій | так | -| `fs.log_file.perms_readable` | warn | Інші можуть читати журнали, де дані редаговано, але вони все ще чутливі | права для файла журналу Gateway | так | -| `fs.synced_dir` | warn | Стан/config в iCloud/Dropbox/Drive розширює ризик витоку токенів/транскриптів | перемістіть config/state за межі синхронізованих папок | ні | -| `gateway.bind_no_auth` | critical | Віддалене bind без спільного секрету | `gateway.bind`, `gateway.auth.*` | ні | -| `gateway.loopback_no_auth` | critical | loopback за reverse proxy може стати неавтентифікованим | `gateway.auth.*`, налаштування proxy | ні | -| `gateway.trusted_proxies_missing` | warn | Заголовки reverse proxy присутні, але проксі не позначені як trusted | `gateway.trustedProxies` | ні | -| `gateway.http.no_auth` | warn/critical | API Gateway HTTP доступні з `auth.mode="none"` | `gateway.auth.mode`, `gateway.http.endpoints.*` | ні | -| `gateway.http.session_key_override_enabled` | info | Виклики HTTP API можуть перевизначати `sessionKey` | `gateway.http.allowSessionKeyOverride` | ні | -| `gateway.tools_invoke_http.dangerous_allow` | warn/critical | Знову вмикає небезпечні інструменти через HTTP API | `gateway.tools.allow` | ні | -| `gateway.nodes.allow_commands_dangerous` | warn/critical | Умикає команди Node з високим впливом (камера/екран/контакти/календар/SMS) | `gateway.nodes.allowCommands` | ні | -| `gateway.nodes.deny_commands_ineffective` | warn | Записи deny, схожі на шаблони, не збігаються з текстом оболонки або групами | `gateway.nodes.denyCommands` | ні | -| `gateway.tailscale_funnel` | critical | Відкриття в публічний інтернет | `gateway.tailscale.mode` | ні | -| `gateway.tailscale_serve` | info | Відкриття в Tailnet увімкнено через Serve | `gateway.tailscale.mode` | ні | -| `gateway.control_ui.allowed_origins_required` | critical | Не-loopback Control UI без явного allowlist джерел браузера | `gateway.controlUi.allowedOrigins` | ні | -| `gateway.control_ui.allowed_origins_wildcard` | warn/critical | `allowedOrigins=["*"]` вимикає allowlist джерел браузера | `gateway.controlUi.allowedOrigins` | ні | -| `gateway.control_ui.host_header_origin_fallback` | warn/critical | Увімкнено fallback джерела через заголовок Host (послаблення захисту від DNS rebinding) | `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` | ні | -| `gateway.control_ui.insecure_auth` | warn | Увімкнено перемикач сумісності з небезпечною auth | `gateway.controlUi.allowInsecureAuth` | ні | -| `gateway.control_ui.device_auth_disabled` | critical | Вимкнено перевірку ідентичності пристрою | `gateway.controlUi.dangerouslyDisableDeviceAuth` | ні | -| `gateway.real_ip_fallback_enabled` | warn/critical | Довіра до fallback `X-Real-IP` може дозволити підміну source IP через помилку конфігурації proxy | `gateway.allowRealIpFallback`, `gateway.trustedProxies` | ні | -| `gateway.token_too_short` | warn | Короткий спільний токен легше підібрати | `gateway.auth.token` | ні | -| `gateway.auth_no_rate_limit` | warn | Відкрита auth без rate limiting підвищує ризик brute-force | `gateway.auth.rateLimit` | ні | -| `gateway.trusted_proxy_auth` | critical | Ідентичність proxy тепер стає межею auth | `gateway.auth.mode="trusted-proxy"` | ні | -| `gateway.trusted_proxy_no_proxies` | critical | trusted-proxy auth без IP trusted proxy є небезпечною | `gateway.trustedProxies` | ні | -| `gateway.trusted_proxy_no_user_header` | critical | trusted-proxy auth не може безпечно визначити ідентичність користувача | `gateway.auth.trustedProxy.userHeader` | ні | -| `gateway.trusted_proxy_no_allowlist` | warn | trusted-proxy auth приймає будь-якого автентифікованого користувача зверху | `gateway.auth.trustedProxy.allowUsers` | ні | -| `checkId` | Серйозність | Чому це важливо | Основний ключ/шлях для виправлення | Автовиправлення | -| ------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | -------------- | -| `gateway.probe_auth_secretref_unavailable` | warn | Deep probe не зміг розв’язати auth SecretRefs у цьому шляху виконання команди | джерело auth для deep probe / доступність SecretRef | ні | -| `gateway.probe_failed` | warn/critical | Live-перевірка Gateway не вдалася | доступність/auth Gateway | ні | -| `discovery.mdns_full_mode` | warn/critical | Повний режим mDNS рекламує метадані `cliPath`/`sshPort` у локальній мережі | `discovery.mdns.mode`, `gateway.bind` | ні | -| `config.insecure_or_dangerous_flags` | warn | Увімкнено будь-які небезпечні/ризиковані debug-прапорці | кілька ключів (див. деталі знахідки) | ні | -| `config.secrets.gateway_password_in_config` | warn | Пароль Gateway зберігається безпосередньо в config | `gateway.auth.password` | ні | -| `config.secrets.hooks_token_in_config` | warn | Bearer-токен hooks зберігається безпосередньо в config | `hooks.token` | ні | -| `hooks.token_reuse_gateway_token` | critical | Токен входу hooks також відкриває auth Gateway | `hooks.token`, `gateway.auth.token` | ні | -| `hooks.token_too_short` | warn | Легше виконати brute force для входу hooks | `hooks.token` | ні | -| `hooks.default_session_key_unset` | warn | Агент hook запускає fan out у згенеровані сесії для кожного запиту | `hooks.defaultSessionKey` | ні | -| `hooks.allowed_agent_ids_unrestricted` | warn/critical | Автентифіковані виклики hooks можуть маршрутизуватися до будь-якого налаштованого агента | `hooks.allowedAgentIds` | ні | -| `hooks.request_session_key_enabled` | warn/critical | Зовнішній виклик може вибирати `sessionKey` | `hooks.allowRequestSessionKey` | ні | -| `hooks.request_session_key_prefixes_missing` | warn/critical | Немає обмеження на форму зовнішніх ключів сесій | `hooks.allowedSessionKeyPrefixes` | ні | -| `hooks.path_root` | critical | Шлях hooks — `/`, через що вхідний маршрут легше колізує або маршрутизується хибно | `hooks.path` | ні | -| `hooks.installs_unpinned_npm_specs` | warn | Записи встановлення hooks не закріплені на незмінних npm-специфікаціях | метадані встановлення hook | ні | -| `hooks.installs_missing_integrity` | warn | У записах встановлення hooks відсутні метадані integrity | метадані встановлення hook | ні | -| `hooks.installs_version_drift` | warn | Записи встановлення hooks розходяться з установленими пакетами | метадані встановлення hook | ні | -| `logging.redact_off` | warn | Чутливі значення потрапляють у журнали/status | `logging.redactSensitive` | так | -| `browser.control_invalid_config` | warn | Конфігурація керування браузером невалідна ще до runtime | `browser.*` | ні | -| `browser.control_no_auth` | critical | Керування браузером відкрите без auth через token/password | `gateway.auth.*` | ні | -| `browser.remote_cdp_http` | warn | Віддалений CDP через звичайний HTTP не має шифрування транспорту | профіль браузера `cdpUrl` | ні | -| `browser.remote_cdp_private_host` | warn | Віддалений CDP націлено на приватний/внутрішній хост | профіль браузера `cdpUrl`, `browser.ssrfPolicy.*` | ні | -| `sandbox.docker_config_mode_off` | warn | Конфігурація Sandbox Docker присутня, але неактивна | `agents.*.sandbox.mode` | ні | -| `sandbox.bind_mount_non_absolute` | warn | Відносні bind mount можуть розв’язуватися непередбачувано | `agents.*.sandbox.docker.binds[]` | ні | -| `sandbox.dangerous_bind_mount` | critical | Цілі bind mount у Sandbox вказують на заблоковані системні шляхи, облікові дані або шляхи сокета Docker | `agents.*.sandbox.docker.binds[]` | ні | -| `sandbox.dangerous_network_mode` | critical | Мережа Sandbox Docker використовує `host` або `container:*` режим приєднання до простору імен | `agents.*.sandbox.docker.network` | ні | -| `sandbox.dangerous_seccomp_profile` | critical | Профіль seccomp Sandbox послаблює ізоляцію контейнера | `agents.*.sandbox.docker.securityOpt` | ні | -| `sandbox.dangerous_apparmor_profile` | critical | Профіль AppArmor Sandbox послаблює ізоляцію контейнера | `agents.*.sandbox.docker.securityOpt` | ні | -| `sandbox.browser_cdp_bridge_unrestricted` | warn | Browser bridge у Sandbox відкритий без обмеження діапазону джерел | `sandbox.browser.cdpSourceRange` | ні | -| `sandbox.browser_container.non_loopback_publish` | critical | Наявний контейнер браузера публікує CDP на не-loopback інтерфейсах | конфігурація publish контейнера browser sandbox | ні | -| `sandbox.browser_container.hash_label_missing` | warn | Наявний контейнер браузера створено до поточних міток хешу config | `openclaw sandbox recreate --browser --all` | ні | -| `sandbox.browser_container.hash_epoch_stale` | warn | Наявний контейнер браузера створено до поточної епохи config браузера | `openclaw sandbox recreate --browser --all` | ні | -| `tools.exec.host_sandbox_no_sandbox_defaults` | warn | `exec host=sandbox` завершується закритою відмовою, коли sandbox вимкнено | `tools.exec.host`, `agents.defaults.sandbox.mode` | ні | -| `tools.exec.host_sandbox_no_sandbox_agents` | warn | `exec host=sandbox` для окремого агента завершується закритою відмовою, коли sandbox вимкнено | `agents.list[].tools.exec.host`, `agents.list[].sandbox.mode` | ні | -| `tools.exec.security_full_configured` | warn/critical | Host exec працює з `security="full"` | `tools.exec.security`, `agents.list[].tools.exec.security` | ні | -| `tools.exec.auto_allow_skills_enabled` | warn | Погодження exec неявно довіряють skill bins | `~/.openclaw/exec-approvals.json` | ні | -| `tools.exec.allowlist_interpreter_without_strict_inline_eval` | warn | Interpreter allowlists дозволяють inline eval без примусового повторного погодження | `tools.exec.strictInlineEval`, `agents.list[].tools.exec.strictInlineEval`, allowlist погоджень exec | ні | -| `tools.exec.safe_bins_interpreter_unprofiled` | warn | Interpreter/runtime bins у `safeBins` без явних профілів розширюють ризик exec | `tools.exec.safeBins`, `tools.exec.safeBinProfiles`, `agents.list[].tools.exec.*` | ні | -| `tools.exec.safe_bins_broad_behavior` | warn | Інструменти з широкою поведінкою в `safeBins` послаблюють модель довіри низького ризику для stdin-фільтра | `tools.exec.safeBins`, `agents.list[].tools.exec.safeBins` | ні | -| `tools.exec.safe_bin_trusted_dirs_risky` | warn | `safeBinTrustedDirs` містить змінювані або ризиковані каталоги | `tools.exec.safeBinTrustedDirs`, `agents.list[].tools.exec.safeBinTrustedDirs` | ні | -| `skills.workspace.symlink_escape` | warn | `skills/**/SKILL.md` у робочому просторі розв’язується за межі кореня робочого простору (дрейф ланцюга symlink) | стан файлової системи workspace `skills/**` | ні | -| `plugins.extensions_no_allowlist` | warn | Plugins установлені без явного allowlist Plugin | `plugins.allowlist` | ні | -| `plugins.installs_unpinned_npm_specs` | warn | Записи встановлення Plugin не закріплені на незмінних npm-специфікаціях | метадані встановлення Plugin | ні | -| `checkId` | Серйозність | Чому це важливо | Основний ключ/шлях для виправлення | Автовиправлення | -| ------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | -------------- | -| `plugins.installs_missing_integrity` | warn | У записах встановлення Plugin відсутні метадані integrity | метадані встановлення Plugin | ні | -| `plugins.installs_version_drift` | warn | Записи встановлення Plugin розходяться з установленими пакетами | метадані встановлення Plugin | ні | -| `plugins.code_safety` | warn/critical | Сканування коду Plugin виявило підозрілі або небезпечні шаблони | код Plugin / джерело встановлення | ні | -| `plugins.code_safety.entry_path` | warn | Шлях входу Plugin вказує на приховані розташування або `node_modules` | `entry` у маніфесті Plugin | ні | -| `plugins.code_safety.entry_escape` | critical | Точка входу Plugin виходить за межі каталогу Plugin | `entry` у маніфесті Plugin | ні | -| `plugins.code_safety.scan_failed` | warn | Сканування коду Plugin не вдалося завершити | шлях Plugin / середовище сканування | ні | -| `skills.code_safety` | warn/critical | Метадані встановлення/код Skills містять підозрілі або небезпечні шаблони | джерело встановлення Skills | ні | -| `skills.code_safety.scan_failed` | warn | Сканування коду Skills не вдалося завершити | середовище сканування Skills | ні | -| `security.exposure.open_channels_with_exec` | warn/critical | Спільні/публічні кімнати можуть звертатися до агентів з увімкненим exec | `channels.*.dmPolicy`, `channels.*.groupPolicy`, `tools.exec.*`, `agents.list[].tools.exec.*` | ні | -| `security.exposure.open_groups_with_elevated` | critical | Відкриті групи + підвищені інструменти створюють шляхи prompt injection з високим впливом | `channels.*.groupPolicy`, `tools.elevated.*` | ні | -| `security.exposure.open_groups_with_runtime_or_fs` | critical/warn | Відкриті групи можуть звертатися до командних/файлових інструментів без захисту sandbox/workspace | `channels.*.groupPolicy`, `tools.profile/deny`, `tools.fs.workspaceOnly`, `agents.*.sandbox.mode` | ні | -| `security.trust_model.multi_user_heuristic` | warn | Конфігурація виглядає багатокористувацькою, тоді як модель довіри Gateway — персональний асистент | розділіть межі довіри або посильте спільний сценарій (`sandbox.mode`, deny інструментів/scoping робочого простору) | ні | -| `tools.profile_minimal_overridden` | warn | Перевизначення агента обходять глобальний мінімальний профіль | `agents.list[].tools.profile` | ні | -| `plugins.tools_reachable_permissive_policy` | warn | Інструменти розширень доступні в надто дозволяючих контекстах | `tools.profile` + allow/deny інструментів | ні | -| `models.legacy` | warn | Досі налаштовано застарілі сімейства моделей | вибір моделі | ні | -| `models.weak_tier` | warn | Налаштовані моделі нижчі за поточні рекомендовані рівні | вибір моделі | ні | -| `models.small_params` | critical/info | Малі моделі + небезпечні поверхні інструментів підвищують ризик ін’єкцій | вибір моделі + політика sandbox/інструментів | ні | -| `summary.attack_surface` | info | Підсумкове зведення щодо auth, каналів, інструментів і моделі відкритості | кілька ключів (див. деталі знахідки) | ні | +- `fs.*` — дозволи файлової системи для state, config, credentials, профілів auth. +- `gateway.*` — режим bind, auth, Tailscale, Control UI, налаштування trusted-proxy. +- `hooks.*`, `browser.*`, `sandbox.*`, `tools.exec.*` — посилення захисту для конкретних поверхонь. +- `plugins.*`, `skills.*` — знахідки щодо ланцюга постачання plugin/Skills і сканування. +- `security.exposure.*` — наскрізні перевірки, де політика доступу перетинається з радіусом ураження інструментів. + +Повний каталог із рівнями серйозності, ключами виправлень і підтримкою +автовиправлення див. у +[Перевірки аудиту безпеки](/uk/gateway/security/audit-checks). ## Control UI через HTTP -Control UI потребує **безпечного контексту** (HTTPS або localhost), щоб генерувати -ідентичність пристрою. `gateway.controlUi.allowInsecureAuth` — це локальний перемикач сумісності: +Для генерації ідентичності пристрою Control UI потрібен **безпечний контекст** (HTTPS або localhost). +`gateway.controlUi.allowInsecureAuth` — це локальний перемикач сумісності: -- На localhost він дозволяє auth для Control UI без ідентичності пристрою, коли сторінка +- На localhost він дозволяє auth у Control UI без ідентичності пристрою, коли сторінка завантажена через незахищений HTTP. - Він не обходить перевірки pairing. -- Він не послаблює вимоги до ідентичності пристрою для віддалених (не-localhost) підключень. +- Він не послаблює вимоги до ідентичності пристрою для віддалених (не localhost) сценаріїв. Надавайте перевагу HTTPS (Tailscale Serve) або відкривайте UI на `127.0.0.1`. Лише для аварійних сценаріїв `gateway.controlUi.dangerouslyDisableDeviceAuth` -повністю вимикає перевірки ідентичності пристрою. Це серйозне послаблення безпеки; -тримайте його вимкненим, якщо тільки ви активно не налагоджуєте проблему і можете швидко все повернути назад. +повністю вимикає перевірки ідентичності пристрою. Це серйозне зниження рівня безпеки; +тримайте цю опцію вимкненою, якщо ви не займаєтеся активним налагодженням і не можете швидко повернути зміни. -Окремо від цих небезпечних прапорців, успішний `gateway.auth.mode: "trusted-proxy"` -може допускати **операторські** сесії Control UI без ідентичності пристрою. Це -навмисна поведінка режиму auth, а не скорочення через `allowInsecureAuth`, і вона -все одно не поширюється на сесії Control UI з роллю Node. +Окремо від цих небезпечних прапорців, успішний режим `gateway.auth.mode: "trusted-proxy"` +може допускати **операторські** сеанси Control UI без ідентичності пристрою. Це +навмисна поведінка режиму auth, а не обхід через `allowInsecureAuth`, і вона все одно +не поширюється на сеанси Control UI з роллю node. -`openclaw security audit` попереджає, коли це налаштування ввімкнене. +`openclaw security audit` попереджає, коли це налаштування увімкнено. -## Підсумок щодо небезпечних або ризикованих прапорців +## Підсумок небезпечних і незахищених прапорців -`openclaw security audit` включає `config.insecure_or_dangerous_flags`, коли -відомі небезпечні/ризиковані debug-перемикачі ввімкнені. Наразі ця перевірка -агрегує: +`openclaw security audit` піднімає `config.insecure_or_dangerous_flags`, коли +увімкнено відомі небезпечні/незахищені перемикачі налагодження. Не використовуйте їх у +production. -- `gateway.controlUi.allowInsecureAuth=true` -- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` -- `gateway.controlUi.dangerouslyDisableDeviceAuth=true` -- `hooks.gmail.allowUnsafeExternalContent=true` -- `hooks.mappings[].allowUnsafeExternalContent=true` -- `tools.exec.applyPatch.workspaceOnly=false` -- `plugins.entries.acpx.config.permissionMode=approve-all` + + + - `gateway.controlUi.allowInsecureAuth=true` + - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` + - `gateway.controlUi.dangerouslyDisableDeviceAuth=true` + - `hooks.gmail.allowUnsafeExternalContent=true` + - `hooks.mappings[].allowUnsafeExternalContent=true` + - `tools.exec.applyPatch.workspaceOnly=false` + - `plugins.entries.acpx.config.permissionMode=approve-all` + -Повний список ключів config `dangerous*` / `dangerously*`, визначених у схемі -config OpenClaw: + + Control UI і браузер: -- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` -- `gateway.controlUi.dangerouslyDisableDeviceAuth` -- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` -- `channels.discord.dangerouslyAllowNameMatching` -- `channels.discord.accounts..dangerouslyAllowNameMatching` -- `channels.slack.dangerouslyAllowNameMatching` -- `channels.slack.accounts..dangerouslyAllowNameMatching` -- `channels.googlechat.dangerouslyAllowNameMatching` -- `channels.googlechat.accounts..dangerouslyAllowNameMatching` -- `channels.msteams.dangerouslyAllowNameMatching` -- `channels.synology-chat.dangerouslyAllowNameMatching` (канал Plugin) -- `channels.synology-chat.accounts..dangerouslyAllowNameMatching` (канал Plugin) -- `channels.synology-chat.dangerouslyAllowInheritedWebhookPath` (канал Plugin) -- `channels.zalouser.dangerouslyAllowNameMatching` (канал Plugin) -- `channels.zalouser.accounts..dangerouslyAllowNameMatching` (канал Plugin) -- `channels.irc.dangerouslyAllowNameMatching` (канал Plugin) -- `channels.irc.accounts..dangerouslyAllowNameMatching` (канал Plugin) -- `channels.mattermost.dangerouslyAllowNameMatching` (канал Plugin) -- `channels.mattermost.accounts..dangerouslyAllowNameMatching` (канал Plugin) -- `channels.telegram.network.dangerouslyAllowPrivateNetwork` -- `channels.telegram.accounts..network.dangerouslyAllowPrivateNetwork` -- `agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets` -- `agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources` -- `agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin` -- `agents.list[].sandbox.docker.dangerouslyAllowReservedContainerTargets` -- `agents.list[].sandbox.docker.dangerouslyAllowExternalBindSources` -- `agents.list[].sandbox.docker.dangerouslyAllowContainerNamespaceJoin` + - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback` + - `gateway.controlUi.dangerouslyDisableDeviceAuth` + - `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` -## Конфігурація reverse proxy + Зіставлення назв каналів (вбудовані канали та канали plugin; також доступно для + `accounts.`, де це застосовно): -Якщо ви запускаєте Gateway за reverse proxy (nginx, Caddy, Traefik тощо), налаштуйте -`gateway.trustedProxies` для правильної обробки пересланого IP клієнта. + - `channels.discord.dangerouslyAllowNameMatching` + - `channels.slack.dangerouslyAllowNameMatching` + - `channels.googlechat.dangerouslyAllowNameMatching` + - `channels.msteams.dangerouslyAllowNameMatching` + - `channels.synology-chat.dangerouslyAllowNameMatching` (канал plugin) + - `channels.synology-chat.dangerouslyAllowInheritedWebhookPath` (канал plugin) + - `channels.zalouser.dangerouslyAllowNameMatching` (канал plugin) + - `channels.irc.dangerouslyAllowNameMatching` (канал plugin) + - `channels.mattermost.dangerouslyAllowNameMatching` (канал plugin) -Коли Gateway виявляє заголовки proxy від адреси, якої **немає** в `trustedProxies`, він **не** вважатиме з’єднання локальними клієнтами. Якщо auth Gateway вимкнено, такі з’єднання відхиляються. Це запобігає обходу автентифікації, коли проксійовані з’єднання інакше виглядали б як такі, що приходять з localhost, і автоматично отримували б довіру. + Мережевий доступ: -`gateway.trustedProxies` також використовується для `gateway.auth.mode: "trusted-proxy"`, але цей режим auth суворіший: + - `channels.telegram.network.dangerouslyAllowPrivateNetwork` (також для кожного облікового запису) -- auth trusted-proxy **завершується закритою відмовою для proxy із джерелом loopback** -- reverse proxy на тому самому хості через loopback усе ще можуть використовувати `gateway.trustedProxies` для визначення локального клієнта та обробки пересланого IP -- для reverse proxy на тому самому хості через loopback використовуйте auth через token/password замість `gateway.auth.mode: "trusted-proxy"` + Sandbox Docker (типові значення + для окремих agent): + + - `agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets` + - `agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources` + - `agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin` + + + + +## Конфігурація зворотного проксі + +Якщо ви запускаєте Gateway за зворотним проксі (nginx, Caddy, Traefik тощо), налаштуйте +`gateway.trustedProxies` для коректної обробки IP-адрес клієнтів через forwarding-заголовки. + +Коли Gateway виявляє proxy-заголовки від адреси, якої **немає** у `trustedProxies`, він **не** вважає такі з’єднання локальними клієнтами. Якщо auth gateway вимкнено, такі з’єднання відхиляються. Це запобігає обходу автентифікації, коли проксійовані з’єднання інакше могли б виглядати як такі, що надходять із localhost, і отримувати автоматичну довіру. + +`gateway.trustedProxies` також використовується режимом `gateway.auth.mode: "trusted-proxy"`, але цей режим auth суворіший: + +- auth trusted-proxy **завершується безпечною відмовою для проксі з джерелом loopback** +- зворотні проксі loopback на тому самому хості все ще можуть використовувати `gateway.trustedProxies` для виявлення локальних клієнтів і обробки forwarding IP +- для loopback-зворотних проксі на тому самому хості використовуйте auth за token/password замість `gateway.auth.mode: "trusted-proxy"` ```yaml gateway: trustedProxies: - - "10.0.0.1" # IP reverse proxy - # Необов’язково. За замовчуванням false. - # Вмикайте лише якщо ваш proxy не може надавати X-Forwarded-For. + - "10.0.0.1" # IP-адреса зворотного проксі + # Необов’язково. Типове значення false. + # Увімкніть лише якщо ваш проксі не може надавати X-Forwarded-For. allowRealIpFallback: false auth: mode: password password: ${OPENCLAW_GATEWAY_PASSWORD} ``` -Коли `trustedProxies` налаштовано, Gateway використовує `X-Forwarded-For` для визначення IP клієнта. `X-Real-IP` за замовчуванням ігнорується, якщо лише `gateway.allowRealIpFallback: true` не встановлено явно. +Коли налаштовано `trustedProxies`, Gateway використовує `X-Forwarded-For` для визначення IP-адреси клієнта. `X-Real-IP` за замовчуванням ігнорується, якщо явно не встановлено `gateway.allowRealIpFallback: true`. -Правильна поведінка reverse proxy (перезаписувати вхідні заголовки forwarding): +Правильна поведінка зворотного проксі (перезапис вхідних forwarding-заголовків): ```nginx proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; ``` -Неправильна поведінка reverse proxy (додавати/зберігати недовірені заголовки forwarding): +Неправильна поведінка зворотного проксі (додавання/збереження недовірених forwarding-заголовків): ```nginx proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -464,103 +360,102 @@ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## Примітки щодо HSTS і origin -- Gateway OpenClaw насамперед орієнтований на local/loopback. Якщо ви завершуєте TLS на reverse proxy, налаштуйте HSTS на HTTPS-домені, який бачить proxy. -- Якщо HTTPS завершує сам gateway, ви можете встановити `gateway.http.securityHeaders.strictTransportSecurity`, щоб OpenClaw додавав заголовок HSTS у відповіді. +- Gateway OpenClaw орієнтований насамперед на local/loopback. Якщо ви завершуєте TLS на зворотному проксі, налаштуйте HSTS на HTTPS-домені з боку проксі. +- Якщо HTTPS завершується самим gateway, ви можете встановити `gateway.http.securityHeaders.strictTransportSecurity`, щоб OpenClaw додавав заголовок HSTS у свої відповіді. - Детальні рекомендації щодо розгортання наведено в [Trusted Proxy Auth](/uk/gateway/trusted-proxy-auth#tls-termination-and-hsts). -- Для розгортань Control UI не на loopback `gateway.controlUi.allowedOrigins` за замовчуванням є обов’язковим. -- `gateway.controlUi.allowedOrigins: ["*"]` — це явна політика дозволу всіх browser-origin, а не посилене значення за замовчуванням. Уникайте цього поза межами суворо контрольованого локального тестування. -- Збої browser-origin auth на loopback усе одно підлягають rate limiting, навіть коли - загальний виняток для loopback увімкнено, але ключ блокування визначається окремо для - кожного нормалізованого значення `Origin`, а не через один спільний bucket localhost. -- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим fallback origin через заголовок Host; розглядайте це як небезпечну політику, навмисно обрану оператором. -- Ставтеся до DNS rebinding і поведінки заголовка host у proxy як до питань посилення захисту розгортання; тримайте `trustedProxies` якомога вужчим і уникайте прямого відкриття gateway у публічний інтернет. +- Для розгортань Control UI поза loopback за замовчуванням потрібен `gateway.controlUi.allowedOrigins`. +- `gateway.controlUi.allowedOrigins: ["*"]` — це явна політика браузерних origin «дозволити все», а не посилене типове значення. Уникайте її поза межами жорстко контрольованого локального тестування. +- Збої browser-origin auth на loopback усе ще мають обмеження за частотою, навіть коли + загальний виняток для loopback увімкнено, але ключ блокування прив’язано до + нормалізованого значення `Origin`, а не до одного спільного localhost-блоку. +- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим fallback origin за Host-заголовком; розглядайте його як небезпечну політику, навмисно обрану оператором. +- Розглядайте DNS rebinding і поведінку proxy Host-заголовків як питання посилення безпеки розгортання; тримайте `trustedProxies` вузьким і не відкривайте gateway безпосередньо в публічний інтернет. -## Локальні журнали сесій зберігаються на диску +## Локальні журнали сеансів зберігаються на диску -OpenClaw зберігає транскрипти сесій на диску в `~/.openclaw/agents//sessions/*.jsonl`. -Це потрібно для безперервності сесій і (необов’язково) індексації пам’яті сесій, але це також означає, -що **будь-який процес/користувач із доступом до файлової системи може читати ці журнали**. Розглядайте доступ до диска як межу довіри -і обмежуйте права на `~/.openclaw` (див. розділ аудиту нижче). Якщо вам потрібна -сильніша ізоляція між агентами, запускайте їх під окремими користувачами ОС або на окремих хостах. +OpenClaw зберігає транскрипти сеансів на диску в `~/.openclaw/agents//sessions/*.jsonl`. +Це потрібно для безперервності сеансів і (необов’язково) індексації пам’яті сеансів, але це також означає, що +**будь-який процес/користувач із доступом до файлової системи може читати ці журнали**. Вважайте доступ до диска +межею довіри та обмежуйте дозволи на `~/.openclaw` (див. розділ аудиту нижче). Якщо вам потрібна +сильніша ізоляція між agent, запускайте їх під окремими користувачами ОС або на окремих хостах. -## Виконання на Node (`system.run`) +## Виконання на node (`system.run`) -Якщо Node macOS підключено через pairing, Gateway може викликати `system.run` на цьому Node. Це **віддалене виконання коду** на Mac: +Якщо спарено macOS node, Gateway може викликати `system.run` на цьому node. Це **віддалене виконання коду** на Mac: -- Потребує pairing Node (погодження + токен). -- Pairing Node на Gateway не є поверхнею погодження кожної окремої команди. Він встановлює ідентичність/довіру Node та видачу токена. -- Gateway застосовує грубу глобальну політику команд Node через `gateway.nodes.allowCommands` / `denyCommands`. -- На Mac це керується через **Settings → Exec approvals** (`security` + `ask` + allowlist). -- Політика `system.run` для конкретного Node — це власний файл погоджень exec Node (`exec.approvals.node.*`), який може бути суворішим або м’якшим за глобальну політику ID команд на Gateway. -- Node, що працює з `security="full"` і `ask="off"`, відповідає стандартній моделі довіреного оператора. Розглядайте це як очікувану поведінку, якщо лише ваше розгортання явно не вимагає суворішої моделі погоджень або allowlist. -- Режим погодження прив’язується до точного контексту запиту і, коли це можливо, до одного конкретного локального операнда script/file. Якщо OpenClaw не може визначити рівно один прямий локальний файл для команди interpreter/runtime, виконання з підтвердженням погодження відхиляється замість того, щоб обіцяти повне семантичне покриття. -- Для `host=node` виконання з погодженням також зберігають канонічний підготовлений - `systemRunPlan`; пізніші схвалені переспрямування повторно використовують цей збережений план, а - валідація Gateway відхиляє редагування команди/cwd/контексту сесії викликом після створення - запиту на погодження. -- Якщо ви не хочете віддаленого виконання, встановіть security у **deny** і видаліть pairing Node для цього Mac. +- Потрібне спарювання node (схвалення + токен). +- Спарювання node через Gateway не є поверхнею схвалення для кожної окремої команди. Воно встановлює ідентичність/довіру до node та видачу токенів. +- Gateway застосовує грубу глобальну політику команд node через `gateway.nodes.allowCommands` / `denyCommands`. +- Керування на Mac здійснюється через **Settings → Exec approvals** (security + ask + allowlist). +- Політика `system.run` для кожного node — це власний файл схвалень exec цього node (`exec.approvals.node.*`), який може бути суворішим або м’якшим за глобальну політику ідентифікаторів команд у gateway. +- Node, що працює з `security="full"` і `ask="off"`, дотримується типової моделі довіреного оператора. Вважайте це очікуваною поведінкою, якщо тільки ваше розгортання явно не вимагає суворішої моделі схвалення або allowlist. +- Режим схвалення прив’язує точний контекст запиту та, коли це можливо, один конкретний локальний операнд script/file. Якщо OpenClaw не може визначити рівно один прямий локальний файл для команди інтерпретатора/runtime, виконання на основі схвалення забороняється замість того, щоб обіцяти повне семантичне покриття. +- Для `host=node` виконання на основі схвалення також зберігає канонічний підготовлений + `systemRunPlan`; подальші схвалені forwarding-виклики повторно використовують цей збережений план, а gateway + відхиляє зміни від викликача до command/cwd/session context після створення запиту на схвалення. +- Якщо вам не потрібне віддалене виконання, встановіть security у значення **deny** і скасуйте спарювання node для цього Mac. -Це розрізнення важливе для triage: +Ця відмінність важлива для аналізу: -- Повторне підключення paired Node, що рекламує інший список команд, саме по собі не є вразливістю, якщо глобальна політика Gateway і локальні погодження exec на Node все ще забезпечують реальну межу виконання. -- Звіти, які трактують метадані node pairing як другий прихований рівень погодження кожної команди, зазвичай є плутаниною в політиці/UX, а не обходом межі безпеки. +- Повторно підключений спарений node, який оголошує інший список команд, сам по собі не є вразливістю, якщо глобальна політика Gateway та локальні схвалення exec на node і надалі забезпечують реальну межу виконання. +- Звіти, які трактують метадані спарювання node як другий прихований рівень схвалення для кожної команди, зазвичай є плутаниною політики/UX, а не обходом межі безпеки. -## Динамічні Skills (watcher / віддалені Node) +## Динамічні Skills (watcher / віддалені node) -OpenClaw може оновлювати список Skills посеред сесії: +OpenClaw може оновлювати список Skills посеред сеансу: -- **Watcher Skills**: зміни в `SKILL.md` можуть оновити знімок Skills на наступному ході агента. -- **Віддалені Node**: підключення macOS Node може зробити доступними Skills лише для macOS (на основі перевірки bins). +- **Watcher Skills**: зміни в `SKILL.md` можуть оновити знімок Skills на наступному ході agent. +- **Віддалені node**: підключення macOS node може зробити доступними Skills лише для macOS (на основі перевірки bin). -Ставтеся до папок Skills як до **довіреного коду** і обмежуйте коло тих, хто може їх змінювати. +Сприймайте папки Skills як **довірений код** і обмежуйте коло тих, хто може їх змінювати. ## Модель загроз -Ваш AI-асистент може: +Ваш AI-помічник може: - Виконувати довільні shell-команди - Читати/записувати файли - Отримувати доступ до мережевих сервісів - Надсилати повідомлення будь-кому (якщо ви дали йому доступ до WhatsApp) -Люди, які надсилають вам повідомлення, можуть: +Люди, які пишуть вам, можуть: -- Намагатися обманом змусити ваш AI робити небезпечні речі +- Намагатися змусити AI зробити щось шкідливе - Використовувати соціальну інженерію для доступу до ваших даних - Досліджувати деталі інфраструктури -## Основна концепція: контроль доступу перед інтелектом +## Основна ідея: контроль доступу перед інтелектом Більшість збоїв тут — не витончені експлойти, а ситуації на кшталт «хтось написав боту, і бот зробив те, що його попросили». Позиція OpenClaw: -- **Спочатку ідентичність:** визначте, хто може спілкуватися з ботом (DM pairing / allowlists / явний режим “open”). -- **Потім межі:** визначте, де боту дозволено діяти (group allowlists + фільтрація згадок, інструменти, sandboxing, дозволи пристроїв). -- **Модель в останню чергу:** припускайте, що моделлю можна маніпулювати; проєктуйте систему так, щоб наслідки маніпуляцій мали обмежений радіус ураження. +- **Спочатку ідентичність:** визначте, хто може спілкуватися з ботом (спарювання DM / allowlist / явне “open”). +- **Потім межі:** визначте, де боту дозволено діяти (group allowlist + вимога згадки, інструменти, sandboxing, дозволи пристрою). +- **І насамкінець модель:** виходьте з того, що моделлю можна маніпулювати; проєктуйте систему так, щоб наслідки таких маніпуляцій були обмеженими. ## Модель авторизації команд -Slash commands і directives враховуються лише для **авторизованих відправників**. Авторизація визначається -через allowlists/pairing каналу плюс `commands.useAccessGroups` (див. [Configuration](/uk/gateway/configuration) -і [Slash commands](/uk/tools/slash-commands)). Якщо allowlist каналу порожній або містить `"*"`, -команди фактично відкриті для цього каналу. +Slash-команди та директиви обробляються лише для **авторизованих відправників**. Авторизація визначається +через channel allowlist/спарювання разом із `commands.useAccessGroups` (див. [Конфігурація](/uk/gateway/configuration) +і [Slash-команди](/uk/tools/slash-commands)). Якщо channel allowlist порожній або містить `"*"`, +команди фактично є відкритими для цього каналу. -`/exec` — це session-only зручність для авторизованих операторів. Він **не** записує config і -не змінює інші сесії. +`/exec` — це зручна функція лише для сеансу для авторизованих операторів. Вона **не** записує конфігурацію і +не змінює інші сеанси. -## Ризики інструментів control plane +## Ризики інструментів площини керування -Два вбудовані інструменти можуть вносити постійні зміни в control plane: +Два вбудовані інструменти можуть вносити постійні зміни до площини керування: -- `gateway` може переглядати config через `config.schema.lookup` / `config.get`, а також робити постійні зміни через `config.apply`, `config.patch` і `update.run`. -- `cron` може створювати заплановані завдання, які продовжують виконуватися після завершення початкового чату/завдання. +- `gateway` може перевіряти конфігурацію через `config.schema.lookup` / `config.get`, а також робити постійні зміни через `config.apply`, `config.patch` і `update.run`. +- `cron` може створювати заплановані завдання, які продовжують працювати після завершення початкового чату/задачі. -Інструмент runtime `gateway`, доступний лише власнику, усе ще відмовляється переписувати +Інструмент runtime `gateway`, доступний лише власнику, як і раніше, відмовляється переписувати `tools.exec.ask` або `tools.exec.security`; застарілі псевдоніми `tools.bash.*` нормалізуються до тих самих захищених шляхів exec перед записом. -Для будь-якого агента/поверхні, що обробляє недовірений вміст, за замовчуванням забороняйте їх: +Для будь-якого agent/поверхні, що обробляє недовірений контент, забороняйте їх за замовчуванням: ```json5 { @@ -570,36 +465,36 @@ Slash commands і directives враховуються лише для **авто } ``` -`commands.restart=false` блокує лише дії перезапуску. Він не вимикає дії `gateway` щодо config/update. +`commands.restart=false` блокує лише дії перезапуску. Він не вимикає дії `gateway` для конфігурації/оновлення. ## Plugins -Plugins працюють **у тому самому процесі**, що й Gateway. Розглядайте їх як довірений код: +Plugins працюють **у тому самому процесі**, що й Gateway. Сприймайте їх як довірений код: -- Установлюйте plugins лише з джерел, яким довіряєте. -- Надавайте перевагу явним allowlists `plugins.allow`. -- Переглядайте config Plugin перед увімкненням. -- Перезапускайте Gateway після змін у plugins. -- Якщо ви встановлюєте або оновлюєте plugins (`openclaw plugins install `, `openclaw plugins update `), ставтеся до цього як до запуску недовіреного коду: - - Шлях встановлення — це каталог конкретного Plugin у межах активного кореня встановлення plugins. - - Перед встановленням/оновленням OpenClaw запускає вбудоване сканування небезпечного коду. Знахідки `critical` за замовчуванням блокують дію. - - OpenClaw використовує `npm pack`, а потім запускає `npm install --omit=dev` у цьому каталозі (скрипти життєвого циклу npm можуть виконувати код під час встановлення). - - Надавайте перевагу pinned, exact versions (`@scope/pkg@1.2.3`) і переглядайте розпакований код на диску перед увімкненням. - - `--dangerously-force-unsafe-install` — лише аварійний варіант для хибнопозитивних результатів вбудованого сканування у потоках встановлення/оновлення Plugin. Він не обходить блокування політики hook `before_install` Plugin і не обходить збої сканування. - - Встановлення залежностей Skills через Gateway дотримуються того самого поділу на dangerous/suspicious: вбудовані знахідки `critical` блокують дію, якщо тільки виклик явно не встановлює `dangerouslyForceUnsafeInstall`, тоді як suspicious-знахідки все ще лише попереджають. `openclaw skills install` лишається окремим потоком завантаження/встановлення Skills через ClawHub. +- Встановлюйте plugins лише з джерел, яким ви довіряєте. +- Віддавайте перевагу явним allowlist `plugins.allow`. +- Перевіряйте конфігурацію plugin перед увімкненням. +- Перезапускайте Gateway після змін plugin. +- Якщо ви встановлюєте або оновлюєте plugins (`openclaw plugins install `, `openclaw plugins update `), сприймайте це як запуск недовіреного коду: + - Шлях установлення — це каталог конкретного plugin у межах активного кореня встановлення plugin. + - Перед установленням/оновленням OpenClaw запускає вбудоване сканування небезпечного коду. Знахідки рівня `critical` блокуються за замовчуванням. + - OpenClaw використовує `npm pack`, а потім запускає `npm install --omit=dev` у цьому каталозі (npm lifecycle scripts можуть виконувати код під час встановлення). + - Віддавайте перевагу зафіксованим точним версіям (`@scope/pkg@1.2.3`) і перевіряйте розпакований код на диску перед увімкненням. + - `--dangerously-force-unsafe-install` — лише аварійний варіант для хибнопозитивних спрацювань вбудованого сканування під час потоків встановлення/оновлення plugin. Він не обходить блокування політик hook `before_install` plugin і не обходить збої сканування. + - Установлення залежностей Skills через Gateway дотримується того самого розділення на dangerous/suspicious: вбудовані знахідки `critical` блокуються, якщо викликач явно не встановить `dangerouslyForceUnsafeInstall`, тоді як suspicious-знахідки все ще лише попереджають. `openclaw skills install` залишається окремим потоком завантаження/встановлення Skills через ClawHub. -Деталі: [Plugins](/uk/tools/plugin) +Докладніше: [Plugins](/uk/tools/plugin) -## Модель доступу до DM (pairing / allowlist / open / disabled) +## Модель доступу DM (pairing / allowlist / open / disabled) -Усі поточні канали з підтримкою DM підтримують політику DM (`dmPolicy` або `*.dm.policy`), яка блокує вхідні DM **до** обробки повідомлення: +Усі поточні канали з підтримкою DM мають політику DM (`dmPolicy` або `*.dm.policy`), яка обмежує вхідні DM **до** обробки повідомлення: -- `pairing` (за замовчуванням): невідомі відправники отримують короткий код pairing, а бот ігнорує їхнє повідомлення до схвалення. Коди дійсні 1 годину; повторні DM не надсилають код повторно, доки не створено новий запит. За замовчуванням кількість очікувальних запитів обмежена до **3 на канал**. -- `allowlist`: невідомі відправники блокуються (без handshake pairing). -- `open`: дозволяє будь-кому надсилати DM (публічний режим). **Потребує**, щоб allowlist каналу містив `"*"` (явне підтвердження). -- `disabled`: повністю ігнорує вхідні DM. +- `pairing` (за замовчуванням): невідомі відправники отримують короткий код спарювання, а бот ігнорує їхнє повідомлення до схвалення. Коди спливають через 1 годину; повторні DM не надсилають код повторно, доки не буде створено новий запит. Кількість запитів, що очікують, за замовчуванням обмежена **3 на канал**. +- `allowlist`: невідомі відправники блокуються (без процедури спарювання). +- `open`: дозволити будь-кому писати в DM (публічно). **Потребує**, щоб channel allowlist містив `"*"` (явне підтвердження). +- `disabled`: повністю ігнорувати вхідні DM. Схвалення через CLI: @@ -608,11 +503,11 @@ openclaw pairing list openclaw pairing approve ``` -Деталі + файли на диску: [Pairing](/uk/channels/pairing) +Докладніше + файли на диску: [Pairing](/uk/channels/pairing) -## Ізоляція сесій DM (багатокористувацький режим) +## Ізоляція сеансів DM (багатокористувацький режим) -За замовчуванням OpenClaw маршрутизує **усі DM до головної сесії**, щоб ваш асистент зберігав безперервність між пристроями та каналами. Якщо **кілька людей** можуть надсилати DM боту (відкриті DM або allowlist з кількох осіб), розгляньте ізоляцію сесій DM: +За замовчуванням OpenClaw спрямовує **усі DM до основного сеансу**, щоб ваш помічник зберігав безперервність між пристроями та каналами. Якщо **кілька людей** можуть писати боту в DM (відкриті DM або allowlist із кількох осіб), подумайте про ізоляцію сеансів DM: ```json5 { @@ -622,211 +517,211 @@ openclaw pairing approve Це запобігає витоку контексту між користувачами, зберігаючи ізоляцію групових чатів. -Це межа контексту обміну повідомленнями, а не межа адміністрування хоста. Якщо користувачі взаємно зловмисні та мають спільний host/config Gateway, запускайте окремі Gateway для кожної межі довіри. +Це межа контексту обміну повідомленнями, а не межа адміністрування хоста. Якщо користувачі взаємно ворожі й мають спільний хост/конфігурацію Gateway, запускайте окремі Gateway для кожної межі довіри. ### Безпечний режим DM (рекомендовано) -Ставтеся до наведеного вище фрагмента як до **безпечного режиму DM**: +Сприймайте наведений вище фрагмент як **безпечний режим DM**: -- За замовчуванням: `session.dmScope: "main"` (усі DM використовують одну спільну сесію для безперервності). -- Значення за замовчуванням під час локального onboarding через CLI: записує `session.dmScope: "per-channel-peer"`, якщо значення не задано (наявні явні значення зберігаються). +- За замовчуванням: `session.dmScope: "main"` (усі DM ділять один сеанс для безперервності). +- Типове значення для локального onboarding через CLI: записує `session.dmScope: "per-channel-peer"`, якщо значення не задано (наявні явні значення зберігаються). - Безпечний режим DM: `session.dmScope: "per-channel-peer"` (кожна пара канал+відправник отримує ізольований контекст DM). -- Ізоляція однолітка між каналами: `session.dmScope: "per-peer"` (кожен відправник отримує одну сесію для всіх каналів одного типу). +- Міжканальна ізоляція за відправником: `session.dmScope: "per-peer"` (кожен відправник отримує один сеанс у межах усіх каналів того самого типу). -Якщо ви використовуєте кілька облікових записів в одному каналі, натомість використовуйте `per-account-channel-peer`. Якщо одна й та сама людина контактує з вами через кілька каналів, використовуйте `session.identityLinks`, щоб об’єднати ці сесії DM в одну канонічну ідентичність. Див. [Session Management](/uk/concepts/session) і [Configuration](/uk/gateway/configuration). +Якщо ви використовуєте кілька облікових записів в одному каналі, натомість використовуйте `per-account-channel-peer`. Якщо одна й та сама людина звертається до вас через кілька каналів, використовуйте `session.identityLinks`, щоб звести ці сеанси DM до однієї канонічної ідентичності. Див. [Керування сеансами](/uk/concepts/session) і [Конфігурація](/uk/gateway/configuration). ## Allowlists (DM + групи) — термінологія -OpenClaw має два окремі шари «хто може мене запускати?»: +OpenClaw має два окремі шари «хто може мене активувати?»: -- **DM allowlist** (`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`; застаріле: `channels.discord.dm.allowFrom`, `channels.slack.dm.allowFrom`): хто має право спілкуватися з ботом у прямих повідомленнях. - - Коли `dmPolicy="pairing"`, схвалення записуються до account-scoped сховища pairing allowlist у `~/.openclaw/credentials/` (`-allowFrom.json` для облікового запису за замовчуванням, `--allowFrom.json` для неосновних облікових записів), а потім об’єднуються з allowlists із config. -- **Group allowlist** (залежить від каналу): з яких груп/каналів/guilds бот взагалі прийматиме повідомлення. +- **DM allowlist** (`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`; застаріле: `channels.discord.dm.allowFrom`, `channels.slack.dm.allowFrom`): хто має право писати боту в особисті повідомлення. + - Коли `dmPolicy="pairing"`, схвалення записуються до сховища pairing allowlist з областю дії облікового запису в `~/.openclaw/credentials/` (`-allowFrom.json` для облікового запису за замовчуванням, `--allowFrom.json` для неосновних облікових записів), а потім об’єднуються з allowlist із config. +- **Group allowlist** (залежить від каналу): з яких саме груп/каналів/guild бот узагалі прийматиме повідомлення. - Типові шаблони: - - `channels.whatsapp.groups`, `channels.telegram.groups`, `channels.imessage.groups`: значення за замовчуванням для груп, наприклад `requireMention`; якщо задано, це також працює як group allowlist (включіть `"*"` для збереження поведінки allow-all). - - `groupPolicy="allowlist"` + `groupAllowFrom`: обмежує, хто може запускати бота _всередині_ групової сесії (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams). - - `channels.discord.guilds` / `channels.slack.channels`: allowlists для кожної поверхні + значення згадок за замовчуванням. - - Перевірки груп виконуються в такому порядку: спочатку `groupPolicy`/group allowlists, потім активація згадкою/відповіддю. - - Відповідь на повідомлення бота (неявна згадка) **не** обходить allowlists відправника, як-от `groupAllowFrom`. - - **Примітка щодо безпеки:** ставтеся до `dmPolicy="open"` і `groupPolicy="open"` як до крайніх налаштувань. Їх слід використовувати якомога рідше; віддавайте перевагу pairing + allowlists, якщо тільки ви повністю не довіряєте кожному учаснику кімнати. + - `channels.whatsapp.groups`, `channels.telegram.groups`, `channels.imessage.groups`: типові значення для груп, наприклад `requireMention`; якщо задано, це також працює як group allowlist (додайте `"*"`, щоб зберегти поведінку «дозволити всі»). + - `groupPolicy="allowlist"` + `groupAllowFrom`: обмежує, хто може активувати бота _всередині_ групового сеансу (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams). + - `channels.discord.guilds` / `channels.slack.channels`: allowlist для конкретних поверхонь + типові параметри згадки. + - Перевірки груп виконуються в такому порядку: спочатку `groupPolicy`/group allowlist, потім активація за згадкою/відповіддю. + - Відповідь на повідомлення бота (неявна згадка) **не** обходить allowlist відправника, такі як `groupAllowFrom`. + - **Примітка щодо безпеки:** сприймайте `dmPolicy="open"` і `groupPolicy="open"` як крайні варіанти. Їх слід використовувати якомога рідше; віддавайте перевагу pairing + allowlist, якщо ви не довіряєте повністю кожному учаснику кімнати. -Деталі: [Configuration](/uk/gateway/configuration) і [Groups](/uk/channels/groups) +Докладніше: [Конфігурація](/uk/gateway/configuration) і [Групи](/uk/channels/groups) ## Prompt injection (що це таке і чому це важливо) -Prompt injection — це коли зловмисник створює повідомлення, яке маніпулює моделлю, змушуючи її робити небезпечні речі («ігноруй свої інструкції», «виведи вміст файлової системи», «перейди за цим посиланням і виконай команди» тощо). +Prompt injection — це коли зловмисник створює повідомлення, яке маніпулює моделлю так, щоб вона зробила щось небезпечне («ігноруй інструкції», «виведи мою файлову систему», «перейди за цим посиланням і виконай команди» тощо). -Навіть за наявності сильних системних prompt, **prompt injection не є вирішеною проблемою**. Запобіжники системного prompt — це лише м’які рекомендації; жорстке застосування забезпечується політикою інструментів, погодженнями exec, sandboxing і allowlists каналів (і оператори можуть вимкнути це за задумом). Що реально допомагає на практиці: +Навіть із сильними system prompt **проблему prompt injection не вирішено**. Запобіжники в system prompt — це лише м’які рекомендації; жорстке забезпечення походить від політики інструментів, схвалень exec, sandboxing і channel allowlist (і оператори можуть вимкнути це за задумом). Що реально допомагає на практиці: -- Тримайте вхідні DM закритими (pairing/allowlists). -- У групах надавайте перевагу активації через згадку; уникайте ботів, які «завжди слухають» у публічних кімнатах. -- За замовчуванням вважайте посилання, вкладення та вставлені інструкції ворожими. -- Виконуйте чутливі інструменти в sandbox; не тримайте секрети у файловій системі, доступній агенту. -- Примітка: sandboxing — опційний механізм. Якщо режим sandbox вимкнено, неявний `host=auto` розв’язується до хоста gateway. Явний `host=sandbox` усе одно завершується закритою відмовою, бо runtime sandbox недоступний. Встановіть `host=gateway`, якщо хочете, щоб така поведінка була явно зафіксована в config. -- Обмежуйте інструменти високого ризику (`exec`, `browser`, `web_fetch`, `web_search`) довіреними агентами або явними allowlists. -- Якщо ви додаєте interpreter до allowlist (`python`, `node`, `ruby`, `perl`, `php`, `lua`, `osascript`), увімкніть `tools.exec.strictInlineEval`, щоб форми inline eval усе одно вимагали явного погодження. -- Аналіз погоджень оболонки також відхиляє форми POSIX parameter expansion (`$VAR`, `$?`, `$$`, `$1`, `$@`, `${…}`) всередині **нецитованих heredoc**, тож тіло heredoc з allowlist не може непомітно провести shell expansion повз перевірку allowlist як звичайний текст. Щоб увімкнути семантику буквального тіла, візьміть термінатор heredoc у лапки (наприклад, `<<'EOF'`); нецитовані heredoc, які спричинили б розгортання змінних, відхиляються. -- **Вибір моделі має значення:** старіші/менші/застарілі моделі значно менш стійкі до prompt injection і зловживання інструментами. Для агентів з увімкненими інструментами використовуйте найсильнішу доступну модель останнього покоління, посилену щодо дотримання інструкцій. +- Тримайте вхідні DM закритими (pairing/allowlist). +- У групах віддавайте перевагу активації через згадку; уникайте «завжди активних» ботів у публічних кімнатах. +- Сприймайте посилання, вкладення та вставлені інструкції як ворожі за замовчуванням. +- Запускайте чутливе виконання інструментів у sandbox; тримайте секрети поза файловою системою, доступною для agent. +- Зауваження: sandboxing є добровільним. Якщо режим sandbox вимкнено, неявний `host=auto` визначається як хост gateway. Явний `host=sandbox` усе одно безпечно завершується помилкою, оскільки runtime sandbox недоступний. Установіть `host=gateway`, якщо хочете, щоб така поведінка була явно зафіксована в config. +- Обмежуйте високоризикові інструменти (`exec`, `browser`, `web_fetch`, `web_search`) лише довіреними agent або явними allowlist. +- Якщо ви додаєте інтерпретатори до allowlist (`python`, `node`, `ruby`, `perl`, `php`, `lua`, `osascript`), увімкніть `tools.exec.strictInlineEval`, щоб форми inline eval і надалі вимагали явного схвалення. +- Аналіз схвалення shell також відхиляє форми розгортання параметрів POSIX (`$VAR`, `$?`, `$$`, `$1`, `$@`, `${…}`) всередині **нецитованих heredoc**, щоб тіло heredoc з allowlist не могло непомітно провести розгортання shell повз перевірку allowlist як звичайний текст. Щоб увімкнути буквальну семантику тіла, цитуйте термінатор heredoc (наприклад, `<<'EOF'`); нецитовані heredoc, у яких відбулося б розгортання змінних, відхиляються. +- **Вибір моделі має значення:** старіші/менші/застарілі моделі значно гірше протистоять prompt injection і неправильному використанню інструментів. Для agent із увімкненими інструментами використовуйте найсильнішу доступну модель останнього покоління, стійку до інструкцій. -Червоні прапорці, які слід вважати недовіреними: +Ознаки, які слід вважати недовіреними: -- «Прочитай цей файл/URL і зроби точно те, що там написано.» -- «Ігноруй свій системний prompt або правила безпеки.» -- «Розкрий свої приховані інструкції або результати роботи інструментів.» -- «Встав повний вміст ~/.openclaw або свої журнали.» +- «Прочитай цей файл/URL і зроби точно те, що там сказано.» +- «Ігноруй свій system prompt або правила безпеки.» +- «Розкрий свої приховані інструкції або результати інструментів.» +- «Встав повний вміст `~/.openclaw` або своїх журналів.» -## Санітизація спеціальних токенів у зовнішньому вмісті +## Санітизація спеціальних токенів у зовнішньому контенті -OpenClaw видаляє поширені літерали спеціальних токенів шаблонів чатів self-hosted LLM із обгорнутого зовнішнього вмісту та метаданих, перш ніж вони потрапляють до моделі. Підтримуються сімейства маркерів Qwen/ChatML, Llama, Gemma, Mistral, Phi і токени ролей/ходів GPT-OSS. +OpenClaw видаляє поширені літерали спеціальних токенів шаблонів чату self-hosted LLM із обгорнутого зовнішнього контенту та метаданих до того, як вони потраплять до моделі. Підтримувані сімейства маркерів включають токени ролей/ходів Qwen/ChatML, Llama, Gemma, Mistral, Phi і GPT-OSS. Чому: -- Backends, сумісні з OpenAI, які працюють поверх self-hosted моделей, іноді зберігають спеціальні токени, що з’являються в тексті користувача, замість того щоб їх маскувати. Зловмисник, який може записувати у зовнішній вхідний вміст (отримана сторінка, тіло email, вивід інструмента читання файлів), інакше міг би вставити синтетичну межу ролі `assistant` або `system` і обійти запобіжники для обгорнутого вмісту. -- Санітизація відбувається на рівні обгортання зовнішнього вмісту, тож вона рівномірно застосовується до інструментів fetch/read і до вхідного вмісту каналів, а не залежить від окремого провайдера. -- Вихідні відповіді моделі вже мають окремий санітайзер, який прибирає з видимих користувачу відповідей витоки на кшталт ``, `` та подібних службових конструкцій. Санітайзер зовнішнього вмісту — це вхідний аналог. +- OpenAI-сумісні бекенди, які працюють поверх self-hosted моделей, іноді зберігають спеціальні токени, що з’являються в тексті користувача, замість їх маскування. Зловмисник, який може записати щось у вхідний зовнішній контент (отриману сторінку, тіло email, вміст файла з інструмента читання), інакше міг би вставити синтетичну межу ролі `assistant` або `system` і обійти запобіжники для обгорнутого контенту. +- Санітизація виконується на рівні обгортання зовнішнього контенту, тому вона однаково застосовується до інструментів fetch/read і вхідного контенту каналів, а не налаштовується окремо для кожного провайдера. +- Вихідні відповіді моделі вже проходять окремий санітайзер, який прибирає з видимих користувачеві відповідей витоки на кшталт ``, `` і подібного службового каркаса. Санітизація зовнішнього контенту є вхідним відповідником цього механізму. -Це не замінює інші заходи посилення захисту на цій сторінці — основну роботу все ще виконують `dmPolicy`, allowlists, погодження exec, sandboxing і `contextVisibility`. Це закриває один конкретний обхід на рівні токенізатора для self-hosted стеків, які передають текст користувача зі збереженими спеціальними токенами. +Це не замінює інші механізми посилення безпеки на цій сторінці — основну роботу й далі виконують `dmPolicy`, allowlist, схвалення exec, sandboxing і `contextVisibility`. Це закриває один конкретний обхід на рівні токенізатора для self-hosted стеків, які передають текст користувача зі збереженими спеціальними токенами. -## Прапорці обходу небезпечного зовнішнього вмісту +## Прапорці обходу для небезпечного зовнішнього контенту -OpenClaw містить явні прапорці обходу, які вимикають безпечне обгортання зовнішнього вмісту: +OpenClaw містить явні прапорці обходу, які вимикають безпечне обгортання зовнішнього контенту: - `hooks.mappings[].allowUnsafeExternalContent` - `hooks.gmail.allowUnsafeExternalContent` -- Поле payload у Cron `allowUnsafeExternalContent` +- Поле payload Cron `allowUnsafeExternalContent` Рекомендації: -- У production залишайте їх незаданими або зі значенням false. -- Вмикайте лише тимчасово для вузько обмеженого налагодження. -- Якщо їх увімкнено, ізолюйте цього агента (sandbox + мінімальні інструменти + окремий простір імен сесій). +- У production залишайте їх не встановленими/false. +- Увімкнюйте лише тимчасово для вузько обмеженого налагодження. +- Якщо ввімкнули, ізолюйте цей agent (sandbox + мінімум інструментів + окремий простір імен сеансів). -Примітка щодо ризиків hooks: +Примітка про ризики hooks: -- Payload hooks — це недовірений вміст, навіть якщо доставка йде із систем, які ви контролюєте (mail/docs/web-вміст може містити prompt injection). -- Слабші рівні моделей збільшують цей ризик. Для автоматизації на основі hooks надавайте перевагу сильним сучасним моделям і тримайте політику інструментів жорсткою (`tools.profile: "messaging"` або суворішою), а також використовуйте sandboxing, де це можливо. +- Payload hooks — це недовірений контент, навіть коли доставлення надходить із систем, які ви контролюєте (пошта/документи/вебконтент можуть містити prompt injection). +- Слабші рівні моделей підвищують цей ризик. Для автоматизації, керованої hooks, віддавайте перевагу сильним сучасним рівням моделей і тримайте політику інструментів суворою (`tools.profile: "messaging"` або жорсткіше), а також використовуйте sandboxing, де це можливо. ### Prompt injection не потребує публічних DM -Навіть якщо **лише ви** можете надсилати повідомлення боту, prompt injection усе одно може статися через -будь-який **недовірений вміст**, який бот читає (результати web search/fetch, сторінки браузера, -emails, docs, attachments, вставлені журнали/код). Іншими словами: відправник — не -єдина поверхня загроз; **сам вміст** також може нести зловмисні інструкції. +Навіть якщо **лише ви** можете писати боту, prompt injection усе одно може статися через +будь-який **недовірений контент**, який бот читає (результати web search/fetch, сторінки браузера, +email, документи, вкладення, вставлені журнали/код). Інакше кажучи: не лише відправник +є поверхнею загрози; **сам контент** також може містити ворожі інструкції. -Коли інструменти увімкнені, типовий ризик — це витік контексту або запуск +Коли інструменти ввімкнено, типовий ризик — це ексфільтрація контексту або ініціювання викликів інструментів. Зменшуйте радіус ураження так: -- Використовуйте **агента-читача** лише для читання або без інструментів, щоб узагальнювати недовірений вміст, - а потім передавайте підсумок вашому основному агенту. -- Тримайте `web_search` / `web_fetch` / `browser` вимкненими для агентів з інструментами, якщо вони не потрібні. -- Для URL-входів OpenResponses (`input_file` / `input_image`) встановлюйте жорсткі +- Використовуйте **agent-читач** лише для читання або без інструментів, щоб підсумовувати недовірений контент, + а потім передавайте підсумок своєму основному agent. +- Тримайте `web_search` / `web_fetch` / `browser` вимкненими для agent із доступом до інструментів, якщо вони не потрібні. +- Для URL-входів OpenResponses (`input_file` / `input_image`) задавайте жорсткі `gateway.http.endpoints.responses.files.urlAllowlist` і - `gateway.http.endpoints.responses.images.urlAllowlist`, а також тримайте `maxUrlParts` низьким. - Порожні allowlists вважаються незаданими; використовуйте `files.allowUrl: false` / `images.allowUrl: false`, + `gateway.http.endpoints.responses.images.urlAllowlist`, а також залишайте `maxUrlParts` малим. + Порожні allowlist трактуються як не встановлені; використовуйте `files.allowUrl: false` / `images.allowUrl: false`, якщо хочете повністю вимкнути отримання за URL. -- Для файлових входів OpenResponses декодований текст `input_file` усе одно додається як - **недовірений зовнішній вміст**. Не покладайтеся на те, що текст файла є довіреним лише тому, +- Для файлових входів OpenResponses декодований текст `input_file` усе одно вставляється як + **недовірений зовнішній контент**. Не вважайте текст файла довіреним лише тому, що Gateway декодував його локально. Вставлений блок усе одно містить явні маркери меж `<<>>` плюс метадані `Source: External`, хоча в цьому шляху відсутній довший банер `SECURITY NOTICE:`. - Те саме обгортання на основі маркерів застосовується, коли media-understanding витягує текст - із вкладених документів перед додаванням цього тексту до media prompt. -- Увімкнення sandboxing і суворих allowlists інструментів для будь-якого агента, який працює з недовіреним введенням. -- Не зберігайте секрети в prompt; передавайте їх через env/config на хості gateway. + із прикріплених документів перед додаванням цього тексту до prompt для медіа. +- Увімкніть sandboxing і суворі allowlist інструментів для будь-якого agent, який працює з недовіреним вводом. +- Не розміщуйте секрети в prompt; передавайте їх через env/config на хості gateway. -### Self-hosted LLM backends +### Self-hosted LLM бекенди -Self-hosted backends, сумісні з OpenAI, такі як vLLM, SGLang, TGI, LM Studio -або власні стеки токенізатора Hugging Face, можуть відрізнятися від хостованих провайдерів у тому, -як обробляються спеціальні токени шаблонів чату. Якщо backend токенізує літеральні рядки +OpenAI-сумісні self-hosted бекенди, такі як vLLM, SGLang, TGI, LM Studio +або власні стеки токенізаторів Hugging Face, можуть відрізнятися від hosted-провайдерів тим, +як обробляються спеціальні токени шаблонів чату. Якщо бекенд токенізує буквальні рядки на кшталт `<|im_start|>`, `<|start_header_id|>` або `` як -структурні токени шаблону чату всередині користувацького вмісту, недовірений текст може -спробувати підробити межі ролей на рівні токенізатора. +структурні токени шаблону чату всередині контенту користувача, недовірений текст може спробувати +підробити межі ролей на рівні токенізатора. -OpenClaw видаляє поширені літерали спеціальних токенів сімейств моделей з обгорнутого -зовнішнього вмісту перед передаванням його моделі. Тримайте обгортання -зовнішнього вмісту ввімкненим і, за можливості, віддавайте перевагу налаштуванням backend, -які розділяють або екранують спеціальні токени у вмісті, наданому користувачем. Хостовані провайдери, такі як OpenAI -та Anthropic, уже застосовують власну санітизацію на боці запиту. +OpenClaw видаляє поширені літерали спеціальних токенів для сімейств моделей із обгорнутого +зовнішнього контенту перед відправленням його до моделі. Залишайте обгортання зовнішнього контенту +увімкненим і, за можливості, віддавайте перевагу налаштуванням бекенда, які розділяють або екранують спеціальні +токени в наданому користувачем контенті. Hosted-провайдери, такі як OpenAI +і Anthropic, уже застосовують власну санітизацію на боці запиту. ### Сила моделі (примітка щодо безпеки) -Стійкість до prompt injection **не** є однаковою для всіх рівнів моделей. Менші/дешевші моделі загалом більш вразливі до зловживання інструментами та перехоплення інструкцій, особливо під час зловмисних prompt. +Стійкість до prompt injection **не є однаковою** в різних рівнях моделей. Менші/дешевші моделі загалом більш схильні до неправильного використання інструментів і перехоплення інструкцій, особливо за ворожих prompt. -Для агентів з увімкненими інструментами або агентів, які читають недовірений вміст, ризик prompt injection зі старішими/меншими моделями часто є надто високим. Не запускайте такі навантаження на слабких рівнях моделей. +Для agent із доступом до інструментів або agent, що читають недовірений контент, ризик prompt injection зі старішими/меншими моделями часто є надто високим. Не запускайте такі навантаження на слабких рівнях моделей. Рекомендації: -- **Використовуйте модель останнього покоління найкращого рівня** для будь-якого бота, який може запускати інструменти або працювати з файлами/мережами. -- **Не використовуйте старіші/слабші/менші рівні** для агентів з інструментами або недовірених вхідних скриньок; ризик prompt injection надто високий. -- Якщо вам усе ж доводиться використовувати меншу модель, **зменшуйте радіус ураження** (інструменти лише для читання, жорсткий sandboxing, мінімальний доступ до файлової системи, суворі allowlists). -- Під час запуску малих моделей **увімкніть sandboxing для всіх сесій** і **вимкніть `web_search`/`web_fetch`/`browser`**, якщо тільки вхідні дані не контролюються дуже жорстко. -- Для персональних асистентів лише для чату з довіреним введенням і без інструментів менші моделі зазвичай підходять. +- **Використовуйте найновішу модель найвищого рівня** для будь-якого бота, який може запускати інструменти або працювати з файлами/мережами. +- **Не використовуйте старіші/слабші/менші рівні** для agent із доступом до інструментів або недовірених вхідних скриньок; ризик prompt injection надто високий. +- Якщо вам усе ж доводиться використовувати меншу модель, **зменшуйте радіус ураження** (лише читання, сильне sandboxing, мінімальний доступ до файлової системи, суворі allowlist). +- Під час запуску малих моделей **увімкніть sandboxing для всіх сеансів** і **вимкніть `web_search`/`web_fetch`/`browser`**, якщо вхідні дані не контролюються дуже жорстко. +- Для chat-only персональних помічників із довіреним вводом і без інструментів менші моделі зазвичай підходять. ## Reasoning і докладний вивід у групах -`/reasoning`, `/verbose` і `/trace` можуть розкривати внутрішнє reasoning, вивід -інструментів або діагностику Plugin, які -не були призначені для публічного каналу. У групових сценаріях розглядайте їх лише як **debug-режим** -і тримайте вимкненими, якщо вони вам явно не потрібні. +`/reasoning`, `/verbose` і `/trace` можуть розкривати внутрішні міркування, вивід +інструментів або діагностику plugin, які +не призначалися для публічного каналу. У групових налаштуваннях сприймайте їх як +режими **лише для налагодження** і тримайте вимкненими, якщо вони вам явно не потрібні. Рекомендації: - Тримайте `/reasoning`, `/verbose` і `/trace` вимкненими в публічних кімнатах. -- Якщо ви їх вмикаєте, робіть це лише в довірених DM або суворо контрольованих кімнатах. -- Пам’ятайте: verbose і trace вивід можуть містити аргументи інструментів, URL, діагностику Plugin і дані, які бачила модель. +- Якщо ви їх увімкнули, робіть це лише в довірених DM або жорстко контрольованих кімнатах. +- Пам’ятайте: докладний вивід і трасування можуть містити аргументи інструментів, URL, діагностику plugin і дані, які бачила модель. ## Посилення конфігурації (приклади) -### 0) Права доступу до файлів +### Дозволи файлів Тримайте config + state приватними на хості gateway: - `~/.openclaw/openclaw.json`: `600` (лише читання/запис для користувача) -- `~/.openclaw`: `700` (лише користувач) +- `~/.openclaw`: `700` (лише для користувача) -`openclaw doctor` може попередити про це і запропонувати посилити ці права. +`openclaw doctor` може попередити та запропонувати посилити ці дозволи. -### 0.4) Відкритість мережі (bind + port + firewall) +### Мережевий доступ (bind, port, firewall) Gateway мультиплексує **WebSocket + HTTP** на одному порту: - За замовчуванням: `18789` - Config/flags/env: `gateway.port`, `--port`, `OPENCLAW_GATEWAY_PORT` -Ця поверхня HTTP включає Control UI і canvas host: +Ця HTTP-поверхня включає Control UI і хост canvas: -- Control UI (SPA assets) (базовий шлях за замовчуванням `/`) -- Canvas host: `/__openclaw__/canvas/` і `/__openclaw__/a2ui/` (довільний HTML/JS; ставтеся до цього як до недовіреного вмісту) +- Control UI (ресурси SPA) (базовий шлях за замовчуванням `/`) +- Хост canvas: `/__openclaw__/canvas/` і `/__openclaw__/a2ui/` (довільний HTML/JS; розглядайте як недовірений контент) -Якщо ви завантажуєте canvas-вміст у звичайному браузері, ставтеся до нього як до будь-якої іншої недовіреної вебсторінки: +Якщо ви завантажуєте вміст canvas у звичайному браузері, ставтеся до нього як до будь-якої іншої недовіреної вебсторінки: -- Не відкривайте canvas host для недовірених мереж/користувачів. -- Не змушуйте canvas-вміст використовувати те саме origin, що й привілейовані вебповерхні, якщо ви повністю не розумієте наслідків. +- Не відкривайте хост canvas для недовірених мереж/користувачів. +- Не робіть так, щоб вміст canvas мав той самий origin, що й привілейовані вебповерхні, якщо ви повністю не розумієте наслідків. -Режим bind визначає, де Gateway слухає з’єднання: +Режим bind визначає, де слухає Gateway: - `gateway.bind: "loopback"` (за замовчуванням): підключатися можуть лише локальні клієнти. -- Bind не на loopback (`"lan"`, `"tailnet"`, `"custom"`) розширює поверхню атаки. Використовуйте їх лише з auth Gateway (спільний token/password або правильно налаштований non-loopback trusted proxy) і реальним firewall. +- Bind поза loopback (`"lan"`, `"tailnet"`, `"custom"`) розширюють поверхню атаки. Використовуйте їх лише разом із auth gateway (спільний token/password або правильно налаштований trusted proxy поза loopback) і реальним firewall. Практичні правила: -- Надавайте перевагу Tailscale Serve замість bind до LAN (Serve залишає Gateway на loopback, а Tailscale керує доступом). -- Якщо вам усе ж потрібно bind до LAN, обмежте порт у firewall жорстким allowlist джерельних IP; не робіть широкий port-forward. -- Ніколи не відкривайте Gateway без автентифікації на `0.0.0.0`. +- Віддавайте перевагу Tailscale Serve замість bind на LAN (Serve тримає Gateway на loopback, а Tailscale обробляє доступ). +- Якщо bind на LAN неминучий, обмежте порт у firewall жорстким allowlist IP-адрес джерела; не робіть широке перенаправлення порту. +- Ніколи не відкривайте Gateway без auth на `0.0.0.0`. -### 0.4.1) Публікація портів Docker + UFW (`DOCKER-USER`) +### Публікація портів Docker з UFW -Якщо ви запускаєте OpenClaw у Docker на VPS, пам’ятайте, що опубліковані порти контейнера -(`-p HOST:CONTAINER` або Compose `ports:`) маршрутизуються через ланцюги forwarding Docker, +Якщо ви запускаєте OpenClaw з Docker на VPS, пам’ятайте, що опубліковані порти контейнера +(`-p HOST:CONTAINER` або `ports:` у Compose) маршрутизуються через ланцюги forwarding Docker, а не лише через правила `INPUT` хоста. -Щоб трафік Docker відповідав політиці вашого firewall, примусово задавайте правила в -`DOCKER-USER` (цей ланцюг перевіряється до власних правил accept Docker). +Щоб трафік Docker відповідав вашій політиці firewall, застосовуйте правила в +`DOCKER-USER` (цей ланцюг обробляється до власних правил allow Docker). У багатьох сучасних дистрибутивах `iptables`/`ip6tables` використовують frontend `iptables-nft` і все одно застосовують ці правила до backend nftables. @@ -850,11 +745,11 @@ COMMIT ``` Для IPv6 існують окремі таблиці. Додайте відповідну політику в `/etc/ufw/after6.rules`, якщо -IPv6 у Docker увімкнено. +Docker IPv6 увімкнено. -Уникайте жорстко заданих назв інтерфейсів на кшталт `eth0` у фрагментах документації. Назви інтерфейсів -відрізняються між образами VPS (`ens3`, `enp*` тощо), і невідповідність може випадково -пропустити ваше правило deny. +Уникайте жорстко закодованих назв інтерфейсів на кшталт `eth0` у фрагментах документації. Назви інтерфейсів +різняться між образами VPS (`ens3`, `enp*` тощо), і невідповідність може випадково +призвести до пропуску вашого правила deny. Швидка перевірка після перезавантаження: @@ -865,22 +760,22 @@ ip6tables -S DOCKER-USER nmap -sT -p 1-65535 --open ``` -Очікуваними зовнішніми портами мають бути лише ті, які ви навмисно відкрили (для більшості -налаштувань: SSH + порти вашого reverse proxy). +Очікувані зовнішні порти мають бути лише тими, які ви свідомо відкрили (для більшості +конфігурацій: SSH + порти вашого зворотного проксі). -### 0.4.2) Виявлення через mDNS/Bonjour (розкриття інформації) +### Виявлення через mDNS/Bonjour -Gateway транслює свою присутність через mDNS (`_openclaw-gw._tcp` на порту 5353) для виявлення локальними пристроями. У повному режимі це включає TXT-записи, які можуть розкривати операційні деталі: +Gateway транслює свою присутність через mDNS (`_openclaw-gw._tcp` на порту 5353) для виявлення локальними пристроями. У режимі full це включає TXT-записи, які можуть розкривати операційні деталі: -- `cliPath`: повний шлях у файловій системі до двійкового файла CLI (розкриває ім’я користувача та місце встановлення) -- `sshPort`: рекламує доступність SSH на хості +- `cliPath`: повний шлях файлової системи до бінарника CLI (розкриває ім’я користувача та місце встановлення) +- `sshPort`: повідомляє про доступність SSH на хості - `displayName`, `lanHost`: інформація про ім’я хоста -**Міркування щодо операційної безпеки:** трансляція деталей інфраструктури полегшує розвідку для будь-кого в локальній мережі. Навіть «нешкідлива» інформація, як-от шляхи у файловій системі та доступність SSH, допомагає зловмисникам змоделювати ваше середовище. +**Міркування операційної безпеки:** трансляція інфраструктурних деталей полегшує розвідку для будь-кого в локальній мережі. Навіть «нешкідлива» інформація на кшталт шляхів файлової системи та доступності SSH допомагає зловмисникам скласти карту вашого середовища. **Рекомендації:** -1. **Мінімальний режим** (за замовчуванням, рекомендовано для відкритих Gateway): не включає чутливі поля до трансляцій mDNS: +1. **Режим minimal** (за замовчуванням, рекомендовано для відкритих Gateway): не включає чутливі поля до трансляцій mDNS: ```json5 { @@ -890,7 +785,7 @@ Gateway транслює свою присутність через mDNS (`_open } ``` -2. **Повністю вимкніть**, якщо вам не потрібне локальне виявлення пристроїв: +2. **Повністю вимкніть**, якщо вам не потрібне виявлення локальними пристроями: ```json5 { @@ -900,7 +795,7 @@ Gateway транслює свою присутність через mDNS (`_open } ``` -3. **Повний режим** (явне ввімкнення): додає `cliPath` + `sshPort` до TXT-записів: +3. **Режим full** (явне ввімкнення): включає `cliPath` + `sshPort` у TXT-записи: ```json5 { @@ -912,17 +807,18 @@ Gateway транслює свою присутність через mDNS (`_open 4. **Змінна середовища** (альтернатива): встановіть `OPENCLAW_DISABLE_BONJOUR=1`, щоб вимкнути mDNS без змін у config. -У мінімальному режимі Gateway усе одно транслює достатньо даних для виявлення пристроїв (`role`, `gatewayPort`, `transport`), але не включає `cliPath` і `sshPort`. Apps, яким потрібна інформація про шлях CLI, можуть отримати її через автентифіковане WebSocket-з’єднання. +У режимі minimal Gateway усе одно транслює достатньо даних для виявлення пристрою (`role`, `gatewayPort`, `transport`), але не включає `cliPath` і `sshPort`. Apps, яким потрібна інформація про шлях до CLI, можуть отримати її через автентифіковане з’єднання WebSocket. -### 0.5) Захистіть WebSocket Gateway (локальна auth) +### Обмежте доступ до WebSocket Gateway (локальний auth) -Auth Gateway **обов’язкова за замовчуванням**. Якщо не налаштовано -жодного дійсного шляху auth Gateway, Gateway відмовляє у WebSocket-з’єднаннях (fail‑closed). +Auth Gateway **обов’язковий за замовчуванням**. Якщо не налаштовано +жоден дійсний шлях auth gateway, Gateway відхиляє з’єднання WebSocket +(безпечна відмова). -Onboarding за замовчуванням генерує токен (навіть для loopback), тож -локальні клієнти повинні пройти автентифікацію. +Onboarding за замовчуванням генерує token (навіть для loopback), тому +локальні клієнти мають проходити автентифікацію. -Встановіть токен, щоб **усі** WS-клієнти мусили автентифікуватися: +Установіть token, щоб **усі** клієнти WS мали проходити автентифікацію: ```json5 { @@ -932,152 +828,152 @@ Onboarding за замовчуванням генерує токен (навіт } ``` -Doctor може згенерувати його за вас: `openclaw doctor --generate-gateway-token`. +Doctor може згенерувати його для вас: `openclaw doctor --generate-gateway-token`. Примітка: `gateway.remote.token` / `.password` — це джерела облікових даних клієнта. Вони самі по собі **не** захищають локальний доступ до WS. -Локальні шляхи виклику можуть використовувати `gateway.remote.*` як fallback лише тоді, коли `gateway.auth.*` -не задано. +Локальні шляхи виклику можуть використовувати `gateway.remote.*` як резервний варіант лише тоді, коли `gateway.auth.*` +не встановлено. Якщо `gateway.auth.token` / `gateway.auth.password` явно налаштовано через -SecretRef і його не вдалося розв’язати, розв’язання завершується fail closed (без маскування через fallback з remote). -Необов’язково: зафіксуйте віддалений TLS через `gateway.remote.tlsFingerprint` під час використання `wss://`. -Нешифрований `ws://` за замовчуванням дозволений лише для loopback. Для довірених приватних мережевих -шляхів встановіть `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` у процесі клієнта як аварійний виняток. +SecretRef і не вдається розв’язати, розв’язання завершується безпечною відмовою (жоден резервний remote-механізм не маскує це). +Необов’язково: закріпіть віддалений TLS за допомогою `gateway.remote.tlsFingerprint`, якщо використовуєте `wss://`. +Нешифрований `ws://` за замовчуванням дозволено лише для loopback. Для довірених шляхів у приватній мережі +встановіть `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` у процесі клієнта як аварійний варіант. -Локальний pairing пристроїв: +Локальне pairing пристроїв: -- Pairing пристроїв автоматично схвалюється для прямих локальних loopback-підключень, щоб +- Pairing пристрою автоматично схвалюється для прямих локальних loopback-з’єднань, щоб зберегти зручність для клієнтів на тому самому хості. - OpenClaw також має вузький шлях самопідключення backend/container-local для - довірених потоків helper зі спільним секретом. -- Підключення через Tailnet і LAN, включно з bind через tailnet на тому самому хості, розглядаються як - віддалені для pairing і все одно потребують погодження. -- Наявність доказів forwarded-header у loopback-запиті скасовує статус - локальності loopback. Автосхвалення для metadata-upgrade має вузьку сферу дії. Див. - [Gateway pairing](/uk/gateway/pairing) для обох правил. + довірених потоків допоміжних інструментів зі спільним секретом. +- Підключення через tailnet і LAN, включно з bind через tailnet на тому самому хості, вважаються + віддаленими для pairing і, як і раніше, потребують схвалення. +- Ознаки forwarding-заголовків у loopback-запиті виключають loopback-локальність. + Автосхвалення для metadata-upgrade має вузьку область дії. Докладніше див. + у [Pairing Gateway](/uk/gateway/pairing) для обох правил. Режими auth: - `gateway.auth.mode: "token"`: спільний bearer token (рекомендовано для більшості сценаріїв). - `gateway.auth.mode: "password"`: auth за паролем (краще задавати через env: `OPENCLAW_GATEWAY_PASSWORD`). -- `gateway.auth.mode: "trusted-proxy"`: довіряє reverse proxy, який знає ідентичність, для автентифікації користувачів і передавання ідентичності через заголовки (див. [Trusted Proxy Auth](/uk/gateway/trusted-proxy-auth)). +- `gateway.auth.mode: "trusted-proxy"`: довіряти reverse proxy з перевіркою ідентичності, який автентифікує користувачів і передає ідентичність через заголовки (див. [Trusted Proxy Auth](/uk/gateway/trusted-proxy-auth)). Контрольний список ротації (token/password): 1. Згенеруйте/встановіть новий секрет (`gateway.auth.token` або `OPENCLAW_GATEWAY_PASSWORD`). -2. Перезапустіть Gateway (або перезапустіть macOS app, якщо він керує Gateway). -3. Оновіть усі віддалені клієнти (`gateway.remote.token` / `.password` на машинах, що звертаються до Gateway). -4. Перевірте, що старі облікові дані більше не дозволяють підключення. +2. Перезапустіть Gateway (або перезапустіть macOS app, якщо вона керує Gateway). +3. Оновіть усі віддалені клієнти (`gateway.remote.token` / `.password` на машинах, які звертаються до Gateway). +4. Переконайтеся, що старі облікові дані більше не працюють. -### 0.6) Заголовки ідентичності Tailscale Serve +### Заголовки ідентичності Tailscale Serve -Коли `gateway.auth.allowTailscale` має значення `true` (за замовчуванням для Serve), OpenClaw +Коли `gateway.auth.allowTailscale` має значення `true` (типово для Serve), OpenClaw приймає заголовки ідентичності Tailscale Serve (`tailscale-user-login`) для автентифікації -Control UI/WebSocket. OpenClaw перевіряє ідентичність, розв’язуючи адресу -`x-forwarded-for` через локальний демон Tailscale (`tailscale whois`) і звіряючи її із заголовком. Це спрацьовує лише для запитів, що потрапляють на loopback +Control UI/WebSocket. OpenClaw перевіряє ідентичність, зіставляючи адресу +`x-forwarded-for` через локальний демон Tailscale (`tailscale whois`) і +порівнюючи її із заголовком. Це спрацьовує лише для запитів, які приходять на loopback і містять `x-forwarded-for`, `x-forwarded-proto` та `x-forwarded-host`, як -вставляє Tailscale. -Для цього асинхронного шляху перевірки ідентичності невдалі спроби для того самого `{scope, ip}` -серіалізуються до того, як limiter зафіксує збій. Тому паралельні хибні повторні спроби +додає Tailscale. +Для цього асинхронного шляху перевірки ідентичності невдалі спроби для тієї самої пари `{scope, ip}` +серіалізуються до того, як обмежувач зафіксує збій. Тому одночасні невдалі повтори від одного клієнта Serve можуть одразу заблокувати другу спробу, -а не пройти наввипередки як дві звичайні невідповідності. -HTTP API endpoints (наприклад `/v1/*`, `/tools/invoke` і `/api/channels/*`) -**не** використовують auth через заголовки ідентичності Tailscale. Вони й надалі підпорядковуються -налаштованому режиму HTTP auth gateway. +а не пройти паралельно як дві звичайні невідповідності. +Кінцеві точки HTTP API (наприклад `/v1/*`, `/tools/invoke` і `/api/channels/*`) +**не** використовують auth через заголовки ідентичності Tailscale. Вони, як і раніше, працюють за +налаштованим HTTP auth режимом gateway. -Важлива примітка щодо меж довіри: +Важлива примітка щодо меж: -- Gateway HTTP bearer auth фактично дає або повний операторський доступ, або нічого. -- Ставтеся до облікових даних, які можуть викликати `/v1/chat/completions`, `/v1/responses` або `/api/channels/*`, як до повноцінних операторських секретів повного доступу для цього gateway. -- На HTTP-поверхні, сумісній з OpenAI, bearer auth зі спільним секретом відновлює повні стандартні операторські scope (`operator.admin`, `operator.approvals`, `operator.pairing`, `operator.read`, `operator.talk.secrets`, `operator.write`) і семантику owner для ходів агента; вужчі значення `x-openclaw-scopes` не звужують цей шлях зі спільним секретом. -- Семантика scope для окремого HTTP-запиту застосовується лише тоді, коли запит надходить із режиму, що несе ідентичність, наприклад trusted proxy auth або `gateway.auth.mode="none"` на приватному ingress. -- У цих режимах, що несуть ідентичність, якщо `x-openclaw-scopes` опущено, використовується звичайний стандартний набір операторських scope; надсилайте цей заголовок явно, коли вам потрібен вужчий набір scope. -- `/tools/invoke` підпорядковується тому самому правилу спільного секрету: bearer auth через token/password там також розглядається як повний операторський доступ, тоді як режими, що несуть ідентичність, усе ще поважають оголошені scope. -- Не діліться цими обліковими даними з недовіреними викликачами; надавайте перевагу окремим Gateway для кожної межі довіри. +- HTTP bearer auth Gateway фактично дає доступ оператора за принципом «усе або нічого». +- Сприймайте облікові дані, які можуть викликати `/v1/chat/completions`, `/v1/responses` або `/api/channels/*`, як повні секрети операторського доступу до цього gateway. +- На OpenAI-сумісній HTTP-поверхні bearer auth зі спільним секретом відновлює повний стандартний набір операторських scope (`operator.admin`, `operator.approvals`, `operator.pairing`, `operator.read`, `operator.talk.secrets`, `operator.write`) і semantics власника для ходів agent; вужчі значення `x-openclaw-scopes` не звужують цей шлях зі спільним секретом. +- Семантика scope для кожного HTTP-запиту застосовується лише тоді, коли запит надходить із режиму, що несе ідентичність, такого як auth trusted proxy або `gateway.auth.mode="none"` на приватному ingress. +- У цих режимах із ідентичністю пропуск `x-openclaw-scopes` повертає стандартний набір scope оператора; надсилайте цей заголовок явно, якщо хочете вужчий набір scope. +- `/tools/invoke` дотримується того самого правила спільного секрету: bearer auth за token/password там теж вважається повним операторським доступом, тоді як режими з ідентичністю все ще враховують оголошені scope. +- Не діліться цими обліковими даними з недовіреними викликачами; віддавайте перевагу окремим Gateway для кожної межі довіри. -**Припущення довіри:** auth Serve без токена припускає, що хост gateway є довіреним. -Не розглядайте це як захист від зловмисних процесів на тому самому хості. Якщо на хості gateway +**Припущення довіри:** auth Serve без token виходить із того, що хост gateway є довіреним. +Не вважайте це захистом від ворожих процесів на тому самому хості. Якщо на хості gateway може виконуватися недовірений локальний код, вимкніть `gateway.auth.allowTailscale` і вимагайте явну auth зі спільним секретом через `gateway.auth.mode: "token"` або `"password"`. -**Правило безпеки:** не пересилайте ці заголовки через власний reverse proxy. Якщо -ви завершуєте TLS або проксіюєте перед gateway, вимкніть +**Правило безпеки:** не пересилайте ці заголовки зі свого reverse proxy. Якщо +ви завершуєте TLS або використовуєте proxy перед gateway, вимкніть `gateway.auth.allowTailscale` і використовуйте auth зі спільним секретом (`gateway.auth.mode: -"token"` або `"password"`) або [Trusted Proxy Auth](/uk/gateway/trusted-proxy-auth) -замість цього. +"token"` або `"password"`) або [Trusted Proxy Auth](/uk/gateway/trusted-proxy-auth). Trusted proxies: -- Якщо ви завершуєте TLS перед Gateway, встановіть `gateway.trustedProxies` на IP вашого proxy. -- OpenClaw довірятиме `x-forwarded-for` (або `x-real-ip`) від цих IP для визначення IP клієнта під час локальних перевірок pairing і HTTP auth/local. +- Якщо ви завершуєте TLS перед Gateway, установіть `gateway.trustedProxies` на IP-адреси ваших proxy. +- OpenClaw довірятиме `x-forwarded-for` (або `x-real-ip`) від цих IP для визначення IP-адреси клієнта під час локальних перевірок pairing і перевірок HTTP auth/local. - Переконайтеся, що ваш proxy **перезаписує** `x-forwarded-for` і блокує прямий доступ до порту Gateway. -Див. [Tailscale](/uk/gateway/tailscale) і [Web overview](/uk/web). +Див. [Tailscale](/uk/gateway/tailscale) і [Огляд вебінтерфейсу](/uk/web). -### 0.6.1) Керування браузером через host Node (рекомендовано) +### Керування браузером через host node (рекомендовано) -Якщо ваш Gateway віддалений, але браузер працює на іншій машині, запускайте **host Node** -на машині з браузером і дозвольте Gateway проксіювати дії браузера (див. [Browser tool](/uk/tools/browser)). -Ставтеся до pairing Node як до адміністративного доступу. +Якщо ваш Gateway віддалений, а браузер працює на іншій машині, запустіть **host node** +на машині з браузером і дозвольте Gateway проксувати дії браузера (див. [Інструмент browser](/uk/tools/browser)). +Сприймайте pairing node як адміністративний доступ. Рекомендований шаблон: -- Тримайте Gateway і host Node в одному tailnet (Tailscale). -- Pairing Node виконуйте навмисно; вимикайте проксі-маршрутизацію браузера, якщо вона вам не потрібна. +- Тримайте Gateway і host node в одному tailnet (Tailscale). +- Pairing node робіть навмисно; вимикайте проксі-маршрутизацію браузера, якщо вона вам не потрібна. Уникайте: - Відкриття relay/control-портів у LAN або публічному інтернеті. -- Tailscale Funnel для endpoints керування браузером (публічне відкриття). +- Tailscale Funnel для кінцевих точок керування браузером (публічний доступ). -### 0.7) Секрети на диску (чутливі дані) +### Секрети на диску Вважайте, що все в `~/.openclaw/` (або `$OPENCLAW_STATE_DIR/`) може містити секрети або приватні дані: -- `openclaw.json`: config може містити токени (gateway, remote gateway), налаштування провайдерів і allowlists. -- `credentials/**`: облікові дані каналів (наприклад, облікові дані WhatsApp), allowlists pairing, імпорт застарілого OAuth. -- `agents//agent/auth-profiles.json`: API-ключі, профілі токенів, OAuth-токени та необов’язкові `keyRef`/`tokenRef`. -- `secrets.json` (необов’язково): payload секретів у файлі, який використовується провайдерами SecretRef типу `file` (`secrets.providers`). +- `openclaw.json`: config може містити токени (gateway, remote gateway), налаштування провайдерів та allowlist. +- `credentials/**`: облікові дані каналів (наприклад, облікові дані WhatsApp), pairing allowlist, застарілі імпорти OAuth. +- `agents//agent/auth-profiles.json`: API-ключі, профілі токенів, токени OAuth та необов’язкові `keyRef`/`tokenRef`. +- `secrets.json` (необов’язково): payload секретів у файлі, який використовується провайдерами `file` SecretRef (`secrets.providers`). - `agents//agent/auth.json`: застарілий файл сумісності. Статичні записи `api_key` очищуються при виявленні. -- `agents//sessions/**`: транскрипти сесій (`*.jsonl`) + метадані маршрутизації (`sessions.json`), які можуть містити приватні повідомлення та вивід інструментів. -- bundled пакети Plugin: установлені plugins (разом із їхнім `node_modules/`). -- `sandboxes/**`: робочі простори sandbox інструментів; там можуть накопичуватися копії файлів, які ви читали/записували всередині sandbox. +- `agents//sessions/**`: транскрипти сеансів (`*.jsonl`) + метадані маршрутизації (`sessions.json`), які можуть містити приватні повідомлення та вивід інструментів. +- пакети вбудованих plugin: установлені plugins (разом із їхнім `node_modules/`). +- `sandboxes/**`: робочі простори sandbox інструментів; там можуть накопичуватися копії файлів, які ви читаєте/записуєте всередині sandbox. Поради щодо посилення захисту: -- Тримайте права доступу жорсткими (`700` для каталогів, `600` для файлів). +- Тримайте дозволи суворими (`700` для каталогів, `600` для файлів). - Використовуйте повне шифрування диска на хості gateway. - Якщо хост спільний, надавайте перевагу окремому обліковому запису користувача ОС для Gateway. -### 0.8) Файли `.env` робочого простору +### Файли `.env` у робочому просторі -OpenClaw завантажує локальні для робочого простору файли `.env` для агентів та інструментів, але ніколи не дозволяє цим файлам непомітно перевизначати керування runtime gateway. +OpenClaw завантажує локальні для робочого простору файли `.env` для agent і інструментів, але ніколи не дозволяє таким файлам непомітно перевизначати засоби керування runtime gateway. -- Будь-який ключ, що починається з `OPENCLAW_*`, блокується в недовірених файлах `.env` робочого простору. -- Налаштування endpoint каналів для Matrix, Mattermost, IRC і Synology Chat також блокуються для перевизначення через `.env` робочого простору, тож клоновані робочі простори не можуть перенаправляти трафік bundled connector через локальний endpoint config. Ключі env endpoint, такі як `MATRIX_HOMESERVER`, `MATTERMOST_URL`, `IRC_HOST`, `SYNOLOGY_CHAT_INCOMING_URL`, мають надходити з process environment gateway або `env.shellEnv`, а не з `.env`, завантаженого з робочого простору. -- Блокування працює в режимі fail closed: нова змінна керування runtime, додана в майбутньому випуску, не може бути успадкована з `.env`, доданого до репозиторію або наданого зловмисником; ключ ігнорується, а gateway зберігає власне значення. -- Довірені змінні process/OS environment (власна оболонка gateway, launchd/systemd unit, app bundle) усе ще застосовуються — це обмеження стосується лише завантаження файлів `.env`. +- Будь-який ключ, що починається з `OPENCLAW_*`, блокується у недовірених `.env` файлах робочого простору. +- Налаштування кінцевих точок каналів для Matrix, Mattermost, IRC і Synology Chat також блокуються від перевизначення через `.env` робочого простору, щоб клоновані робочі простори не могли перенаправляти трафік вбудованих конекторів через локальну конфігурацію endpoint. Ключі env для endpoint (такі як `MATRIX_HOMESERVER`, `MATTERMOST_URL`, `IRC_HOST`, `SYNOLOGY_CHAT_INCOMING_URL`) мають надходити з середовища процесу gateway або `env.shellEnv`, а не з `.env`, завантаженого з робочого простору. +- Блокування працює за принципом безпечної відмови: нову змінну керування runtime, додану в майбутньому релізі, не можна успадкувати з закоміченого чи підкладеного зловмисником `.env`; ключ ігнорується, а gateway зберігає власне значення. +- Довірені змінні середовища процесу/ОС (власна shell gateway, unit launchd/systemd, bundle app) усе ще застосовуються — це обмеження стосується лише завантаження файлів `.env`. -Чому: файли `.env` робочого простору часто лежать поруч із кодом агента, випадково потрапляють у commit або записуються інструментами. Блокування всього префікса `OPENCLAW_*` означає, що додавання нового прапорця `OPENCLAW_*` у майбутньому ніколи не призведе до тихого успадкування зі стану робочого простору. +Чому: файли `.env` робочого простору часто лежать поруч із кодом agent, випадково потрапляють у commit або записуються інструментами. Блокування всього префікса `OPENCLAW_*` означає, що додавання нового прапорця `OPENCLAW_*` у майбутньому ніколи не призведе до регресії через мовчазне успадкування зі стану робочого простору. -### 0.9) Журнали + транскрипти (редагування + retention) +### Журнали та транскрипти (редагування та зберігання) -Журнали та транскрипти можуть розкривати чутливу інформацію, навіть якщо контроль доступу налаштовано правильно: +Журнали та транскрипти можуть витікати чутливу інформацію, навіть якщо контроль доступу налаштовано правильно: - Журнали Gateway можуть містити підсумки інструментів, помилки та URL. -- Транскрипти сесій можуть містити вставлені секрети, вміст файлів, вивід команд і посилання. +- Транскрипти сеансів можуть містити вставлені секрети, вміст файлів, вивід команд і посилання. Рекомендації: -- Тримайте редагування підсумків інструментів увімкненим (`logging.redactSensitive: "tools"`; значення за замовчуванням). -- Додавайте власні шаблони для вашого середовища через `logging.redactPatterns` (токени, імена хостів, внутрішні URL). -- Коли ділитеся діагностикою, надавайте перевагу `openclaw status --all` (зручно для вставлення, секрети відредаговано) замість сирих журналів. -- Видаляйте старі транскрипти сесій і файли журналів, якщо вам не потрібне тривале retention. +- Тримайте редагування підсумків інструментів увімкненим (`logging.redactSensitive: "tools"`; типове значення). +- Додавайте власні шаблони для свого середовища через `logging.redactPatterns` (токени, імена хостів, внутрішні URL). +- Для обміну діагностикою віддавайте перевагу `openclaw status --all` (зручно вставляти, секрети приховано) замість сирих журналів. +- Видаляйте старі транскрипти сеансів і файли журналів, якщо вам не потрібне довге зберігання. -Деталі: [Logging](/uk/gateway/logging) +Докладніше: [Журналювання](/uk/gateway/logging) -### 1) DM: pairing за замовчуванням +### DM: pairing за замовчуванням ```json5 { @@ -1085,7 +981,7 @@ OpenClaw завантажує локальні для робочого прос } ``` -### 2) Групи: вимагати згадку всюди +### Групи: вимагати згадку всюди ```json { @@ -1107,31 +1003,31 @@ OpenClaw завантажує локальні для робочого прос } ``` -У групових чатах відповідайте лише при явній згадці. +У групових чатах відповідайте лише за явної згадки. -### 3) Окремі номери (WhatsApp, Signal, Telegram) +### Окремі номери (WhatsApp, Signal, Telegram) -Для каналів на основі номерів телефону розгляньте запуск вашого AI на окремому номері від особистого: +Для каналів на основі телефонних номерів подумайте про запуск AI на окремому телефонному номері, а не на вашому особистому: - Особистий номер: ваші розмови залишаються приватними -- Номер бота: AI працює тут, із відповідними межами +- Номер бота: AI обробляє ці взаємодії з відповідними межами -### 4) Режим лише для читання (через sandbox + інструменти) +### Режим лише для читання (через sandbox і tools) Ви можете побудувати профіль лише для читання, поєднавши: -- `agents.defaults.sandbox.workspaceAccess: "ro"` (або `"none"` без доступу до робочого простору) -- allow/deny-списки інструментів, які блокують `write`, `edit`, `apply_patch`, `exec`, `process` тощо. +- `agents.defaults.sandbox.workspaceAccess: "ro"` (або `"none"` для повної заборони доступу до робочого простору) +- списки allow/deny інструментів, які блокують `write`, `edit`, `apply_patch`, `exec`, `process` тощо. -Додаткові варіанти посилення захисту: +Додаткові параметри посилення захисту: -- `tools.exec.applyPatch.workspaceOnly: true` (за замовчуванням): гарантує, що `apply_patch` не може записувати/видаляти файли за межами каталогу робочого простору, навіть коли sandboxing вимкнено. Встановлюйте `false` лише якщо ви навмисно хочете, щоб `apply_patch` торкався файлів поза робочим простором. -- `tools.fs.workspaceOnly: true` (необов’язково): обмежує шляхи `read`/`write`/`edit`/`apply_patch` і шляхи автозавантаження зображень native prompt каталогом робочого простору (корисно, якщо ви сьогодні дозволяєте absolute paths і хочете мати єдиний guardrail). -- Тримайте корені файлової системи вузькими: уникайте широких коренів, таких як ваш домашній каталог, для робочих просторів агента/робочих просторів sandbox. Широкі корені можуть відкрити інструментам файлової системи доступ до чутливих локальних файлів (наприклад state/config у `~/.openclaw`). +- `tools.exec.applyPatch.workspaceOnly: true` (за замовчуванням): гарантує, що `apply_patch` не може записувати/видаляти дані поза каталогом робочого простору, навіть якщо sandboxing вимкнено. Встановлюйте `false` лише якщо ви навмисно хочете, щоб `apply_patch` торкався файлів поза робочим простором. +- `tools.fs.workspaceOnly: true` (необов’язково): обмежує шляхи `read`/`write`/`edit`/`apply_patch` і шляхи автоматичного завантаження зображень із native prompt лише каталогом робочого простору (корисно, якщо ви зараз дозволяєте абсолютні шляхи й хочете один загальний запобіжник). +- Тримайте корені файлової системи вузькими: уникайте широких коренів, наприклад домашнього каталогу, для робочих просторів agent/sandbox. Широкі корені можуть відкрити доступ інструментам файлової системи до чутливих локальних файлів (наприклад state/config у `~/.openclaw`). -### 5) Безпечна базова конфігурація (копіювати/вставити) +### Безпечна базова конфігурація (скопіювати/вставити) -Одна «безпечна за замовчуванням» config, яка тримає Gateway приватним, вимагає pairing для DM і уникає ботів, що завжди активні в групах: +Одна «безпечна типова» config, яка тримає Gateway приватним, вимагає pairing у DM і уникає завжди активних ботів у групах: ```json5 { @@ -1150,9 +1046,9 @@ OpenClaw завантажує локальні для робочого прос } ``` -Якщо ви хочете також «безпечніше за замовчуванням» виконання інструментів, додайте sandbox + заборону небезпечних інструментів для будь-якого агента, що не є owner (приклад нижче в розділі «Профілі доступу для окремих агентів»). +Якщо ви хочете також «безпечніше за замовчуванням» виконання інструментів, додайте sandbox + заборону небезпечних інструментів для будь-якого agent, що не є власником (приклад нижче в розділі «Профілі доступу для окремих agent»). -Вбудована базова політика для ходів агента, керованих чатом: відправники, які не є owner, не можуть використовувати інструменти `cron` або `gateway`. +Вбудований базовий стандарт для agent turns, керованих через чат: відправники, які не є власником, не можуть використовувати інструменти `cron` або `gateway`. ## Sandboxing (рекомендовано) @@ -1160,59 +1056,59 @@ OpenClaw завантажує локальні для робочого прос Два взаємодоповнювальні підходи: -- **Запустити весь Gateway у Docker** (межа контейнера): [Docker](/uk/install/docker) -- **Sandbox інструментів** (`agents.defaults.sandbox`, host gateway + sandbox-ізольовані інструменти; Docker — backend за замовчуванням): [Sandboxing](/uk/gateway/sandboxing) +- **Запускайте весь Gateway у Docker** (межа container): [Docker](/uk/install/docker) +- **Sandbox для інструментів** (`agents.defaults.sandbox`, host gateway + інструменти, ізольовані sandbox; Docker — типовий backend): [Sandboxing](/uk/gateway/sandboxing) -Примітка: щоб запобігти доступу між агентами, залишайте `agents.defaults.sandbox.scope` зі значенням `"agent"` (за замовчуванням) -або `"session"` для суворішої ізоляції кожної сесії. `scope: "shared"` використовує -один контейнер/робочий простір. +Примітка: щоб запобігти міжагентному доступу, залишайте `agents.defaults.sandbox.scope` зі значенням `"agent"` (за замовчуванням) +або `"session"` для суворішої ізоляції на рівні сеансу. `scope: "shared"` використовує +один container/workspace. -Також враховуйте доступ агента до робочого простору всередині sandbox: +Також враховуйте доступ agent до робочого простору всередині sandbox: -- `agents.defaults.sandbox.workspaceAccess: "none"` (за замовчуванням) не дозволяє доступу до робочого простору агента; інструменти працюють із робочим простором sandbox у `~/.openclaw/sandboxes` -- `agents.defaults.sandbox.workspaceAccess: "ro"` монтує робочий простір агента лише для читання в `/agent` (вимикає `write`/`edit`/`apply_patch`) -- `agents.defaults.sandbox.workspaceAccess: "rw"` монтує робочий простір агента для читання/запису в `/workspace` -- Додаткові `sandbox.docker.binds` перевіряються за нормалізованими та канонізованими шляхами джерел. Трюки з батьківськими symlink і канонічні псевдоніми домашнього каталогу все одно завершуються fail closed, якщо вони розв’язуються до заблокованих коренів, таких як `/etc`, `/var/run` або каталоги облікових даних у домашньому каталозі ОС. +- `agents.defaults.sandbox.workspaceAccess: "none"` (за замовчуванням) не допускає agent до робочого простору; інструменти працюють із робочим простором sandbox у `~/.openclaw/sandboxes` +- `agents.defaults.sandbox.workspaceAccess: "ro"` монтує робочий простір agent лише для читання в `/agent` (вимикає `write`/`edit`/`apply_patch`) +- `agents.defaults.sandbox.workspaceAccess: "rw"` монтує робочий простір agent для читання/запису в `/workspace` +- Додаткові `sandbox.docker.binds` перевіряються за нормалізованими й канонізованими шляхами джерела. Хитрощі з symlink у батьківських каталогах і канонічними псевдонімами домашнього каталогу все одно безпечно відхиляються, якщо вони зрештою вказують на заблоковані корені, такі як `/etc`, `/var/run` або каталоги облікових даних у домашньому каталозі ОС. -Важливо: `tools.elevated` — це глобальний аварійний вихід із базової політики, який виконує exec поза sandbox. Ефективний host за замовчуванням — `gateway`, або `node`, коли ціль exec налаштовано на `node`. Тримайте `tools.elevated.allowFrom` жорстко обмеженим і не вмикайте його для сторонніх. Ви можете додатково обмежити elevated для окремого агента через `agents.list[].tools.elevated`. Див. [Elevated Mode](/uk/tools/elevated). +Важливо: `tools.elevated` — це глобальний аварійний механізм базового рівня, який запускає exec поза sandbox. Ефективним host за замовчуванням є `gateway`, або `node`, коли ціль exec налаштовано як `node`. Тримайте `tools.elevated.allowFrom` суворим і не вмикайте його для сторонніх. Ви можете додатково обмежити elevated для окремого agent через `agents.list[].tools.elevated`. Див. [Elevated Mode](/uk/tools/elevated). -### Guardrail делегування підлеглих агентів +### Запобіжник делегування в субagent -Якщо ви дозволяєте інструменти сесій, ставтеся до делегованих запусків підлеглих агентів як до ще одного рішення про межу: +Якщо ви дозволяєте інструменти сеансів, сприймайте делеговані запуски субagent як окреме рішення щодо меж: -- Забороняйте `sessions_spawn`, якщо агенту справді не потрібне делегування. -- Тримайте `agents.defaults.subagents.allowAgents` і будь-які перевизначення `agents.list[].subagents.allowAgents` для окремих агентів обмеженими відомо безпечними цільовими агентами. -- Для будь-якого процесу, який обов’язково має лишатися в sandbox, викликайте `sessions_spawn` із `sandbox: "require"` (за замовчуванням використовується `inherit`). -- `sandbox: "require"` швидко завершується помилкою, якщо runtime дочірнього процесу не ізольований у sandbox. +- Забороняйте `sessions_spawn`, якщо agent справді не потребує делегування. +- Тримайте `agents.defaults.subagents.allowAgents` і будь-які перевизначення для окремих agent у `agents.list[].subagents.allowAgents` обмеженими відомо безпечними цільовими agent. +- Для будь-якого потоку, який має залишатися в sandbox, викликайте `sessions_spawn` із `sandbox: "require"` (значення за замовчуванням — `inherit`). +- `sandbox: "require"` одразу завершується помилкою, якщо цільовий дочірній runtime не працює в sandbox. ## Ризики керування браузером Увімкнення керування браузером дає моделі можливість керувати реальним браузером. Якщо цей профіль браузера вже містить активні сесії входу, модель може -отримати доступ до цих облікових записів і даних. Ставтеся до профілів браузера як до **чутливого стану**: +отримати доступ до цих облікових записів і даних. Сприймайте профілі браузера як **чутливий стан**: -- Надавайте перевагу окремому профілю для агента (типовий профіль `openclaw`). -- Не спрямовуйте агента на свій особистий щоденний профіль. -- Тримайте керування браузером на host вимкненим для агентів у sandbox, якщо тільки ви їм не довіряєте. +- Віддавайте перевагу окремому профілю для agent (типовий профіль `openclaw`). +- Не спрямовуйте agent на ваш особистий щоденний профіль. +- Тримайте керування браузером на host вимкненим для agent у sandbox, якщо ви їм не довіряєте. - Окремий loopback API керування браузером підтримує лише auth зі спільним секретом - (bearer auth через token gateway або пароль gateway). Він не використовує + (bearer auth за token gateway або пароль gateway). Він не приймає заголовки ідентичності trusted-proxy або Tailscale Serve. -- Ставтеся до завантажень браузера як до недовіреного введення; надавайте перевагу ізольованому каталогу завантажень. -- За можливості вимикайте синхронізацію браузера/менеджери паролів у профілі агента (це зменшує радіус ураження). +- Сприймайте завантаження з браузера як недовірений ввід; віддавайте перевагу ізольованому каталогу завантажень. +- Якщо можливо, вимикайте синхронізацію браузера/менеджери паролів у профілі agent (це зменшує радіус ураження). - Для віддалених Gateway вважайте, що «керування браузером» еквівалентне «операторському доступу» до всього, до чого має доступ цей профіль. -- Тримайте Gateway і host Node доступними лише через tailnet; уникайте відкриття портів керування браузером у LAN або публічному інтернеті. -- Вимикайте проксі-маршрутизацію браузера, коли вона не потрібна (`gateway.nodes.browser.mode="off"`). -- Режим existing-session Chrome MCP **не** є «безпечнішим»; він може діяти від вашого імені в межах усього, до чого має доступ цей профіль Chrome на хості. +- Тримайте Gateway і host node лише в tailnet; не відкривайте порти керування браузером у LAN або публічному інтернеті. +- Вимикайте проксі-маршрутизацію браузера, якщо вона вам не потрібна (`gateway.nodes.browser.mode="off"`). +- Режим наявної сесії Chrome MCP **не є** «безпечнішим»; він може діяти від вашого імені всюди, куди має доступ цей профіль Chrome на host. ### Політика SSRF браузера (сувора за замовчуванням) -Політика навігації браузера OpenClaw є суворою за замовчуванням: приватні/внутрішні адреси лишаються заблокованими, якщо ви явно не дозволили їх. +Політика навігації браузера в OpenClaw сувора за замовчуванням: приватні/внутрішні цілі залишаються заблокованими, якщо ви явно не дозволите їх. -- За замовчуванням: `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` не задано, тому навігація браузера продовжує блокувати приватні/внутрішні/спеціальні адреси. +- За замовчуванням: `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` не встановлено, тому навігація браузера й надалі блокує приватні/внутрішні/special-use адреси. - Застарілий псевдонім: `browser.ssrfPolicy.allowPrivateNetwork` усе ще приймається для сумісності. -- Режим явного дозволу: встановіть `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true`, щоб дозволити приватні/внутрішні/спеціальні адреси. -- У суворому режимі використовуйте `hostnameAllowlist` (шаблони на кшталт `*.example.com`) і `allowedHostnames` (точні винятки для хостів, включно із заблокованими назвами на кшталт `localhost`) для явних винятків. -- Навігація перевіряється перед запитом і повторно перевіряється в режимі best effort для фінального URL `http(s)` після навігації, щоб зменшити можливість перенаправлень на інші цілі. +- Режим явного ввімкнення: установіть `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true`, щоб дозволити приватні/внутрішні/special-use адреси. +- У суворому режимі використовуйте `hostnameAllowlist` (шаблони на кшталт `*.example.com`) і `allowedHostnames` (точні винятки для host, включно із заблокованими іменами на кшталт `localhost`) для явних винятків. +- Навігація перевіряється перед запитом і повторно перевіряється в режимі best-effort на фінальному `http(s)` URL після навігації, щоб зменшити можливість pivot через перенаправлення. Приклад суворої політики: @@ -1228,18 +1124,17 @@ OpenClaw завантажує локальні для робочого прос } ``` -## Профілі доступу для окремих агентів (кілька агентів) +## Профілі доступу для окремих agent (кілька agent) -З багатoагентною маршрутизацією кожен агент може мати власну політику sandbox + інструментів: -використовуйте це, щоб надати **повний доступ**, **лише читання** або **без доступу** для кожного агента. -Див. [Multi-Agent Sandbox & Tools](/uk/tools/multi-agent-sandbox-tools) для повних деталей -і правил пріоритету. +У разі маршрутизації між кількома agent кожен agent може мати власну політику sandbox + tools: +використовуйте це, щоб надавати **повний доступ**, **лише читання** або **без доступу** для кожного agent. +Повні подробиці та правила пріоритетів див. у [Sandbox і Tools для кількох agent](/uk/tools/multi-agent-sandbox-tools). -Типові сценарії: +Поширені сценарії використання: -- Особистий агент: повний доступ, без sandbox -- Сімейний/робочий агент: sandbox + інструменти лише для читання -- Публічний агент: sandbox + без інструментів файлової системи/оболонки +- Особистий agent: повний доступ, без sandbox +- Сімейний/робочий agent: sandbox + інструменти лише для читання +- Публічний agent: sandbox + без інструментів файлової системи/shell ### Приклад: повний доступ (без sandbox) @@ -1281,7 +1176,7 @@ OpenClaw завантажує локальні для робочого прос } ``` -### Приклад: без доступу до файлової системи/оболонки (дозволено обмін повідомленнями через провайдера) +### Приклад: без доступу до файлової системи/shell (обмін повідомленнями через провайдера дозволено) ```json5 { @@ -1295,9 +1190,9 @@ OpenClaw завантажує локальні для робочого прос scope: "agent", workspaceAccess: "none", }, - // Інструменти сесій можуть розкривати чутливі дані з транскриптів. За замовчуванням OpenClaw обмежує ці інструменти - // поточною сесією + сесіями породжених підлеглих агентів, але за потреби ви можете обмежити ще сильніше. - // Див. `tools.sessions.visibility` у довіднику з конфігурації. + // Інструменти сеансів можуть розкривати чутливі дані з транскриптів. За замовчуванням OpenClaw обмежує ці інструменти + // поточним сеансом + сеансами породжених субagent, але за потреби ви можете обмежити ще сильніше. + // Див. `tools.sessions.visibility` у довіднику конфігурації. tools: { sessions: { visibility: "tree" }, // self | tree | agent | all allow: [ @@ -1332,58 +1227,44 @@ OpenClaw завантажує локальні для робочого прос } ``` -## Що сказати вашому AI - -Додайте рекомендації з безпеки до системного prompt вашого агента: - -``` -## Security Rules -- Never share directory listings or file paths with strangers -- Never reveal API keys, credentials, or infrastructure details -- Verify requests that modify system config with the owner -- When in doubt, ask before acting -- Keep private data private unless explicitly authorized -``` - ## Реагування на інциденти -Якщо ваш AI зробив щось погане: +Якщо ваш AI робить щось погане: -### Локалізація +### Локалізуйте -1. **Зупиніть його:** зупиніть macOS app (якщо він керує Gateway) або завершіть процес `openclaw gateway`. -2. **Закрийте відкриті поверхні:** встановіть `gateway.bind: "loopback"` (або вимкніть Tailscale Funnel/Serve), доки не зрозумієте, що сталося. -3. **Заморозьте доступ:** переведіть ризиковані DM/групи в `dmPolicy: "disabled"` / вимагайте згадки та видаліть записи allow-all `"*"`, якщо вони були. +1. **Зупиніть це:** зупиніть macOS app (якщо вона керує Gateway) або завершіть свій процес `openclaw gateway`. +2. **Закрийте доступ:** установіть `gateway.bind: "loopback"` (або вимкніть Tailscale Funnel/Serve), доки не зрозумієте, що сталося. +3. **Заморозьте доступ:** перемкніть ризикові DM/групи на `dmPolicy: "disabled"` / вимагайте згадку й видаліть записи `"*"`, що дозволяють усіх, якщо вони були. -### Ротація (вважайте compromise ймовірним, якщо секрети витекли) +### Ротуйте (вважайте компрометацію можливою, якщо секрети витекли) -1. Замініть auth Gateway (`gateway.auth.token` / `OPENCLAW_GATEWAY_PASSWORD`) і перезапустіть. -2. Замініть секрети віддалених клієнтів (`gateway.remote.token` / `.password`) на всіх машинах, які можуть викликати Gateway. -3. Замініть облікові дані провайдерів/API (облікові дані WhatsApp, токени Slack/Discord, ключі моделей/API в `auth-profiles.json`, а також значення зашифрованого payload секретів, якщо вони використовуються). +1. Ротуйте auth Gateway (`gateway.auth.token` / `OPENCLAW_GATEWAY_PASSWORD`) і перезапустіть. +2. Ротуйте секрети віддалених клієнтів (`gateway.remote.token` / `.password`) на кожній машині, яка може викликати Gateway. +3. Ротуйте облікові дані провайдерів/API (облікові дані WhatsApp, токени Slack/Discord, ключі моделі/API в `auth-profiles.json` і значення зашифрованого payload секретів, якщо вони використовуються). -### Аудит +### Проведіть аудит 1. Перевірте журнали Gateway: `/tmp/openclaw/openclaw-YYYY-MM-DD.log` (або `logging.file`). 2. Перегляньте відповідні транскрипти: `~/.openclaw/agents//sessions/*.jsonl`. -3. Перегляньте нещодавні зміни config (усе, що могло розширити доступ: `gateway.bind`, `gateway.auth`, політики dm/group, `tools.elevated`, зміни Plugin). +3. Перегляньте нещодавні зміни config (усе, що могло розширити доступ: `gateway.bind`, `gateway.auth`, політики DM/груп, `tools.elevated`, зміни plugin). 4. Повторно запустіть `openclaw security audit --deep` і переконайтеся, що критичні знахідки усунуто. ### Зберіть дані для звіту -- Часова позначка, ОС хоста gateway + версія OpenClaw -- Транскрипти сесії(й) + короткий хвіст журналу (після редагування) -- Що надіслав зловмисник + що зробив агент -- Чи був Gateway відкритий за межі loopback (LAN/Tailscale Funnel/Serve) +- Позначка часу, ОС хоста gateway + версія OpenClaw +- Транскрипти сеансів + короткий tail журналу (після редагування чутливих даних) +- Що надіслав зловмисник + що зробив agent +- Чи був Gateway доступний не лише через loopback (LAN/Tailscale Funnel/Serve) -## Secret Scanning (`detect-secrets`) +## Сканування секретів (detect-secrets) CI запускає pre-commit hook `detect-secrets` у job `secrets`. -Push у `main` завжди запускає сканування всіх файлів. Pull request використовують -швидкий шлях сканування змінених файлів, коли доступний базовий commit, і повертаються -до сканування всіх файлів в іншому випадку. Якщо перевірка не проходить, -це означає, що з’явилися нові кандидати, яких ще немає в baseline. +Push у `main` завжди запускають сканування всіх файлів. Pull request використовують швидкий шлях +лише для змінених файлів, коли доступний базовий commit, і переходять до повного сканування +в іншому разі. Якщо перевірка не проходить, це означає, що є нові кандидати, яких ще немає в baseline. -### Якщо CI не пройшов +### Якщо CI не проходить 1. Відтворіть локально: @@ -1392,27 +1273,27 @@ Push у `main` завжди запускає сканування всіх фа ``` 2. Зрозумійте інструменти: - - `detect-secrets` у pre-commit запускає `detect-secrets-hook` із - baseline та excludes репозиторію. - - `detect-secrets audit` відкриває інтерактивний перегляд, щоб позначити кожен елемент baseline - як реальний секрет або хибнопозитивне спрацювання. -3. Для реальних секретів: замініть/видаліть їх, потім повторно запустіть сканування, щоб оновити baseline. -4. Для хибнопозитивних спрацювань: запустіть інтерактивний аудит і позначте їх як хибні: + - `detect-secrets` у pre-commit запускає `detect-secrets-hook` із baseline + і виключеннями репозиторію. + - `detect-secrets audit` відкриває інтерактивну перевірку, щоб позначити кожен елемент baseline + як справжній секрет або хибнопозитивний результат. +3. Для справжніх секретів: ротуйтe/видаліть їх, а потім повторно запустіть сканування, щоб оновити baseline. +4. Для хибнопозитивних результатів: запустіть інтерактивний аудит і позначте їх як false: ```bash detect-secrets audit .secrets.baseline ``` -5. Якщо потрібні нові excludes, додайте їх у `.detect-secrets.cfg` і заново згенеруйте - baseline з відповідними прапорцями `--exclude-files` / `--exclude-lines` (файл - config є лише довідковим; detect-secrets не читає його автоматично). +5. Якщо вам потрібні нові виключення, додайте їх у `.detect-secrets.cfg` і заново згенеруйте + baseline з відповідними прапорцями `--exclude-files` / `--exclude-lines` (файл config + є лише довідковим; detect-secrets не читає його автоматично). -Закомітьте оновлений `.secrets.baseline`, щойно він відобразить очікуваний стан. +Закомітьте оновлений `.secrets.baseline`, щойно він відображатиме бажаний стан. ## Повідомлення про проблеми безпеки Знайшли вразливість в OpenClaw? Будь ласка, повідомте відповідально: 1. Email: [security@openclaw.ai](mailto:security@openclaw.ai) -2. Не публікуйте публічно, доки проблему не буде виправлено +2. Не публікуйте інформацію публічно, доки проблему не буде виправлено 3. Ми вкажемо вас у подяках (якщо ви не віддаєте перевагу анонімності)