Суть урока
Агент (автономный исполнитель) с ключами от всех дверей — это потенциальная катастрофа. Безопасность в AI-разработке — не бюрократия, а архитектура: правильно выстроенные границы защищают тебя, клиента и репутацию.
Термины урока: permission (разрешение — право выполнять действие), API (эй-пи-ай — интерфейс программирования), agent (агент — автономный исполнитель), MCP (эм-си-пи — протокол контекста модели), bash (баш — язык команд терминала), git (гит — система контроля версий), hook (хук — скрипт-реакция на событие), sandbox (сэндбокс — изолированная тестовая среда), token (токен — единица текста для AI), settings.json (файл настроек проекта), workflow (воркфлоу — рабочий процесс).
Ключевые концепции
.env— единственное место для секретов- Режимы разрешений (permissions) Claude Code и когда их применять
- Хранение секретов в продакшене (production — рабочая среда)
- Ограничение доступа суб-агентов как защита от случайных поломок
Теория
.env — хранилище секретов
Файл .env — это изолированное хранилище чувствительных данных: API-ключей, токенов (единиц текста для AI), паролей. Он живёт в корне проекта и никогда не попадает в репозиторий (хранилище кода).
Пример структуры .env:
OPENAI_API_KEY=sk-proj-abc123...
ANTHROPIC_API_KEY=sk-ant-...
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
TELEGRAM_BOT_TOKEN=7123456789:AAF...
STRIPE_SECRET_KEY=sk_live_...В коде ты обращаешься к этим значениям через переменные окружения:
import os
api_key = os.environ.get("OPENAI_API_KEY")или в Node.js:
const apiKey = process.env.OPENAI_API_KEY;Почему НИКОГДА не хардкодить ключи в код:
GitHub и другие платформы активно сканируют публичные репозитории на паттерны вроде sk-ant-, sk-proj-, AIza, Bearer . Если ключ попал в коммит — он считается скомпрометированным. Злоумышленники используют автоматические сканеры и могут начать тратить твои деньги через несколько минут после пуша.
Даже если репозиторий приватный — утечки случаются: случайная смена видимости, добавление коллаборатора, форк. Правило одно: секрет, который хоть раз попал в Git-историю, считается публичным.
.gitignore — первая линия защиты
До первого git commit обязательно добавь .env в .gitignore:
# .gitignore
.env
.env.local
.env.*.local
*.pem
*.key
node_modules/Проверка — запусти git status перед коммитом. Файл .env не должен появляться в списке изменений. Если появился — остановись.
Режимы разрешений Claude Code
Claude Code предоставляет гибкую систему контроля над тем, что может делать агент. Выбор режима зависит от степени доверия к задаче. Режимы переключаются клавишей Shift+Tab прямо в сессии или флагом --permission-mode при запуске. На октябрь 2026 доступно шесть режимов; список меняется, поэтому сверяйся с документацией и страницей Актуальное сейчас.
Plan mode (план-режим — только планирование) Агент анализирует задачу и строит план, но не предпринимает никаких действий. Идеально для первого знакомства с новой кодовой базой или перед сложной операцией — сначала посмотри план, потом одобри.
claude --permission-mode plan "Добавь систему аутентификации"Manual (в конфигурации называется default) — спрашивать перед действиями Без спроса выполняется только чтение. Правки файлов, команды и обращения к сети требуют подтверждения. Используй когда работаешь с чужим кодом, с production-конфигурацией (production — продакшн, рабочая среда), или когда задача нестандартная. Медленнее, но безопаснее.
Accept edits (acceptEdits) — автоматические правки Агент сам правит файлы и выполняет простые команды с файлами (создать папку, переместить, скопировать), остальное спрашивает. Подходит для хорошо описанных задач в твоём собственном проекте где ты понимаешь последствия.
Auto (auto) — проверяющая модель Вместо тебя каждое действие просматривает отдельная модель-классификатор: она блокирует то, что выходит за рамки твоего запроса или похоже на команду из недоверенного текста. Начиная с версии Claude Code 2.1.283 это стартовый режим по умолчанию в терминале и VS Code (если режим недоступен на твоём тарифе или модели, сессия стартует в Manual). Помни: auto уменьшает число вопросов, но не гарантирует безопасность. Для чувствительных операций проверяй сам.
Don't ask (dontAsk) Разрешено только чтение и заранее одобренные инструменты, всё остальное отклоняется без вопросов. Подходит для CI и скриптов, где человека рядом нет.
Bypass permissions (bypassPermissions, байпасс — обход разрешений, полное доверие) Агент может делать всё, включая запускать произвольные команды (--dangerously-skip-permissions включает его). Никогда не используй в production-окружении и на своём основном компьютере. Только для изолированных контейнеров и виртуальных машин, где потеря данных не критична. Правила запрета (deny) работают даже здесь.
Ограничение доступа суб-агентов
Суб-агенты — это вспомогательные агенты которых главный агент нанимает для подзадач (см. урок Суб-агенты). Ты можешь контролировать что каждый суб-агент может делать: в файле суб-агента поле tools разрешает только перечисленные инструменты, а disallowedTools запрещает конкретные.
Readonly (ридонли — только чтение) Суб-агент может читать файлы, но не изменять их. Подходит для агентов-аналитиков: "посмотри на код и найди проблемы", "прочитай логи и суммаризируй".
Только MCPs (эм-си-пи — протокол контекста модели, внешние инструменты) Суб-агент работает только через внешние интеграции — Notion, Slack, Google Docs — но не трогает локальные файлы. Полезно для агентов которые отправляют уведомления или обновляют внешние системы.
Только bash (баш — язык команд терминала) Суб-агент может запускать команды, но не редактировать файлы напрямую. Для деплоя (развёртывания), сборки, тестирования.
Ограниченный агент не сломает то что не должен трогать — это принцип минимальных привилегий (least privilege), фундаментальный в информационной безопасности.
Хранение секретов в продакшене
В локальной разработке ты используешь .env. В продакшене (production — рабочая среда сервиса) нужны специализированные хранилища:
Cloudflare Workers Secrets
wrangler secret put ANTHROPIC_API_KEY
# Вводишь значение — оно шифруется и хранится в CloudflareСекрет недоступен для просмотра после сохранения — только Worker может его использовать.
Vercel Environment Variables Через панель управления Vercel или CLI:
vercel env add ANTHROPIC_API_KEY productionРазделение на development, preview, production — разные ключи для разных окружений.
Принцип: разные окружения — разные ключи. Тестовый ключ не должен совпадать с production-ключом.
Rate limiting и контроль стоимости
API-запросы стоят денег. Без rate limiting один баг (дебаг — отладка ошибок) в коде может обнулить бюджет за ночь.
Стратегии защиты:
- Лимит на уровне агента: максимум N запросов в минуту/час
- Hard cap (хард-кап — жёсткий потолок): если потрачено больше $X за день — агент останавливается и сообщает
- Мониторинг: ежедневный отчёт о потраченных токенах и деньгах
- Тестирование с cheap-моделями: разрабатывай на Haiku, деплой делай на той модели, которая нужна по качеству (актуальные цены и версии: Актуальное сейчас)
Практика
Задание: Настроить безопасное окружение для учебного проекта
- Создай новую папку
my-agent-project - Инициализируй Git:
git init - Создай
.gitignoreсо строками.envиnode_modules/ - Создай
.envс тестовыми (фиктивными) переменными:Код ANTHROPIC_API_KEY=sk-ant-test-placeholder APP_SECRET=my-super-secret-value - Создай
main.pyкоторый читает ключ из окружения (не хардкодит его) - Выполни
git add .иgit status— убедись что.envНЕ в списке - Сделай первый коммит:
git commit -m "Initial setup with secure .env" - Проверь что
git show HEADне содержит значений секретов
Bonus: Попробуй запустить Claude Code с разными режимами разрешений (claude --permission-mode plan, claude --permission-mode default) и почувствуй разницу в поведении агента. А ещё добавь правило запрета на чтение секретов: в .claude/settings.json в разделе permissions → deny запиши Read(./.env).
Уровни разрешений Claude Code — Quick Reference
| Уровень | Что может | Что НЕ может | Когда использовать |
|---|---|---|---|
| Yes (один раз) | Одно конкретное действие | Повторить без спроса | Незнакомая операция, первый раз |
| Yes, and don't ask again | Действия этого типа дальше без вопросов: для правок файлов до конца сессии, для команд Bash и доменов постоянно для этого репозитория | Выйти за рамки того, что ты одобрил | Рутинная работа с доверенным проектом (git commit, npm test) |
| Plan | Анализировать и планировать | Менять файлы, запускать код | Первый взгляд на новую кодовую базу |
| Auto | Работать без вопросов под присмотром проверяющей модели | Гарантировать безопасность | Длинные задачи в проекте, которому доверяешь |
| Bypass | Абсолютно всё | — | Только изолированный контейнер или VM, НИКОГДА в production |
Частые ошибки
1. API ключ попал в git commit (коммит — сохранённая правка) Даже если ты удалишь ключ в следующем коммите — он навсегда в истории. Решение: git-secrets + pre-commit hook (хук — скрипт-реакция на событие, в данном случае перед коммитом).
# Установи git-secrets и добавь проверку
brew install git-secrets
git secrets --install
git secrets --register-aws # для AWS ключей2. Нет .gitignore до первого коммита .gitignore нужно создать ДО git init или сразу после. Если .env уже закоммичен — удалить из истории сложнее чем предотвратить.
3. Один ключ на все окружения Тестовый и production ключ ДОЛЖНЫ быть разными. Баг в dev-коде не должен тратить production-бюджет.
4. Забыли про .env.example Создай .env.example с пустыми значениями — так другие разработчики (или ты через полгода) поймут какие переменные нужны:
OPENAI_API_KEY=
DATABASE_URL=
TELEGRAM_BOT_TOKEN=5. Bypass permissions на production-проекте Полное доверие (--dangerously-skip-permissions — опасный пропуск разрешений) = никакой защиты. Один неверный rm -rf и проект потерян.
Инструменты и ресурсы
- Claude Code Permissions — официальная документация — code.claude.com/docs/en/permissions
- Claude Code Security — модель безопасности — code.claude.com/docs/en/security
python-dotenv/dotenv(Node.js) — загрузка.envв переменные окруженияgit-secrets— CLI-инструмент для сканирования секретов в коммитах- Cloudflare Workers Secrets — продакшн-хранилище для Workers
- Vercel Environment Variables — продакшн-хранилище для Vercel-деплоев
- GitHub Secret Scanning — автоматическое обнаружение утёкших ключей (для публичных репозиториев работает автоматически, для приватных зависит от тарифа и настроек)
Ключевые выводы
Секрет, попавший в Git-историю, считается публичным — даже если репозиторий приватный. Ограниченный агент лучше чем сломанный продакшн: минимальные привилегии — основа безопасной архитектуры.
.gitignoreдобавляется до первого коммита, не после. Потом уже поздно.
Связанные уроки
- API-ключи и .env: как получать и управлять API ключами для разных сервисов
- Hooks и Hooks LIVE: автоматические проверки безопасности через pre-commit и pre-tool-use hooks (можно блокировать случайный коммит секрета)
Что дальше
Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс