Почему AI-помощник по коду — дыра в безопасности (и как её закрыть)

Почему AI-помощник по коду — дыра в безопасности (и как её закрыть)

Май 07, 2026 ai security credential management claude code developer security infrastructure hardening threat prevention coding agents

Почему 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 летает свободно.

Выбор режима по умолчанию

После списков выбирайте режим для остального. Три варианта:

  1. auto — Всё разрешённое идёт молча. Быстро, но deny list должен быть идеальным.

  2. acceptEdits — Чтение и правки свободно, bash-команды из ask/allow — по правилам. Баланс скорости и контроля.

  3. 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 работает, но в рамках.

"Пока ничего не сломалось" — худшая стратегия безопасности.

Read in other languages:

BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR ES DE DA ZH-HANS EN