Содержание
Правила разрешений Claude Code позволяют задать в settings.json allow / ask / deny: какие инструменты, команды, файлы и домены разрешать без подтверждения, запрашивать или запрещать. Ими можно делиться в команде, блокировать совпавшие вызовы и сокращать одобрения проверенных регулярных задач. Но они не перекрывают автоматически другие формы вызова той же программы и доступ через скрипты.
В этом руководстве разбираем, что такое правила разрешений (и чем они отличаются от режимов разрешений), приоритет allow/ask/deny, синтаксис правил, иерархию settings.json и практические рецепты — всё на основе официальной спецификации.
Точный контроль с помощью allow / ask / deny
Порядок проверки deny → ask → allow (побеждает первое совпадение)
deny
Сначала оцениваются совпавшие deny
ask
Спрашивать каждый раз
allow
Выполнять без запроса
1. Что такое правила разрешений (в сравнении с режимами)
Claude Code использует многоуровневую систему разрешений. В Manual чтение рабочей области обычно не требует подтверждения, а правки и Bash обычно требуют его; встроенные команды только для чтения и allow — исключения. На этой основе правила задают отдельные исключения (источник: официальная документация «Configure permissions»).
Не путайте их с режимами разрешений: режим задаёт общую политику подтверждений (default, acceptEdits, auto), а правило — отдельные инструменты и команды. Они работают вместе: режим задаёт основу, правило меняет её указаниями «всегда разрешать это» или «запретить этот вызов».
💡 Правила обеспечивает Claude Code, а не модель. Ваш промпт или CLAUDE.md влияют на то, что Claude пытается сделать, но не на то, что разрешено. Выдавайте или отзывайте доступ через /permissions, правила, режимы или хук PreToolUse.
2. allow / ask / deny и приоритет
Существует три типа правил. Команда /permissions показывает и редактирует их (а также указывает, из какого settings.json каждое из них пришло).
Выполнять без запроса
Указанный инструмент/команда выполняется без ручного подтверждения.
Спрашивать каждый раз
Запрашивает подтверждение при каждом использовании. Совпавшее ask вызовет запрос, даже если совпадает и более широкое allow.
Запрещено (высший приоритет)
Запрещает использование. Среди правил настроек allow не может отменить совпавший deny.
Порядок проверки: deny → ask → allow. Среди обычных правил настроек исход определяет первое совпадение; конкретность не меняет порядок. Общий deny Bash(aws *) блокирует и более узкий allow Bash(aws s3 ls). Allow не отменяет совпавший deny. Отрицание относительных путей Read/Edit — отдельная возможность.
⚠️ Две формы deny ведут себя по-разному: голое имя инструмента вроде Bash полностью убирает инструмент из контекста Claude (Claude его вообще не видит). Правило с областью вроде Bash(rm *) оставляет инструмент доступным и блокирует только совпадающие вызовы.
3. Синтаксис правил (Tool(specifier))
Формат — Tool (всё) или Tool(specifier) (конкретное). У каждого инструмента свой стиль спецификатора.
| Инструмент | Пример | Значение |
|---|---|---|
| Bash | Bash(npm run *) | Команды, начинающиеся с npm run (завершающая * = граница слова) |
| Read / Edit | Read(./.env) | Чтение .env в текущем каталоге (путь в стиле gitignore) |
| WebFetch | WebFetch(domain:example.com) | Запросы к example.com |
| MCP | mcp__github__get_* | Инструменты get_ сервера github |
| Agent | Agent(Explore) | Субагент Explore |
Правила MCP действуют только на сервер, который в них назван. Начиная с v2.1.299 (14 октября 2026 года), mcp__a не разрешает другим серверам с именами a__b или a_. Для сервера, в имени которого есть __ или которое заканчивается на _, пишите полное нормализованное имя с суффиксом __*, например mcp__reports__v2__* (официальная документация и журнал изменений, проверено 18 октября 2026 года).
Wildcard-символы в Bash могут стоять где угодно. Bash(ls *) (пробел + *) совпадает с ls -la, но не с lsof (граница слова); Bash(ls*) (без пробела) совпадает с обоими. Завершающее :* эквивалентно *.
// Разрешаем или запрещаем указанные вызовы, но не все пути к той же программе
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}
Составные команды проверяются по подкомандам; распознанные обёртки снимаются перед оценкой. Но другая форма вызова той же программы может не совпасть: Bash(git push *) не совпадает с git -C . push. Встроенные команды только для чтения обычно пропускают подтверждение, но ограничения чтения вне рабочей области и ожидание классификатора auto — отдельные условия.
Пути Read/Edit следуют семантике gitignore с четырьмя якорями:
| Форма | Якорь | Пример |
|---|---|---|
//path | Абсолютный путь в файловой системе | Read(//tmp/x) |
~/path | Домашний каталог | Read(~/.ssh/**) |
/path | Точка отсчёта файла настроек (корень проекта для настроек проекта, ~/.claude для пользовательских) | Edit(/src/**) |
path / ./path | Текущий каталог | Read(.env) |
* /Users/... НЕ является абсолютным — он отсчитывается от точки отсчёта файла настроек (для настроек проекта это корень проекта). В пользовательских настройках Read(/secrets/**) означает ~/.claude/secrets/**, поэтому для правила, действующего во всех проектах, пишите // или ~/. Для абсолютных путей используйте //Users/... (двойной слеш). Read(.env) равно Read(**/.env) и совпадает с каждым .env ниже по дереву.
Отрицание в deny для относительных путей — отдельная возможность. В массиве одного источника Read(!sample.env) после Read(*.env) исключает sample.env из области этого правила. Так нельзя снять deny из другого источника, правило с привязкой /, ~/, // или запрет целого каталога. Это отличается от отмены deny через allow. Официальная документация: шаблоны отрицания.
4. Иерархия и приоритет settings.json
Значения настроек разрешаются по иерархии. Для правил разрешений совпавший deny оценивается до allow. Таблица описывает приоритет правил файлов настроек и CLI, а не абсолютную гарантию с учётом изменений решений модами.
| Приоритет | Расположение | Назначение |
|---|---|---|
| 1 (сильнейший) | Управляемые настройки | Политика организации. Не переопределяется пользователями/CLI |
| 2 | Аргументы командной строки | Временные переопределения для сессии |
| 3 | .claude/settings.local.json | Личные настройки проекта (в gitignore) |
| 4 | .claude/settings.json | Общие настройки проекта (в коммите) |
| 5 | ~/.claude/settings.json | Пользовательские настройки для всех проектов |
// .claude/settings.json (общие для команды)
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": ["Bash(npm run *)", "WebFetch(domain:docs.example.com)"],
"deny": ["Read(.env)", "Read(**/secrets/**)", "Bash(git push *)"],
"additionalDirectories": ["../shared-lib"]
}
}
Здесь же задаётся режим разрешений по умолчанию — через defaultMode (подробнее о режимах). Однако auto и bypassPermissions в настройках проекта (.claude/settings.json, .claude/settings.local.json) не действуют — их прописывают в пользовательских или управляемых настройках. Чтобы читать/редактировать за пределами рабочего каталога, добавьте пути в additionalDirectories.
5. Практические рецепты
Начните с узких allow для проверенных регулярных вызовов и ask/deny для ограничиваемых вызовов. Это не контролирует автоматически другие формы той же операции и всё содержимое разрешённого скрипта.
🔒 Защитить секретные файлы
deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]. Ограничивает встроенные файловые инструменты и файловые команды с распознаваемыми целевыми путями. Рекурсивный поиск, произвольные скрипты, MCP и другие пути остаются.
🚀 Подтверждение указанных вызовов
ask: ["Bash(git push *)", "Bash(rm *)"]. Добавляет подтверждение совпавших вызовов даже в auto. Учитывайте другие формы вызова и изменения решений модами.
⚡ Автоматизировать рутину
allow: ["Bash(npm run *)", "Bash(git commit *)"]. Тесты/сборки/коммиты идут без помех. Но в auto mode широкое правило запуска через менеджер пакетов вроде Bash(npm run *) отключается, и такие команды проверяет классификатор.
Сопоставления аргументов Bash недостаточно для принудительного ограничения URL. Даже запрет curl/wget и использование WebFetch оставляют абсолютные пути, sh -c и связь через другие программы. Доменные правила WebFetch контролируют этот инструмент, а не весь трафик Bash. Для ограничения адресатов сочетайте меры, например сетевой список разрешений песочницы, и отдельно контролируйте инструменты и повторные попытки вне неё.
6. Подводные камни и частые путаницы
- Deny обеспечивает Claude Code, а не модель. Фраза «не читай это» в промпте или CLAUDE.md не остановит чтение без правила.
- Deny Read/Edit не останавливает косвенный доступ. Оно действует на встроенные файловые инструменты и
cat/head/sed, но не на открытие файлов скриптами Python/Node. Рекурсивные операции без имени целевого файла, напримерgrep -r pattern ., тоже исключение. Ограничения ОС действуют на процессы внутри песочницы; встроенный Read, MCP и другие пути требуют отдельного контроля. - Следите за «запускателями» окружения.
devbox run *,npxиdocker execвыполняют свои аргументы как команду, поэтомуBash(devbox run *)заодно разрешаетdevbox run rm -rf .. Пишите правила, включающие внутреннюю команду. - Хуки не отменяют правила. Хук PreToolUse расширяет разрешения, но deny/ask оцениваются независимо от его результата. Однако
tool.checkмода может заменить решение позднее: одобрить ask, а в личной среде без управляемых настроек — и deny. На управляемых машинах и Team/Enterprise deny по умолчанию приоритетен, но настройки организации могут это изменить. Нужно оценивать доверие к установленным модам. - В auto mode даже команда из списка allow может уйти на проверку классификатору. При входе в auto mode широкие правила allow, разрешающие выполнение произвольного кода (сплошной
Bash(*), интерпретаторы с подстановкой вродеBash(python*), команды run менеджеров пакетов, правилаAgentи т. п.), снимаются и возвращаются при выходе из режима; узкие правила вродеBash(npm test)остаются. Правила совпадают только в том виде, как они написаны, поэтомуBash(git push *)не совпадает сgit -C . push, а команду, не подошедшую ни под одно правило, оценивает классификатор. Запись в защищённые пути тоже уходит классификатору, даже если есть подходящее правило allow. Если заблокировано законное действие, его можно повторить из Recently blocked (до v2.1.314 — Recently denied) в/permissions(см. режимы разрешений). На GitHub есть и issue о том, что блокируются команды из списка allow (например, #95996). Этот пункт основан на официальной документации (Choose a permission mode) по состоянию на 9 октября 2026 года.
* Поведение сверено с официальными документами Claude Code Configure permissions / Settings files and precedence / Choose a permission mode по состоянию на 9 октября 2026 года. Оно может измениться: проверяйте актуальную документацию.
Итоги
Три вывода о правилах разрешений Claude Code.
- Что это: allow/ask/deny в
settings.json, чтобы разрешать/спрашивать/запрещать по инструменту, команде, файлу и домену. Режимы задают базовую линию; правила решают частности. - Приоритет: deny → ask → allow (первое совпадение; конкретность не влияет). Среди правил настроек allow не отменяет совпавший deny. Уровни: managed > CLI > local > project > user.
- Синтаксис:
Tool(specifier). Bash использует wildcard-символы (пробел + * = граница слова), Read/Edit используют пути в стиле gitignore, WebFetch использует domain:. В составных командах должна совпадать каждая подкоманда.
Понимайте область совпадения правил и сокращайте только нужные одобрения. Сочетайте их с режимами разрешений и хуками. Для принудительных ограничений файлов и сети рассмотрите песочницу. Различайте, какой слой охватывает какой путь.
Если вам нужны только исследование текущего состояния и рекомендации без изменения кода, см. статью о том, как использовать Codex и Claude Code только для исследования. В руководстве есть действия для приложения, IDE и CLI, а также запрос, который требует остановиться до реализации.
FAQ
Q. Чем правила разрешений отличаются от режимов?
A. Режимы — это широкая базовая линия подтверждений (default/acceptEdits/auto и т. д.); правила — спецификации для конкретного инструмента и команды. Они работают вместе, и правила переопределяют режимы (например, правила ask/deny действуют и в режиме auto).
Q. Я разрешил это — почему запрос всё равно появляется?
A. Потому что проверка идёт в порядке deny → ask → allow. Если вызову совпадает отдельное ask (или deny), оно побеждает даже более точное allow. Специфичность не меняет порядок.
Q. Куда класть settings.json?
A. Общий для команды: .claude/settings.json (в коммите). Личный: .claude/settings.local.json (в gitignore). Для всех проектов: ~/.claude/settings.json. Для применения на уровне организации используйте управляемые настройки (их нельзя переопределить).
В. Как ограничить чтение .env?
О. deny: ["Read(.env)", "Read(**/secrets/**)"] ограничивает встроенные файловые инструменты и распознаваемые файловые команды. Это не гарантирует запрет всех путей: рекурсивного поиска без указания целевого пути, Python/Node, MCP. Для оболочки проверьте права чтения ОС или denyRead внутри песочницы; разрешения других инструментов проверяйте отдельно.
Q. Можно ли ограничивать URL или файлы через аргументы Bash?
О. Совпадение строки команды не перекрывает другие формы вызова и аналогичные сетевые или файловые операции через другие программы. Доменные правила WebFetch относятся к WebFetch. Для принудительного ограничения сочетайте изоляцию файловой системы и сети оболочки с отдельным контролем доступа вне песочницы.
Область действия и исключения прав и изоляции повторно сверены с официальными источниками 9 октября 2026 года. Настройки устройств не менялись, проверки запуска не проводились.