Configuration Secrets
Все секреты в проекте управляются через SOPS (Secrets Operations) с использованием GPG для шифрования. Это обеспечивает безопасное хранение паролей, токенов и других чувствительных данных в репозитории.
Configuration GPG ключей для SOPS
Если вы ещё не настроили GPG ключи, следуйте инструкциям из раздела Подготовка локального устройства.
Verification существующих ключей
Check список ваших GPG ключей:
gpg --list-secret-keys --keyid-format LONG
Вы должны увидеть ваш ключ. Найдите строку вида:
sec rsa4096/1E89965BF6B3B6D4AA02D096FEB9EA0B2906786F 2024-01-01
Где 1E89965BF6B3B6D4AA02D096FEB9EA0B2906786F - это ID вашего ключа.
Configuration .sops.yaml
Make sure, что файл .sops.yaml в корне проекта содержит ID вашего GPG ключа:
---
creation_rules:
- pgp: YOUR_GPG_KEY_ID
Замените YOUR_GPG_KEY_ID на ID вашего ключа.
Редактирование Secrets
Секреты хранятся в файле kubernetes/envs/k8s/secrets/_all.yaml, который зашифрован через SOPS.
Открытие файла для редактирования
Для редактирования секретов используйте helm secrets edit:
cd kubernetes
helm secrets edit envs/k8s/secrets/_all.yaml
Эта команда:
- Расшифрует файл используя ваш GPG ключ
- Откроет его в редакторе (определяется переменной
$EDITOR) - После сохранения автоматически зашифрует файл обратно
Альтернативный способ (sops)
Можно использовать sops напрямую:
cd kubernetes
sops envs/k8s/secrets/_all.yaml
Make sure, что переменная GPG_TTY установлена:
export GPG_TTY=$(tty)
Структура файла Secrets
Файл _all.yaml имеет следующую структуру:
secrets:
# Authentik секреты
authentikSecret: ENC[...]
authentikBootstrapPassword: ENC[...]
authentikBootstrapToken: ENC[...]
authentikLdapPassword: ENC[...]
authentikSamlCert: ENC[...]
# SMTP секреты
smtpUsername: ENC[...]
smtpPassword: ENC[...]
# GitLab секреты
gitlabToken: ENC[...]
gitlabRunnerToken: ENC[...]
# Базы данных
postgresPassword: ENC[...]
pgadminPassword: ENC[...]
mongoPassword: ENC[...]
# Секреты сервисов
vaultwardenEmail: ENC[...]
vaultwardenPassword: ENC[...]
grafanaPassword: ENC[...]
notesnookSecret: ENC[...]
stalwartLdapPassword: ENC[...]
youtrackGitlabToken: ENC[...]
nextcloudAdminPassword: ENC[...]
penpotApiSecretKey: ENC[...]
# MinIO
minioAccessKey: ENC[...]
minioSecretKey: ENC[...]
# Домены
domain: ENC[...]
ingressDomain: ENC[...]
Добавление нового секрета
- Откройте файл для редактирования:
helm secrets edit envs/k8s/secrets/_all.yaml
- Добавьте новый секрет в секцию
secrets:
secrets:
myNewSecret: "my-secret-value"
- Сохраните файл - SOPS автоматически зашифрует значение.
Редактирование существующего секрета
- Откройте файл для редактирования:
helm secrets edit envs/k8s/secrets/_all.yaml
- Найдите нужный секрет и измените его значение (уже расшифрованное):
secrets:
vaultwardenPassword: "new-password-here"
- Сохраните файл - SOPS автоматически зашифрует новое значение.
Структура Secrets для каждого сервиса
Ниже приведены основные секреты, которые требуются для каждого сервиса:
Authentik
authentikSecret- секретный ключ для подписи токеновauthentikBootstrapPassword- пароль для начальной загрузкиauthentikBootstrapToken- токен для начальной загрузкиauthentikLdapPassword- пароль для LDAP подключенияauthentikSamlCert- сертификат для SAML
Базы данных
postgresPassword- пароль суперпользователя PostgreSQLpgadminPassword- пароль для pgAdminmongoPassword- пароль для MongoDB
GitLab
gitlabToken- токен API GitLabgitlabRunnerToken- токен для GitLab Runner
Vaultwarden
vaultwardenEmail- email администратораvaultwardenPassword- пароль администратора
Мониторинг
grafanaPassword- пароль администратора Grafana
Notesnook
notesnookSecret- секретный ключ для Notesnook
Stalwart
stalwartLdapPassword- пароль для LDAP подключения
YouTrack
youtrackGitlabToken- токен для интеграции с GitLab
Nextcloud
nextcloudAdminPassword- пароль администратора
Penpot
penpotApiSecretKey- секретный ключ API
MinIO
minioAccessKey- ключ доступаminioSecretKey- секретный ключ
SMTP
smtpUsername- имя пользователя SMTPsmtpPassword- пароль SMTP
Домены
domain- основной доменingressDomain- домен для ingress
Синхронизация Secrets с Vault
После развёртки Vault (см. Развёртка базовой инфраструктуры), секреты можно синхронизировать с Vault для централизованного управления.
Использование скрипта синхронизации
Скрипт vault-sync-secrets.sh синхронизирует секреты из _all.yaml в Vault:
cd kubernetes/scripts
chmod +x vault-sync-secrets.sh
./vault-sync-secrets.sh
Для синхронизации конкретного сервиса:
./vault-sync-secrets.sh vaultwarden
./vault-sync-secrets.sh authentik
Что делает скрипт
- Расшифровывает секреты из
_all.yamlиспользуя SOPS - Загружает секреты в Vault по пути
secret/<service>/secrets - Секреты доступны сервисам через Vault Agent Injector
Verification синхронизации
После синхронизации проверьте секреты в Vault:
kubectl exec -n service deployment/vault -- vault kv get secret/vaultwarden/secrets
Безопасность
Хранение GPG ключей
- Храните приватный GPG ключ в безопасном месте
- Не коммитьте приватный ключ в репозиторий
- Используйте ключ с парольной фразой
- Регулярно делайте резервные копии ключей
Ротация Secrets
Рекомендуется регулярно менять секреты:
- Откройте файл для редактирования
- Измените значения секретов
- Сохраните файл
- Синхронизируйте с Vault (если используется)
- Перезапустите сервисы для применения изменений
Множественные ключи
Для командной работы можно использовать несколько GPG ключей:
---
creation_rules:
- pgp: >-
KEY1_ID,
KEY2_ID,
KEY3_ID
Все указанные ключи смогут расшифровывать и шифровать файлы.
Troubleshooting
Issue: Не могу расшифровать файл
Check, что ваш GPG ключ доступен:
gpg --list-secret-keys
Check, что ключ указан в .sops.yaml:
cat .sops.yaml
Issue: GPG_TTY не установлена
Установите переменную окружения:
export GPG_TTY=$(tty)
echo 'export GPG_TTY=$(tty)' >> ~/.bashrc # или ~/.zshrc
Issue: SOPS не может найти ключ
Check метаданные файла:
sops envs/k8s/secrets/_all.yaml --metadata
Make sure, что ваш ключ указан в метаданных.
Next Steps
После настройки секретов:
- Развёртка базовой инфраструктуры - развёртка базовых сервисов (Traefik, Consul, Vault)