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

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

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

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

ALLOW

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

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

ASK

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

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

DENY

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

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

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