Безопасность

Ansible WSL: управление SSH-ключами через Docker и Semaphore

Ansible WSL, минимальная Docker-инфраструктура, которую я создал для поэтапного перехода на SSH-ключи на Ubuntu-серверах. Проект решает типичную проблему: миграция с парольной аутентификации на ключи по всему парку серверов без потери доступа, с возможностью перехода на Semaphore UI для дальнейшей автоматизации. Всё работает через Docker, локальная установка Ansible SSH ключи управление не требуется.

Проблема: управление SSH-ключами на масштабе

Управление SSH-ключами звучит просто, пока не делаешь это на нескольких серверах с разными пользователями, портами и конфигурациями. Одно неверное движение с PasswordAuthentication no — и ты заблокирован. Мне нужна была система, которая генерирует уникальные пары ключей по хосту и пользователю, устанавливает их идемпотентно, проверяет доступ перед отключением паролей и хранит credentials только локально.

Решение: Ansible-плейбуки в Docker-контейнерах, оркестрируемые PowerShell-скриптами для Windows/WSL. После верификации деплоя ключей весь workflow импортируется в Semaphore для веб-управления.

Архитектура и компоненты

  • Ansible-плейбуки: ssh_key_setup.yml (генерация и деплой ключей), verify.yml (тест входа по ключу + sudo), collect_host_keys.yml (сбор known_hosts)
  • Docker-исполнение: кастомный Dockerfile с Ansible, без локальной установки. Workspace монтируется для персистентности ключей
  • PowerShell-скрипты: run-docker.ps1 (setup/verify/raw), semaphore-up.ps1 (Docker Compose стек), semaphore-import-all.ps1 (массовый импорт шаблонов)
  • Интеграция Semaphore: локальный Docker Compose стек (Postgres + UI), API-импорт шаблонов с проверкой идемпотентности, очисткой orphan и dry-run
  • Безопасность: уникальные ключи по хосту/пользователю, servers.json в gitignore, проверка ключей хоста включена

Система автоимпорта в Semaphore

Скрипт semaphore-import-all.ps1 — продвинутый инструмент: сканирует директорию плейбуков, сопоставляет с существующими шаблонами Semaphore, создаёт или обновляет по необходимости. Поддерживает режим только валидации, очистку orphan с подтверждением, basename-only пути и детальные exit-коды (0 успех, 2 частичные ошибки API, 3 пропуски валидации, 4 отсутствие привязок, 5 несовпадение путей).

Практическое применение

В работе внештатного CTO я управляю инфраструктурой в разных средах. Этот тулкит родился из реальной задачи: три Ubuntu-сервера, которым нужен SSH-хардинг без даунтайма. Поэтапный подход, сначала деплой ключей, потом верификация доступа, потом отключение паролей, исключает риск блокировки при ручной ротации SSH-ключей.

Docker-исполнение означает что любой член команды с Docker может запустить плейбуки без настройки Python, Ansible или SSH локально. В сочетании с веб-UI Semaphore это даёт полный workflow управления безопасностью, доступный операционным командам.

Исходный код

Репозиторий доступен по запросу. Свяжитесь со мной для доступа. Включает Ansible-роли, Docker-конфигурацию, PowerShell-автоматизацию и интеграцию с Semaphore.

Для консультаций по безопасности инфраструктуры — более 15 лет управления серверными парками в 38 странах, 6 патентов в информационной безопасности.

FAQ

Нужна ли локальная установка Ansible?

Нет. Всё работает внутри Docker-контейнера из включённого Dockerfile. Нужны только Docker и PowerShell для вспомогательных скриптов.

Безопасно ли запускать на продакшн-серверах?

Да. Плейбуки идемпотентны, повторный запуск не пересоздаёт существующие ключи. Парольная аутентификация остаётся включённой пока вы не проверите доступ по ключу через verify-плейбук и вручную не отключите пароли.

Для чего нужен Semaphore?

Semaphore даёт веб-интерфейс для запуска Ansible-плейбуков. После проверки работы через Docker CLI можно импортировать плейбуки в Semaphore для постоянного управления с расписанием, аудит-логами и контролем доступа команды.

Как хранятся credentials?

Пароли серверов в локальном servers.json (gitignore). SSH-ключи генерируются в директорию keys/ (тоже gitignore). Ничего секретного не коммитится в репозиторий.

Илья Арестов, Внештатный CTO | Dubai Airport Free Zone (DAFZ), Dubai, UAE | Алматы, ул. Зенкова 59, Казахстан | +971-585-930-600 | https://t.me/getmonolith
Оцените статью