Почему AI-помощник по коду — дыра в безопасности (и как её закрыть)
Почему AI-помощник для кода — это дыра в безопасности (и как её закрыть)
Недавно я понял: месяцами мой AI-ассистент запускал любые команды на моей машине. У него был доступ к AWS-креденциалам, SSH-ключам, приватным репозиториям GitHub и всему в домашней директории. Страшно? А я даже не задумывался. Инструмент работал на ура, и бед не случилось.
Такое мышление стирает базы данных в проде.
Удобство — ловушка для безопасности
Честно говоря, современные AI для кодинга получают доступ, как старшему девопсу в первый день. Новому подрядчику мы не дадим полный SSH на все сервера. А LLM — запросто.
Дело не в злобе инструмента. Мы просто ленимся думать. AI слишком полезен. Один инъективный промпт в репозитории, неверная цель или случайная команда — и креды улетят к злоумышленнику. Вы даже не заметите.
Хорошая новость: в Claude Code есть нормальные контролы безопасности. Просто их надо включить.
Что скрывает режим по умолчанию
Обычно AI-агенты работают в "auto". Команды выполняются без вопросов, если не попали в чёрный список. Звучит удобно? На деле это значит:
Пустой deny list + auto = AI свободно делает:
curlкуда угодноwgetдля скачивания файловsshна удалёнкиncдля любых сетевых подключений- Читает все
.envв проекте - Копается в
~/.aws/credentials,~/.ssh,~/.gnupg - Пушит код в репозитории
Всё тихо. Без уведомлений. Просто берёт и делает.
Трёхслойная модель защиты
Нужен точный контроль. Не всё требует одобрения, но рискованное — обязательно. Вот схема:
Слой 1: Жёсткий запрет
Блокируйте всё с креденциалами:
{
"deny": [
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(~/.gnupg/**)",
"Read(~/.azure/**)",
"Read(~/.kube/**)",
"Read(~/.npmrc)",
"Read(~/.git-credentials)",
"Read(*.env)",
"Read(.env.*)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(nc *)",
"Bash(ssh *)"
]
}
Это как файрвол. Ничего не пройдёт. Даже если AI вздумает слить данные — система заблокирует.
Слой 2: Точка проверки
Для обратимых, но опасных действий — список на подтверждение:
{
"ask": [
"Bash(git push *)",
"Bash(git commit *)",
"Bash(git merge *)",
"Bash(git reset *)",
"Bash(npm publish *)",
"Bash(docker push *)"
]
}
AI может пушить код или публиковать пакеты. Но перед этим спросит. Получаете скорость без риска фатальных ошибок.
Слой 3: Зелёный свет
Разрешите безопасное без вопросов:
{
"allow": [
"Bash(npm run *)",
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(ls *)",
"Read(src/**)",
"Read(tests/**)"
]
}
Эти команды не меняют состояние или меняют безопасно. AI летает свободно.
Выбор режима по умолчанию
После списков выбирайте режим для остального. Три варианта:
auto— Всё разрешённое идёт молча. Быстро, но deny list должен быть идеальным.acceptEdits— Чтение и правки свободно, bash-команды из ask/allow — по правилам. Баланс скорости и контроля.ask— Всё рискованное на подтверждение. Медленно, но надёжно для параноиков.
Для большинства подойдёт acceptEdits. Продуктивность без слепоты.
Готовый конфиг для продакшена
Вот рабочий пример:
{
"permissions": {
"deny": [
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(~/.gnupg/**)",
"Read(~/.azure/**)",
"Read(~/.kube/**)",
"Read(~/.npmrc)",
"Read(~/.git-credentials)",
"Read(~/.config/gh/**)",
"Read(*.env)",
"Read(.env.*)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(nc *)",
"Bash(ssh *)"
],
"ask": [
"Bash(git push *)",
"Bash(git commit *)",
"Bash(npm publish *)",
"Bash(docker push *)"
],
"allow": [
"Bash(npm run *)",
"Bash(npm install *)",
"Bash(npm test *)",
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)"
],
"defaultMode": "acceptEdits"
}
}
AI поможет с тестами, линтингом, анализом кода. Но не сольёт креды, не запушит без спроса и не свяжется с рандомными серверами.
Два подхода для разных задач
У меня два алиаса в шелле:
# Обычный: баланс
alias cc="claude --permission-mode auto"
# Отладка: полный трэст (редко)
alias ccd="claude --permission-mode dangerously-skip-permissions"
cc — для 95% работы. ccd — для экстренных дебагов, когда рискую осознанно.
Проблема всей индустрии
Не только Claude Code. Любому AI с shell-доступом — GitHub Copilot, Devin, Cursor, ChatGPT с исполнением — нужна такая защита. Большинство инструментов ставят ультиматум: всё или ничего.
Claude даёт гранулярный контроль. Это редкость.
Что делать в команде
В тимлиде это критично. Не все девы подумают о рисках заранее.
Добавьте:
- Обязательные deny list в шаринге
- Блокировку кред-файлов на уровне ФС
- Временные токены вместо вечных ключей
- Сетевые правила против утечек
- Тренинги: продуктивность ≠ риск
Итог
AI для кодинга — огонь. Но без бесплатного сыра. Контролы есть — активируйте.
Потратьте 15 минут: deny для кредов, ask для деплоя, разумный default. Теперь спите спокойно. AI работает, но в рамках.
"Пока ничего не сломалось" — худшая стратегия безопасности.