Ответ
Секреты для CI/CD (токены доступа, ключи развертывания, пароли к артефактам) никогда не должны храниться в коде репозитория. В моей практике используется иерархия:
-
Встроенные секреты CI/CD-системы — первый и обязательный рубеж.
- В GitLab CI/CD — это Protected Variables или File Variables.
- В GitHub Actions — Secrets в настройках репозитория или организации.
- В Jenkins — Credentials Binding Plugin с использованием Credentials ID.
# Пример GitLab CI deploy_to_prod: script: - echo $DEPLOY_TOKEN | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
-
Внешние системы управления секретами (Secrets-as-a-Service) — для сложных сценариев и compliance.
- HashiCorp Vault — подключаю через CI-плагин или CLI для динамического получения временных учетных данных.
- Cloud-native решения: AWS Secrets Manager, Azure Key Vault. Использую их, когда инфраструктура завязана на конкретном облаке.
Мой подход: Все долгоживущие мастер-ключи (например, для доступа к Vault) хранятся в настройках CI/CD как секреты. Внутри пайплайна с их помощью получаю временные, узконаправленные учетные данные (например, STS-токен AWS) для выполнения конкретной задачи. Это минимизирует риски.