Короткий ответ
Безопасный пайплайн строится на принципе наименьших привилегий для секретов, контроле зависимостей (lock-файлы, сканирование CVE, закрепление сторонних Action по хешу коммита, а не по тегу) и верификации артефактов (подписание образов, проверка подписи перед деплоем); глубина защиты зависит от критичности системы и требований компании.
Как это работает подробнее
секреты в CI хранятся в зашифрованном виде и инжектируются в job как переменные окружения только при выполнении — риск в том, что любой код в job, включая сторонние Actions, имеет к ним доступ; supply-chain атака возможна через скомпрометированный пакет, сторонний Action, закреплённый по мутируемому тегу, или PR из форка.
Пример кода
config.yaml
- uses: actions/checkout@8f4b7f84864484a7bde6ce1cae7b14b3f0e2a0e3
jobs:
deploy:
environment: production
steps:
- run: deploy.sh
env:
DEPLOY_TOKEN: ${{ secrets.PROD_DEPLOY_TOKEN }}Что использовать на практике
- Рекомендация. закрепляют сторонние Actions по полному commit SHA; ограничивают доступ к продовым секретам только для workflow из защищённой ветки; сканируют зависимости (
pip-audit, Dependabot) на известные CVE; для более высокого уровня зрелости подписывают образы (cosign) и проверяют подпись перед деплоем. - Компромисс. максимальная строгость (атестации, подписание, полный аудит на каждый PR) увеличивает время и сложность пайплайна; более лёгкий подход быстрее внедряется, но оставляет часть векторов атаки непокрытыми. Критерий выбора — чувствительность данных, нормативные требования и зрелость команды безопасности.
Подводные камни
- Риск. хранить продовые секреты как обычные переменные, доступные любому workflow, включая PR внешних контрибьюторов; использовать сторонние Actions по мутируемому тегу; логировать переменные окружения целиком при дебаге.