Правила разрешений Claude Code позволяют задать в settings.json allow / ask / deny: какие инструменты, команды, файлы и домены разрешать без подтверждения, запрашивать или запрещать. Ими можно делиться в команде, блокировать совпавшие вызовы и сокращать одобрения проверенных регулярных задач. Но они не перекрывают автоматически другие формы вызова той же программы и доступ через скрипты.

В этом руководстве разбираем, что такое правила разрешений (и чем они отличаются от режимов разрешений), приоритет allow/ask/deny, синтаксис правил, иерархию settings.json и практические рецепты — всё на основе официальной спецификации.

CLAUDE CODE · ПРАВИЛА РАЗРЕШЕНИЙ

Точный контроль с помощью 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 каждое из них пришло).

ALLOW

Выполнять без запроса

Указанный инструмент/команда выполняется без ручного подтверждения.

ASK

Спрашивать каждый раз

Запрашивает подтверждение при каждом использовании. Совпавшее ask вызовет запрос, даже если совпадает и более широкое allow.

DENY

Запрещено (высший приоритет)

Запрещает использование. Среди правил настроек 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) (конкретное). У каждого инструмента свой стиль спецификатора.

ИнструментПримерЗначение
BashBash(npm run *)Команды, начинающиеся с npm run (завершающая * = граница слова)
Read / EditRead(./.env)Чтение .env в текущем каталоге (путь в стиле gitignore)
WebFetchWebFetch(domain:example.com)Запросы к example.com
MCPmcp__github__get_*Инструменты get_ сервера github
AgentAgent(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 года. Настройки устройств не менялись, проверки запуска не проводились.