Перейти к содержанию

Управление секретами

Где хранятся секреты

Что Где Формат
SSH/DB/API пароли Vaultwarden Plaintext, git-ignored
Ansible секреты ansible/shiva-ansible/inventory/group_vars/vault.yml ansible-vault encrypted
Vault password .vault_pass (локальный файл, git-ignored) Plaintext
CI/CD переменные GitLab → Settings → CI/CD Variables Instance-level
Docker registry GitLab instance CI/CD variables REGISTRY_URL, REGISTRY_USER, REGISTRY_PASSWORD

Запрещено

  • Коммитить пароли в git
  • Хранить plaintext пароли в wiki/документации
  • Передавать пароли в мессенджерах

Ansible Vault

Все секреты для Ansible хранятся в зашифрованном файле: ansible/shiva-ansible/inventory/group_vars/vault.yml

Переменные в vault

Переменная Описание Где используется
vault_xray_admin_password Пароль панели 3x-ui servers.ini [all:vars]
vault_xray_basic_auth_password htpasswd для nginx→3x-ui servers.ini [all:vars]
vault_node_exporter_basic_auth_password htpasswd для node_exporter Prometheus scrape
vault_node_exporter_mysql_password MySQL exporter password MySQL exporter
vault_node_exporter_mysql_htpasswd_password htpasswd для mysql exporter Nginx
vault_loki_password Loki basic auth Fluent Bit → Loki
vault_infra_become_password sudo для внутренних серверов servers.ini [infra:vars]
vault_xray_inbound_private_key x25519 private key Xray Reality config
vault_htpassword_estonia htpasswd для Эстонии Legacy server

Как работать с vault

cd ansible/shiva-ansible

# Просмотреть секреты
ansible-vault view inventory/group_vars/vault.yml --vault-password-file .vault_pass

# Редактировать секреты
ansible-vault edit inventory/group_vars/vault.yml --vault-password-file .vault_pass

# Запуск плейбука с vault
ansible-playbook -i inventory/servers.ini playbooks/vpn.yml \
  --limit <host> --vault-password-file .vault_pass

Vault password

Файл .vault_pass должен быть создан локально (не в git):

echo "пароль" > .vault_pass
chmod 600 .vault_pass

Пароль получить у DevOps (zardes).

Добавить новый секрет

  1. ansible-vault edit inventory/group_vars/vault.yml --vault-password-file .vault_pass
  2. Добавить переменную vault_new_secret: "значение"
  3. Использовать в servers.ini или плейбуках: {{ vault_new_secret }}
  4. Закоммитить зашифрованный vault.yml

Vaultwarden

Мастер-файл паролей в monorepo shivavpn. Содержит:

  • Пароли VPN-провайдеров (MonoVM, LLHost, TheHosting, DataPacket)
  • GitLab токены (API, CI/CD)
  • MySQL пароли (vpn, root, exporter)
  • Keycloak credentials
  • Telegram Bot tokens
  • GitHub tokens
  • SSH пароли для внутренних серверов

Доступ: файл в .gitignore, хранится только локально у DevOps.

GitLab CI/CD Variables

Проект Переменные
Instance-level REGISTRY_URL, REGISTRY_USER, REGISTRY_PASSWORD
vpn-config-service (55) IMAGE_TAG, deploy vars
vpn/back (33) Build + deploy vars

Токен для API: glpat-... (см. Vaultwarden).

Пароли с $

В GitLab CI Variables для паролей с символом $ нужно ставить raw=true.

CA сертификаты

Все приватные ключи зашифрованы ansible-vault и хранятся в git:

Файл Тип В git?
CA/ca.crt Публичный сертификат CA Да (plaintext)
CA/ca.key Приватный ключ CA Да (vault-encrypted)
CA/ca.p12 PKCS#12 бандл Да (vault-encrypted)
CA/selfsigned-ca.key Self-signed CA key Да (vault-encrypted)
CA/xui_all.crt Wildcard cert для XUI панелей Да (plaintext)
CA/xui_all.key Wildcard key для XUI панелей Да (vault-encrypted)

Ansible copy: src: автоматически дешифрует vault-encrypted файлы при запуске с --vault-password-file.

# Просмотреть зашифрованный ключ
ansible-vault view CA/ca.key --vault-password-file .vault_pass

# Перегенерировать ключ — зашифровать после создания
openssl genrsa -out CA/new.key 4096
ansible-vault encrypt CA/new.key --vault-password-file .vault_pass

Ротация секретов

При компрометации:

  1. Сменить пароль в [Vaultwarden](https://vault.shivavpn.io)
  2. Обновить vault.yml: ansible-vault edit ...
  3. Прогнать плейбук на затронутые серверы
  4. Обновить CI/CD variables в GitLab (если затронуты)