Защо AI асистентът ти за кодиране е дупка в сигурността (и как да я запълниш)
Защо AI асистентът ти за кодиране е дупка в сигурността (и как да я запълниш)
Миналата седмица осъзнах, че за месеци съм оставял AI инструмент да изпълнява какви ли не команди на компютъра ми. Той виждаше AWS ключове, SSH файлове, частни GitHub репозитории и всичко в домашната ми директория. Страшното? Никога не ми хрумна да се замисля, щото работеше перфектно и нямаше проблеми.
Точно такъв подход води до изтрити бази данни в продакшън.
Удобството често е капан за сигурността
Ето неудобната истина: повечето AI кодъри днес имат достъп като старши devops инженер от първия ден. Никога нямаше да дадеш на нов изпълнител пълен SSH към всички сървъри, но на LLM го даваш без да мигнеш.
Проблемът не е в злата умисъл. Това е небрежност. Инструментите са тъй полезни, че спираме да мислим какво всъщност могат. Един prompt injection от клониран репозитори, грешна цел или случайна команда – и ключовете ти отиват при хакер. Без да усетиш.
Добрата новина? Инструменти като Claude Code имат солидни защити. Просто трябва да ги активираш.
Какво означава стандартният риск
По подразбиране много AI кодъри работят в "auto" режим. Изпълняват команди без да питат, освен ако не са блокирани. Ефективно, нали? Ето какво става на практика:
Ако deny списъкът ти е празен и режимът е auto, AI може да:
- Изпрати
curlкъм всяко място - Изтегли файлове с
wget - Свърже се с
sshкъм сървъри - Отвори връзки с
nc - Чете всички
.envфайлове - Гледа
~/.aws/credentials,~/.ssh,~/.gnupg - Пушва директно в репозитории
Всичко става тихо. Без известия. Просто се случи.
Тристепенна модел за сигурност
Трябва ти прецизен контрол. Не всичко изисква одобрение, но някои неща – задължително. Ето как:
Слой 1: Абсолютно забраняване
Започни с deny списък за ключове и чувствителни данни:
{
"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" списък за обратими, но рискови действия:
{
"ask": [
"Bash(git push *)",
"Bash(git commit *)",
"Bash(git merge *)",
"Bash(git reset *)",
"Bash(npm publish *)",
"Bash(docker push *)"
]
}
AI може да ги направи – пушване, публикуване, деплои – но първо те питат. Ползата остава, рискът пада.
Слой 3: Бърза линия
Ясно allow за безопасни команди:
{
"allow": [
"Bash(npm run *)",
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(ls *)",
"Read(src/**)",
"Read(tests/**)"
]
}
Тези летят свободно. Не променят нищо опасно.
Избор на основен режим
След списъците ти остава default mode за останалото. Три варианта:
auto– Всичко незадържано стартира тихо. Бързо, но deny списъкът трябва да е перфектен.acceptEdits– Четене и предложения свободно, bash команди – с въпрос. Балансирано.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 списъци в общи конфиги
- Блокиране на ключови файлове на ниво файлова система
- Временни токени вместо дълги ключове
- Мрежови филтри срещу изтичане
- Обучение за риск vs. продуктивност
Крайна дума
AI кодърите са супер полезни. Но не са безплатни. Защитите са там – ползвай ги.
Започни сега. 15 минути за deny списък на ключове. Ask за деплои. Разумно default. Тогава работи спокоен.
"Още нищо лошо не се е случило" не е стратегия за сигурност.