Содержание
Правила разрешений в Claude Code позволяют прописать записи allow / ask / deny в settings.json и точно задать, какие инструменты, команды, файлы и домены выполняются без запроса, спрашивают подтверждение каждый раз или вовсе запрещены. Их можно использовать совместно в команде: вы наверняка блокируете опасное и при этом даёте безопасной рутинной работе идти без помех.
В этом руководстве разбираем, что такое правила разрешений (и чем они отличаются от режимов разрешений), приоритет allow/ask/deny, синтаксис правил, иерархию settings.json и практические рецепты — всё на основе официальной спецификации.
Точный контроль с помощью allow / ask / deny
Порядок проверки deny → ask → allow (побеждает первое совпадение)
deny
Запрещено (важнее всего)
ask
Спрашивать каждый раз
allow
Выполнять без запроса
1. Что такое правила разрешений (в сравнении с режимами)
Claude Code использует многоуровневую систему разрешений. Чтение (просмотр файлов, Grep и т. п.) не требует подтверждения; команды Bash и редактирование файлов — требуют, и поверх этой базовой линии правила позволяют задавать точечные исключения (источник: официальный раздел Claude Code «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). Суть в том, что deny не может нести исключения по allow-списку.
⚠️ Две формы 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 |
Wildcard-символы в Bash могут стоять где угодно. Bash(ls *) (пробел + *) совпадает с ls -la, но не с lsof (граница слова); Bash(ls*) (без пробела) совпадает с обоими. Завершающее :* эквивалентно *.
// Разрешить безопасные команды, запретить git push
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}
Помните о составных командах. Claude Code понимает разделители вроде && || ; |, и каждая подкоманда должна совпадать самостоятельно. Bash(safe-cmd *) не разрешает safe-cmd && rm -rf .. Учтите, что команды только для чтения (ls/cat/grep/find/pwd и т. д.) выполняются без запроса в любом режиме, а обёртки вроде timeout/nice/nohup отбрасываются перед сопоставлением.
Пути Read/Edit следуют семантике gitignore с четырьмя якорями:
| Форма | Якорь | Пример |
|---|---|---|
//path | Абсолютный путь в файловой системе | Read(//tmp/x) |
~/path | Домашний каталог | Read(~/.ssh/**) |
/path | Корень проекта | Edit(/src/**) |
path / ./path | Текущий каталог | Read(.env) |
※ /Users/... НЕ является абсолютным — он относителен корню проекта. Для абсолютных путей используйте //Users/... (двойной слеш). Read(.env) равно Read(**/.env) и совпадает с каждым .env ниже по дереву.
4. Иерархия и приоритет settings.json
Правила живут в settings.json. Файлов несколько, и более высокие уровни сильнее. Ключевое правило: deny на любом уровне всегда перебивает allow на любом другом уровне.
| Приоритет | Расположение | Назначение |
|---|---|---|
| 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 (подробнее о режимах). Чтобы читать/редактировать за пределами рабочего каталога, добавьте пути в additionalDirectories.
5. Практические рецепты
Распространённые комбинации. Базовый принцип: наверняка запретить опасное, разрешить безопасную рутину, чтобы автоматизировать её.
🔒 Защитить секретные файлы
deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]. Блокирует чтение наглухо.
🚀 Всегда подтверждать рискованные операции
ask: ["Bash(git push *)", "Bash(rm *)"]. Вынуждает запрос даже в режиме auto.
⚡ Автоматизировать рутину
allow: ["Bash(npm run *)", "Bash(git commit *)"]. Тесты/сборки/коммиты идут без помех.
Ограничивать URL через шаблоны аргументов Bash ненадёжно (curl http://github.com/ * легко обходится через -X GET или подстановку переменных). Вместо этого запретите curl/wget и разрешите конкретные домены через WebFetch(domain:...). Для более строгого контроля проверяйте URL в хуке PreToolUse.
6. Подводные камни и частые путаницы
- Deny обеспечивает Claude Code, а не модель. Фраза «не читай это» в промпте или CLAUDE.md не остановит чтение без правила.
- Deny на Read/Edit не остановит косвенный доступ. Оно применяется к встроенным файловым инструментам и
cat/head/sed, но не к скрипту на Python или Node, который сам открывает файлы. Для контроля на уровне ОС используйте ещё и песочницу (sandboxing). - Следите за «запускателями» окружения.
devbox run *,npxиdocker execвыполняют свои аргументы как команду, поэтомуBash(devbox run *)заодно разрешаетdevbox run rm -rf .. Пишите правила, включающие внутреннюю команду. - Хуки не переопределяют правила. Хук PreToolUse может расширить разрешения, но deny/ask проверяются независимо от того, что возвращает хук (приоритет deny-first неизменен).
※ Поведение соответствует официальной документации Claude Code (Configure permissions / Settings) по состоянию на июнь 2026. Оно может измениться — сверяйтесь с официальной документацией за актуальными данными.
Итоги
Три вывода о правилах разрешений Claude Code.
- Что это: allow/ask/deny в
settings.json, чтобы разрешать/спрашивать/запрещать по инструменту, команде, файлу и домену. Режимы задают базовую линию; правила решают частности. - Приоритет: deny → ask → allow (побеждает первое совпадение; специфичность не важна). Deny на любом уровне всегда побеждает. Уровни: управляемые > CLI > local > project > user.
- Синтаксис:
Tool(specifier). Bash использует wildcard-символы (пробел + * = граница слова), Read/Edit используют пути в стиле gitignore, WebFetch использует domain:. В составных командах должна совпадать каждая подкоманда.
«Наверняка блокировать опасное, автоматизировать безопасную рутину» — суть проектирования правил. Сочетайте это с режимами разрешений, хуками и настройкой effort, чтобы запускать Claude Code безопасно и без сбоев.
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. Для применения на уровне организации используйте управляемые настройки (их нельзя переопределить).
Q. Как гарантировать, что .env никогда не будет прочитан?
A. Задайте deny: ["Read(.env)", "Read(**/secrets/**)"]. Учтите, что это применяется к встроенным файловым инструментам и командам типа cat, но не к косвенному чтению через скрипт. Для контроля на уровне ОС включите ещё и песочницу.
Q. Можно ли ограничивать URL или файлы через аргументы Bash?
A. Ненадёжно. curl http://github.com/ * легко обходится опциями или подстановкой переменных. Для ограничения URL запретите curl/wget и используйте WebFetch(domain:...) или проверяйте в хуке PreToolUse.