Skip to content

bivex/unixSecrets

Repository files navigation

Unix Secrets Manager

Версия: 1.0.0 Дата: Декабрь 2025 Статус: Production Ready


Краткое описание

Безопасная система управления секретами на базе внутренних средств Linux, без внешних зависимостей типа HashiCorp Vault или облачных KMS.

Целевая аудитория: Системные администраторы, разработчики приложений, DevOps инженеры

Предварительные знания: Linux администрирование, systemd, GPG

История изменений

Версия Дата Описание
1.0.0 2025-12 Первоначальный релиз с поддержкой Docker

Ссылки на документацию

  • Полное руководство: docs/unix-secrets-manager-guide.md
  • Документация скриптов: scripts/README.md
  • Пример с Telegram ботом: examples/telegram-bot/README.md

1. Введение

1.1 Назначение системы

Unix Secrets Manager предоставляет enterprise-grade управление секретами (паролями, API ключами, токенами) используя только встроенные средства Linux. Система обеспечивает:

  • Полную безопасность: Секреты никогда не хранятся в открытом виде на диске
  • Изоляцию: Каждый сервис имеет доступ только к своим секретам
  • Аудит: Полное логирование всех операций с секретами
  • Ротацию: Безопасная смена секретов без downtime

1.2 Область применения

  • Изолированные (air-gapped) среды
  • Встроенные системы и appliances
  • Регулируемые среды с ограничениями на внешние зависимости
  • Microservices архитектуры
  • CI/CD пайплайны

1.3 Архитектура системы

Зашифрованные секреты (.gpg файлы)
    ↓ [GPG дешифрование]
Расшифрованные секреты (tmpfs RAM)
    ↓ [systemd credentials]
Изолированные сервисы
    ↓ [SecretsManager API]
Приложения с секретами

Ключевые компоненты:

  • GPG шифрование: Военный уровень защиты секретов
  • tmpfs хранилище: Секреты существуют только в RAM
  • systemd credentials: Изоляция доступа по сервисам
  • POSIX ACL: Детальный контроль прав доступа

Поддерживаемые платформы:

  • Linux с systemd
  • Docker контейнеры
  • Kubernetes (через адаптацию)

1.4 Структура проекта

unixSecrets/
├── docs/                          # 📚 Полная документация
│   └── unix-secrets-manager-guide.md
├── examples/                      # 🚀 Примеры использования
│   └── telegram-bot/              # Telegram бот с 50+ секретами
├── scripts/                       # ⚙️ Инструменты управления
│   ├── decrypt-secrets.sh        # Дешифрация секретов
│   ├── generate-test-secrets.sh  # Генерация тестовых секретов
│   └── rotate-secret.sh          # Ротация секретов
├── systemd-units/                 # 🔧 Systemd конфигурации
│   ├── secrets-decrypt.service   # Сервис дешифрации
│   └── example-app.service       # Пример сервиса
├── secrets.encrypted/             # 🔒 Зашифрованные секреты
├── samples/                       # 💡 Примеры кода
│   └── example-app.py            # Python приложение
└── README.md                      # 📖 Этот файл

2. Концепция операций

2.1 Типичные сценарии использования

Сценарий 1: Веб-приложение с базой данных

Приложение → SecretsManager → DB пароль из /run/secrets/db_password

Сценарий 2: API сервис с внешними интеграциями

API сервис → SecretsManager → API ключи из /run/secrets/
                                      ├── stripe_secret_key
                                      ├── openai_api_key
                                      └── slack_webhook_url

Сценарий 3: CI/CD пайплайн

Pipeline → SecretsManager → Ключи для развертывания

2.2 Роли пользователей

  • Системный администратор: Установка и настройка системы
  • Разработчик приложений: Интеграция секретов в код
  • DevOps инженер: Автоматизация развертывания
  • Оператор безопасности: Мониторинг и аудит

3. Установка и настройка

3.1 Системные требования

Минимальные требования:

  • Linux с systemd (Ubuntu 18.04+, RHEL 7+)
  • GPG 2.2+
  • 100 MB свободного места
  • Root доступ для установки

Рекомендуемые:

  • Ubuntu 20.04+ или RHEL 8+
  • 1 GB RAM
  • SSD хранилище

3.2 Быстрая установка (5 минут)

Предусловия

  • Root доступ к системе
  • Интернет для загрузки пакетов
  • GPG не установлен (будет установлен)

Процедура установки

Шаг 1: Установка зависимостей

sudo apt update && sudo apt install -y gnupg systemd

Шаг 2: Создание GPG ключа

gpg --full-generate-key
# Выберите:
# - Тип ключа: RSA
# - Размер: 4096 бит
# - Идентификатор: secrets@host
# - Без пароля для автоматической работы

Шаг 3: Развертывание системы

# Копирование скриптов
sudo cp scripts/decrypt-secrets.sh /usr/local/bin/
sudo cp systemd-units/secrets-decrypt.service /etc/systemd/system/
sudo chmod +x /usr/local/bin/decrypt-secrets.sh

# Создание директорий
sudo mkdir -p /etc/secrets.encrypted
sudo chmod 700 /etc/secrets.encrypted

Шаг 4: Создание тестового секрета

echo "testpassword" | gpg --encrypt --recipient secrets@host > /etc/secrets.encrypted/test.gpg

Шаг 5: Запуск системы

sudo systemctl daemon-reload
sudo systemctl enable secrets-decrypt.service
sudo systemctl start secrets-decrypt.service

Постусловия

  • Сервис secrets-decrypt.service запущен и активен
  • Секреты расшифрованы в /run/secrets/
  • Доступен тестовый секрет /run/secrets/test

Проверка установки

# Проверка статуса сервиса
sudo systemctl status secrets-decrypt.service

