Безопасный GitOps: интеграция External Secrets Operator с ArgoCD на AWS EKS
Подход GitOps требует декларативного описания всей инфраструктуры приложения в Git-репозитории. Однако публикация конфигурационных файлов, содержащих пароли от баз данных, приватные ключи или токены внешних сервисов, категорически недопустима по соображениям безопасности. Создание обычных манифестов Kubernetes Secret и их коммит в Git ставит под угрозу всю инфраструктуру проекта.
Для решения этой дилеммы используется External Secrets Operator. Этот инструмент позволяет безопасно автоматизировать жизненный цикл секретов в кластере Kubernetes, извлекая реальные значения из защищенных внешних хранилищ и автоматически материализуя их в виде стандартных секретов Kubernetes на лету. В качестве внешнего провайдера секретов часто выбирают AWS Systems Manager Parameter Store.
Экономическая выгода: SSM Parameter Store против Secrets Manager
Многие облачные команды по умолчанию используют сервис AWS Secrets Manager для хранения конфиденциальных данных. Однако этот выбор сопряжен с заметными расходами: стоимость хранения одного секрета составляет $0.40 в месяц, к чему добавляется плата за каждые 10 000 вызовов API. Для средних и крупных инфраструктур с сотнями микросервисов ежемесячный счет может исчисляться сотнями долларов.
Использование стандартных параметров в AWS SSM Parameter Store является полностью бесплатным. При этом возможностей стандартного хранилища (поддержка шифрования KMS, размер значения до 4 КБ) более чем достаточно для подавляющего большинства конфигурационных параметров приложений. Использование SSM Parameter Store в связке с оператором — это эффективный способ сокращения облачных затрат без ущерба для безопасности.
Архитектурные примитивы интеграции
Для построения безопасного пайплайна доставки секретов используются следующие компоненты:
- AWS EKS IRSA: Механизм авторизации подов Kubernetes в сервисах AWS с использованием OIDC-провайдера. Поды оператора получают временные права доступа к AWS SSM без необходимости прописывать статические ключи доступа в манифестах.
- ClusterSecretStore / SecretStore: Пользовательские ресурсы Kubernetes, описывающие конфигурацию подключения к внешнему провайдеру секретов.
ClusterSecretStoreдействует на уровне всего кластера, тогда какSecretStoreизолирован внутри одного пространства имен. - ExternalSecret: Декларативный манифест, указывающий, какие именно параметры из внешнего облачного хранилища необходимо извлечь и в какой Kubernetes Secret их записать.
Пошаговое руководство по настройке интеграции
Следуйте этой инструкции для развертывания и проверки связки оператора, ArgoCD и AWS EKS:
Требования к окружению
- Установленный интерфейс командной строки AWS CLI и настроенный доступ к консоли AWS.
- Утилита управления кластером
kubectl. - Работающий кластер AWS EKS с настроенным провайдером идентификации IAM OIDC.
Шаг 1. Создание параметров в AWS SSM
Сохраните секретное значение в AWS Parameter Store с типом шифрования SecureString:
aws ssm put-parameter --name "/prod/database/password" --value "supersecretpassword123" --type "SecureString"
Шаг 2. Настройка роли IRSA для доступа к секретам
Создайте в AWS IAM политику, разрешающую чтение нужных параметров:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParametersByPath"
],
"Resource": "arn:aws:ssm:region:account-id:parameter/prod/*"
}
]
}
Создайте роль IAM, разрешающую использование этой политики сервисному аккаунту Kubernetes, используемому оператором.
Шаг 3. Деплой оператора через ArgoCD
Создайте манифест ArgoCD Application для установки оператора из Helm-чарта. Важно: настройте порядок синхронизации так, чтобы CRD оператора установились и стали активными до того, как ArgoCD попытается применить ресурсы ClusterSecretStore и ExternalSecret.
Шаг 4. Создание ClusterSecretStore
Примените манифест создания подключения к AWS провайдеру:
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: aws-parameter-store
spec:
provider:
aws:
service: ParameterStore
region: eu-west-1
auth:
jwt:
serviceAccountRef:
name: external-secrets-sa
namespace: external-secrets
Шаг 5. Описание ресурса ExternalSecret
Создайте манифест, связывающий облачный параметр с секретом в кластере:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: app-db-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-parameter-store
kind: ClusterSecretStore
target:
name: k8s-db-secret
data:
- secretKey: DB_PASSWORD
remoteRef:
key: /prod/database/password
Шаг 6. Верификация работы
Убедитесь, что оператор успешно обработал манифест и создал секрет Kubernetes:
kubectl get externalsecret app-db-secret
kubectl describe externalsecret app-db-secret
kubectl get secret k8s-db-secret -o jsonpath='{.data.DB_PASSWORD}' | base64 -d
Успешный статус Synced подтверждает корректность настройки.
Шаг 7. Проверка ротации секретов
Измените значение параметра в AWS SSM. В течение времени, заданного в refreshInterval, оператор автоматически обновит значение в секрете.
Решение частых проблем при эксплуатации
- Лимиты подов на нодах EKS: На небольших инстансах AWS EKS может закончиться лимит IP-адресов для новых подов. Решайте это настройкой горизонтального автоскейлинга нод и развертыванием
metrics-server. - Ошибки авторизации JWT: При использовании локального
SecretStoreмогут возникать проблемы с правами токенов. Переход на глобальныйClusterSecretStoreобеспечивает более надежную изоляцию и упрощает доступ к облачным секретам. - Кэширование секретов приложениями: Важно помнить, что оператор обновляет секрет Kubernetes, но уже запущенные приложения часто кэшируют конфигурацию в памяти. Для применения нового пароля может потребоваться перезапуск подов приложения или ручной сброс активных токенов авторизации.
Использование External Secrets Operator в связке с AWS SSM Parameter Store и ArgoCD позволяет создать надежную, безопасную и экономически выгодную схему управления конфигурациями в духе GitOps. Полное отсутствие статических паролей в репозиториях кода снижает вероятность утечек данных и автоматизирует рутинные операции по обновлению доступов на эксплуатируемых стендах.

