Как работать с секретами в разработке
В этом посте я хотел бы поговорить о такой теме, как секреты в разработке: от учётных данных до различных токенов. Кратко разберём, какую ценность они представляют для атакующего и какие существуют подходы к их хранению.
━━━━━━━━━━ Что такое секрет в коде? ━━━━━━━━━━
Секрет это любая чувствительная информация, которая даёт доступ к системе или данным: • логины и пароли • API-ключи • токены доступа • приватные ключи • строки подключения к БД • внутренние URL и сервисные креды
Это не просто “данные”, а готовый вектор входа в систему. Иногда даже более ценный, чем уязвимость.
━━━━━━━━━━ Почему захардкоженные секреты в коде плохо? ━━━━━━━━━━
Самая частая ошибка это хранить секреты прямо в коде или репозитории Проблемы тут не совсем очевидны поэтому опишу их: ◦ секреты попадают в git-историю и остаются там навсегда ◦ при утечке репозитория утекут и все доступы ◦ сложно управлять ротацией и отзывом ◦ в некоторых случаях возможно на основе данных сформировать единый формат создания секретов который ведет к компрометации всей структуры
По факту это превращает любой скомпрометированный секрет к доступ сервиса и возможность компрометации всей компании.
━━━━━━━━━━ Какие есть варианты хранения секретов ━━━━━━━━━━
Базово есть несколько подходов, от простого к более зрелому
1. Переменные окружения (env) Подход лучше, чем хардкод, но всё ещё ограниченный: секреты остаются в runtime и могут утекать через логи, дампы или misconfig, а так же могут быть слиты через “некорректный” комит.
2. Secret-хранилища (Vault, AWS Secrets Manager и др.) Централизованное хранение с контролем доступа, аудитом и ротацией.
3. Динамические секреты Секреты выдаются на время (например, доступ к БД на несколько минут) и автоматически инвалидируются.
4. Мобильные хранилища (iOS Keychain / Android Keystore) Для клиентских приложений отдельная тема, где важно использовать нативные защищённые механизмы.
━━━━━━━━━━ Почему важно думать про runtime ━━━━━━━━━━
Даже если секреты хранятся правильно, они всё равно появляются в runtime ◦ в памяти процесса ◦ в переменных окружения ◦ в конфигурациях ◦ иногда в логах
И здесь уже появляются другие векторы атак: ◦ дамп памяти процесса ◦ debug / crash dumps ◦ утечки через логи ◦ доступ к контейнеру или хосту
То есть защита секретов это не только “где хранить”, но и как они живут во время выполнения приложения.
━━━━━━━━━━ Мини итог по посту ━━━━━━━━━━
Секреты это один из самых простых и одновременно самых критичных векторов компрометации
Базовые best practices: ➾ не хранить секреты в коде ➾ использовать централизованные хранилища (Vault и аналоги) ➾ минимизировать время жизни секретов ➾ ограничивать доступ по принципу least privilege ➾ контролировать, где секреты появляются в runtime ➾ не забывать про логи и дампы
Лично я для веб-инфраструктуры предпочитаю использовать Vault, а для мобильных приложений нативные secure-хранилища iOS и Android.
В итоге безопасность секретов это не про “где положить токен”, а про контроль его жизненного цикла от создания до удаления.
#CyberSecurity #AppSec #DevSecOps #SecretsManagement #Vault #Backend
· 17 ч
В своих ботах предпочитал хранить токены в env, поскольку какая-нибудь социальная сеть предоставляет только ручную смену токенов, автоматически нельзя.
Можно, конечно, добавить example-файл, затем имя измененного по шаблону файла добавить в .gitignore (не лишним нужно добавить сюда кэширующие файлы, ибо зачем?), и тогда можно запускать бота без тяжелых последствий.
Да, там тоже есть свои плюсы и минусы из-за рантайма, но легче будет делать конфиги через JSON, а не писать на коленке чистый Python-код с хардкодом.
ответить
коммент удалён
· 17 ч
Для своих проектов твое решение самое оптимальное, но если говорить про разработку в корпорации, где есть четкие требования к безопасности / ротации, то хранить какие-либо секреты, токены в репе проекта под запретом. Нужна централизация и прозрачность всех активов. Не будешь же выделять неделю на 1000+ сервисов, чтобы сделать инвентаризацию секретов
ответить
ответ удалён