# Проверка секретов
ls -la /run/secrets/
cat /run/secrets/test

4. Процедуры использования

4.1 Добавление секретов

Цель: Добавить новый секрет в систему

Предусловия:

  • Система установлена и работает
  • GPG ключ доступен
  • Root права

Шаги:

  1. Создайте секрет в файле:

    echo "my_secret_value" > /tmp/secret.txt
  2. Зашифруйте секрет:

    gpg --encrypt --recipient secrets@host /tmp/secret.txt
  3. Переместите в хранилище:

    sudo mv /tmp/secret.txt.gpg /etc/secrets.encrypted/my_secret.gpg
  4. Перезапустите сервис:

    sudo systemctl restart secrets-decrypt.service

Результат: Секрет доступен в /run/secrets/my_secret

4.2 Интеграция в приложения

Systemd сервисы

[Service]
LoadCredential=db_password:/run/secrets/db_password
LoadCredential=api_key:/run/secrets/api_key
Environment=CREDENTIALS_DIR=/run/credentials/%n
ExecStart=/usr/bin/myapp

Python приложения

from secrets_manager import SecretsManager

secrets = SecretsManager()
db_password = secrets.get_secret('db_password')
api_key = secrets.get_secret('api_key')

Через systemd credentials

[Service]
LoadCredential=db_password:/run/secrets/db_password
DynamicUser=yes
Environment=CREDENTIALS_DIR=/run/credentials/%n

В коде приложения

import os

credentials_dir = os.environ['CREDENTIALS_DIR']
with open(f'{credentials_dir}/db_password', 'r') as f:
    password = f.read().strip()

5. Устранение неисправностей

5.1 Распространенные проблемы

Сервис не запускается

Симптомы:

secrets-decrypt.service: Failed with result 'exit-code'

Решение:

# Проверить логи
sudo journalctl -u secrets-decrypt.service -n 20

# Возможные причины:
# - Отсутствует GPG ключ secrets@host
# - Повреждены .gpg файлы в /etc/secrets.encrypted/
# - Недостаточно прав доступа

Секреты не расшифровываются

Симптомы:

ls /run/secrets/  # пусто или отсутствуют ожидаемые файлы

Решение:

# Проверить GPG ключи
gpg --list-keys secrets@host

# Проверить зашифрованные файлы
ls -la /etc/secrets.encrypted/

# Ручная дешифрация для теста
gpg --decrypt /etc/secrets.encrypted/test.gpg

Приложение не может прочитать секреты

Симптомы:

Permission denied: /run/credentials/service/secret
FileNotFoundError: /run/credentials/service/secret

Решение:

# Проверить systemd конфигурацию сервиса
sudo systemctl cat your-service.service

# Проверить что LoadCredential указан правильно
grep LoadCredential /etc/systemd/system/your-service.service

# Проверить права на файлы секретов
ls -la /run/secrets/

6. Удаление системы

6.1 Когда требуется удаление

  • Переход на другую систему управления секретами
  • Вывод сервера из эксплуатации
  • Изменение требований безопасности
  • Миграция на новую версию

6.2 Процедура удаления

⚠️ Предупреждение: Операция необратима! Создайте резервную копию секретов.

Шаги:

  1. Создать резервную копию (рекомендуется):

    sudo tar -czf secrets-backup-$(date +%Y%m%d).tar.gz /etc/secrets.encrypted/
    gpg --encrypt --recipient your-email@example.com secrets-backup-*.tar.gz
  2. Остановить все зависимые сервисы:

    sudo systemctl stop secrets-decrypt.service
    sudo systemctl stop your-app.service  # все сервисы использующие секреты
  3. Удалить компоненты системы:

    # Удалить скрипты
    sudo rm /usr/local/bin/decrypt-secrets.sh
    
    # Удалить systemd unit
    sudo rm /etc/systemd/system/secrets-decrypt.service
    sudo systemctl daemon-reload
    
    # Удалить секреты
    sudo rm -rf /etc/secrets.encrypted/
    sudo rm -rf /run/secrets/
  4. Очистить GPG ключи (опционально):

    gpg --delete-secret-key secrets@host
    gpg --delete-key secrets@host
  5. Перезагрузить систему для очистки RAM:

    sudo reboot

7. Приложения

7.1 Глоссарий

Термин Определение
Секрет Конфиденциальная информация (пароль, API ключ, токен)
GPG GNU Privacy Guard - система шифрования с открытым ключом
tmpfs Виртуальная файловая система в RAM
systemd credentials Механизм безопасной передачи секретов в сервисы
DynamicUser Автоматическое создание изолированных пользователей systemd
POSIX ACL Система контроля доступа Portable Operating System Interface

7.2 Сокращения

Сокращение Расшифровка
ACL Access Control List
API Application Programming Interface
GPG GNU Privacy Guard
RAM Random Access Memory
UUID Universally Unique Identifier

7.3 Индекс


Документация

  • 📖 Полное руководство администратора: docs/unix-secrets-manager-guide.md
  • ⚙️ Документация скриптов: scripts/README.md
  • 🚀 Пример с Telegram ботом: examples/telegram-bot/README.md

Примеры использования

  • 🐳 Docker контейнеры: examples/telegram-bot/

    • Telegram бот с 50+ секретами
    • Полная интеграция с Docker Compose
    • Health checks и monitoring
  • 🔧 Systemd сервисы: systemd-units/

    • Примеры конфигурации systemd
    • LoadCredential интеграция

Лицензия

Этот проект распространяется под лицензией MIT и может свободно использоваться в коммерческих и некоммерческих целях.


Unix Secrets Manager v1.0.0 - Enterprise-grade управление секретами на Linux 🎉

About

How to cook secrets

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages