CUA-admin-guide
Это относительно подробное руководство создано для введения в курс дела системных администраторов.
Описание системы
Речь будет идти об инфраструктуре CUA (Centralized User Administration). Она представляет собой комплексная система, призванная/ориентированная на централизованное управление учетными записями сотрудников и ресурсами компании (контролируя доступ к файлам, приложениям и другим данным).
Система разработана для повышения безопасности, эффективности и удобства работы сотрудников, в особенности работающих удалённо.
С помощью VPN для защищённого соединения, CUA, будет обеспечивать безопасный доступ к необходимым для работы ресурсам.
Система также включает в себя функции мониторинга и резервного копирования, благодаря чему системные администраторы смогут быстро реагировать на неисправности и легко поддерживать систему.
Система состоит из следующих нод:
- CA node
Отвечает за создание и подпись цифровых сертификатов с использованием EasyRSA. В частности, обеспечивает управление ключами и сертификатами, необходимыми для аутентификации и шифрования в VPN-соединениях. - VPN node
Узел, через который проходит весь зашифрованный трафик от сотрудников к корпоративным ресурсам; устанавливает безопасное VPN-соединение и управляет доступом пользователей к сети компании. - Monitoring node
Предназначен для наблюдения за работой всей системы. Отслеживает состояние серверов и сервисов, предупреждает о неисправностях в инфраструктуре (алерты). - Two backup nodes (№1 and №2)
Обеспечивают резервное копирование важных данных с двух нод: CA и VPN. Таким образом гарантируют сохранность этих данных в случае сбоев или потери самих данных, позволяя восстановить данные и, тем самым, работоспособность системы после сбоев.
Проект расположен на gitlab.com в репозитории под названием cua-infrastructure-setup (это и есть название проекта): https://gitlab.com/arut_plus/cua-infrastructure-setup
- Облачный провайдер: Yandex Cloud
- Название облака: cua-cloud
- Название аккаунта: cua-account
доступ имеет (на момент сдачи проекта) только один человек: Я (создатель проекта). - Название сервисного аккаунта: cua-service-account
Компоненты инфраструктуры
Описание компонентов
CA node
На ноде разворачивается EasyRSA, который выполняет роль центра сертификации (CA), создавая и управляя инфраструктурой открытых ключей (PKI), необходимой для генерации сертификатов и ключей, которые обеспечивают аутентификацию и шифрование в OpenVPN. Всё просто.
VPN node
Ключевую функцию во всей инфраструктуре - создание защищенных частный виртуальных сетей (VPN) - выполняет VPN-нода. На нем разворачивается EasyRSA и OpenVPN, и последний выполняет роль VPN сервера.
Backup nodes
Для выполнения резервного копирования важных данных на CA и VPN нодах задействуются две (во избежание единой точки отказа) backup ноды, на которых ставится утилита rsync, запланированную работу которого обеспечивает systemd. (Также реализован самописный алертинг для бэкапов).
Monitoring node
С помощью утилит Prometheus, Alertmanager и Grafana обеспечивается мониторинг за ключевыми сервисами всех нод и алертинг, то есть, система оповещения о проблемах и сбоях в системе.
Взаимодействие компонентов
Для более легкого понимания этой “главы” рекомендую параллельно смотреть в “Схему потоков данных в CUA инфраструктуре”, которая, по сути, визуализирует описанное ниже.
В Readme указано, где можно найти изображения этих схем.
Взаимодействие CA и VPN нод
В схеме взаимодействия CA - VPN нод первый лишь отвечает на запросы второго. То есть, VPN нода отправляет запросы на подпись сертификатов CA ноде и получает от нее “ответы”. Всё их взаимодействие осуществляется с помощью ssh.
Есть два типа запросов, которые отправляет VPN нода:
- Подписание серверного сертификата
- Генерируется запрос на сертификат для сервера (
easyrsa gen-req server
) - Запрос отправляется на CA ноду по ssh с помощью библиотечной функции
Sign_Request.lib
- CA нода подписывает запрос и возвращает готовый серверный сертификат
- Генерируется запрос на сертификат для сервера (
- Подписание клиентского сертификата
- Генерируется запрос на сертификат для клиента (
easyrsa gen-req <client-ID>
) - Запрос отправляется на CA ноду по ssh с помощью библиотечной функции
Sign_Request.lib
- CA нода подписывает запрос и возвращает готовый клиентский сертификат
- Генерируется запрос на сертификат для клиента (
Взаимодействие Backup нод с CA и VPN нодами
Для удобства буду описывать взаимодействие одной из backup нод к CA и VPN нодам, ибо вторая backup нода делает абсолютно тоже самое, что и первая. Вторая нода является функциональной копией первой и нужна во избежание единой точки отказа, как я писал выше.
Здесь тоже всё взаимодействие осуществляется с помощью ssh, но в обертке rsync, то есть rsync на backup ноде использует ssh для взаимодействия с нодами CA и VPN.
В итоге, backup нода с помощью rsync (via ssh) выполняет резервное копирование важных данных с CA и VPN нод к “себе” в файловую систему.
Взаимодействие Monitoring и остальных нод
На каждой ноде запущены экспортеры метрик системы/служб, к которым “обращается” prometheus, запущенный на monitoring ноде, для получения тех самых метрик и дальнейшей их обработки, передачи другим локальным сервисам (grafana, alertmanager).
На этом взаимодействие monitoring ноды ко всем остальным нодам заканчивается, а более подробное описание системы мониторинга будет в отдельной соответствующей главе ниже.
Создание виртуальных машин. Terraform и Yandex.Cloud
Terraform выбран как IaS (Infrastructure as code) инструмент для работы с Yandex.Cloud, ибо последний официально поддерживает операции в облаке с помощью terraform. И IaS подход проще автоматизировать.
Далее последуют команды, которые позволят поднять все нужные виртуальные машины для дальнейшей развертки на них компонентов CUA инфраструктуры.
Инструкция по поднятию виртуальных машин в Yandex.Cloud с помощью Terraform
Предполагается, что вы уже авторизованы в Yandex.Cloud через Yandex аккаунт и привязали банковскую карту к платежному аккаунту Yandex.Cloud
Для начала потребуется установить yc-cli (Yandex.Cloud CLI tool) и авторизоваться по инструкции из официальной документации.
Важно
Все дальнейшие команды нужно делать, находясь в папке
~/cua-infrastructure-setup/cloud/
.
К примеру, чтобы файлauthorized_key.json
создался при экспорте именно в этой папке (этот файл нужен будетterraform
-у).
Далее нужно создать сервисный аккаунт (для работы с terraform):
Назначить сервисному аккаунту роли, необходимые для управления ресурсами Yandex.Cloud:
Экспортировать ключ сервисного аккаунта в файл authorized_key.json
:
Необходимо настроить профиль CLI (cloud-id и folder-id берутся с профиля по-умолчанию) и сменить (активировать) на настроенный:
Нужно внести следующие строки в ~/.terraformrc
для корректной работы провайдера (Yandex.Cloud):
Дальше начинается само создание виртуальных машин.
Для этого нужно инициализировать terraform (Напоминаю: в папке ~/cua-infrastructure-setup/cloud/
):
Создать нужные сети, подсети и сами ВМ (виртуальные машины):
После того, как terraform закончит свою работу, уведомив о запущенных и готовых сетях, подсетях и ВМ, нужно осуществить передачу ssh ключей на нужные ВМ (для возможности их “общения”):
На этом работа с terraform заканчивается.
Для дальнейшей работы с ВМ можно использовать команду terraform output
, которая покажет внешние IP адреса для подключения.
Дефолтный юзер на машинах будет заменен юзером под именем admin
с помощью cloud-init скрипта, поэтому для подключения к ВМ нужно будет использовать, примерно, такую команду:
Дополнительные материалы по этой главе:
Начало работы с Terraform
Метаданные виртуальной машины
Развертывание серверов
Как устроены деплой-скрипты?
Скрипты написаны на bash по соответствии с лучшими практиками bash и с использованием идиоматических конструкций (которые разъясняются комментариями в самих скриптах), характерных для bash.
- Во всех скриптах реализована обработка ошибок в виде функции в начале скрипта под названием
Error_Handler
. - В скриптах, в которых требуются запуск от имени суперпользователя, реализована проверка прав суперпользователя.
- Скриптам, поддерживающим аргументы при запуске, можно передать ключ
-h
или--help
для получения информации об использовании (usage info/help text). - Скрипты подтягивают и инициализируют глобальные переменные из env-файла
set-env.sh
. - В деплой-скриптах после запуске в самом начале запрашивается пароль для юзера с именем
admin
и устанавливается срок действия пароля в 90 дней для большей безопасности. - В деплой-скриптах реализована конфигурация правил iptables (для каждой ноды - своя).
- Запуск деплой-скриптов с помощью библиотечного скрипта
Install_Docker.lib
устанавливаетdocker
, который нужен, как минимум, для запуска экспортеров. ВInstall_Docker.lib
нет ничего особенного - просто устанавливаетdocker
, а вынесен в отдельную библиотечную функцию во избежание дублирующихся строк кода, ибо используется во всех деплой-скриптах. - Во всех деплой скриптах запускается библиотечный скрипт
Security_Configuration.lib
, который выполняет следующие операции для повышения общей безопасности системы:- Установка срока действия пароля пользователя (как было сказано выше)
- Ограничение прав доступа для конфигурационных файлов и директорий
- Установка failban и конфигурация с помощью deb пакета
fail2ban-config_1.0.deb
- Конфигурация sshd с помощью deb пакета
sshd-config_1.0.deb
- Установка iptables, iptables-persistent
- Установка rsyslog
- Установка ntp и настройка часового пояса
- Установка unattended-upgrades и конфигурация с помощью deb пакета
unattended-upgrades-config_1.0.deb
- Конфигурация sysctl с помощью deb пакета
sysctl-config_1.0.deb
Всё описанное выше повторяется во всех деплой-скриптах, поэтому в следующих главах будут описаны только те части скрипта, которые отличаются от упомянутых выше.
Развертывание компонентов на CA ноде
После подключения к CA ноде нужно перейти в директорию, где находятся все деплой-скрипты и запустить deploy-CA-node.sh
с правами суперпользователя:
Что делает скрипт deploy-CA-node.sh
?
-
Установка и настройка EasyRSA:
- После установки EasyRSA создается директория для симлинков на файлы EasyRSA (
/usr/share/easy-rsa/*
) - Инициализируется PKI
- Устанавливается конфигурационный deb пакет
easyrsa-config_1.0.deb
- Создается CA сервер
- После установки EasyRSA создается директория для симлинков на файлы EasyRSA (
-
Docker compose:
- Запускается node-exporter
Как проверить работу сервисов после деплоя?
Можно проверить состояние контейнеров:
Развертывание компонентов на VPN ноде
После подключения к VPN ноде нужно перейти в директорию, где находятся все деплой-скрипты и запустить deploy-VPN-node.sh
с правами суперпользователя:
Что делает скрипт deploy-VPN-node.sh
- Установка, настройка EasyRSA и управление сертификатами:
- После установки EasyRSA создаются директории для EasyRSA и клиентских файлов
- Инициализируется PKI и генерируется запрос на серверный сертификат
- Запрос подписывается на CA сервере и возвращается готовый серверный сертификат. Это делается с помощью библиотечной функции
Sign_Request
, которая делает следующее:- Отправка запроса на CA сервер путем перемещения туда файла запроса на сертификат с помощью
scp
. - Подпись запроса на CA сервере удаленной командой с помощью
ssh
- Получение подписанного сертификата через
scp
- Отправка запроса на CA сервер путем перемещения туда файла запроса на сертификат с помощью
- Также генерируется секретный ключ для tls-crypt.
- Установка и конфигурация OpenVPN:
- После установки OpenVPN устанавливается конфигурационный пакет
openvpn-config_1.0.deb
- Включается IP forwarding в sysctl
- После установки OpenVPN устанавливается конфигурационный пакет
- Docker compose:
- Запускается node-exporter
- Запускается openvpn-exporter
”Что делает скрипт make-ovpn.sh
?” или “Как генерировать клиентские конфиг файлы .ovpn”
Для генерации клиентских конфиг файлов с расширением .ovpn
, которые нужны клиентам для подключения к VPN, нужно воспользоваться скриптом make-ovpn.sh
в директории ~/cua-infrastructure-setup/scripts
. Скрипт делает следующее:
- Генерация запроса на клиентский сертификат
- Подпись сертификата с помощью библиотечной функции
Sign_Request
(с которой вы уже знакомы) - Создание клиентского конфигурационного файла (.ovpn)
- Вывод в консоль пути к созданному файлу конфигурации клиента (.ovpn).
Как проверить работу сервисов после деплоя?
Можно проверить состояние контейнеров:
Можно проверить состояние служб systemd:
В случае с подключением к VPN со стороны клиентов нужно будет проверить, корректно ли работает подключение в клиентском приложении OpenVPN и меняется ли внешний IP адрес адрес после подключении к VPN в специальных сервисах:
Яндекс Интернетометр
2ip.ru
MYIP.com
А состояние клиентов можно мониторить в web интерфейсе Grafana в соответствующем дашборде.
Развертывание компонентов на Backup нодах
После подключения к одной из Backup нод нужно перейти в директорию, где находятся все деплой-скрипты и внести в файл set-env.sh
нужные конфиденциальные данные - пароли и электронную почту для алертинга (на последних строчках).
Далее просто запустить deploy-backup-node.sh
с правами суперпользователя:
Это нужно повторить и на второй Backup ноде.
Что делает скрипт deploy-backup-node.sh
- Настройка rsync:
- После установки
rsync
создаются директории для резервного копирования - Устанавливается deb пакет
rsync-systemd-setup_1.0.deb
для настройки службы и таймера systemd - Локальные IP адреса CA и VPN нод для вставляются в бэкап-скрипт
/usr/local/bin/backup.sh
с помощьюsed
- Перезагружается systemd daemon и запускается служба rsync-backup.
- После установки
- Docker compose:
- Запускается node-exporter
Как проверить работу сервисов после деплоя?
Можно проверить состояние контейнеров:
Можно проверить состояние служб systemd:
Можно вручную проверить содержимое директорий для резервного копирования, которые находятся в ~/backup_dir
.
Более подробно работа системы резервного копирования будет описана в соответствующей главе ниже.
Развертывание компонентов на Monitoring ноде
После подключения к Monitoring ноде нужно перейти в директорию, где находятся все деплой-скрипты и внести в файл set-env.sh
нужные конфиденциальные данные - пароли и электронную почту для алертинга (на последних строчках).
Далее просто запустить deploy-monitoring-node.sh
с правами суперпользователя:
Что делает скрипт deploy-monitoring-node.sh
- Docker compose:
- Запускается node-exporter
- Запускается prometheus
- Запускается alertmanger
- Запускается grafana
Как проверить работу сервисов после деплоя?
Можно проверить состояние контейнеров:
Можно проверить доступность сервисов по их web интерфейсу:
Можно проверить состояние target-ов в prometheus по ссылке http://<IP>:9090/api/v1/targets
.
Можно проверить метрики и алерты в web интерфейсах Grafana, Prometheus и Alertmanager.
Более подробно работа системы мониторинга будет описана в соответствующей главе ниже.
Система резервного копирования
Как работает?
Система резервного копирования автоматически выполняет резервное копирование важных данных с CA и VPN нод на резервную ноду, то есть, к себе в файловую систему по пути ~/backup_dir/.
Важные данные - это директория ~/easy-rsa
на CA ноде и директории ~/easy-rsa
, ~/OpenVPN-clients
на VPN ноде.
Для каждой ноды есть своя директория в ~/backup_dir
: ~/backup_dir/CA_node/
и ~/backup_dir/VPN_node/
.
Система использует rsync
для копирования данных и отправляет уведомления по электронной почте в случае ошибок или если размер резервной копии меньше ожидаемого.
Запуск резервного копирования происходит еженедельно по расписанию (не считая самого первого раза при запуске деплой-скрипта deploy-backup-node.sh
), настроенному в systemd timer
. Резервное копирование происходит каждое воскресенье в 13:00.
Из чего состоит?
Система резервного копирования состоит из следующих файлов:
backup.sh
: Bash скрипт, выполняющий резервное копирование с алертингом. После деплоя находится по пути/usr/local/bin/
rsync-backup.service
: Юнит-файлsystemd
, который запускает скрипт/usr/local/bin/backup.sh
rsync-backup.timer
: Таймерsystemd
, который запускаетrsync-backup.service
по расписанию.
На чем основан?
Система основана на:
rsync
: утилита для синхронизации файлов и директорий между двумя узлами. Выбранrsync
из-за своей простоты, ибо и в самой схеме резервного копирования в этой инфраструктуре нет ничего сложного - не хотелось городить что-то неоправданно сложное.systemd
: менеджер системы и служб, используемый для автоматического запуска резервного копирования по расписанию.curl
: утилита используется для отправки уведомлений по электронной почте через SMTP. Так выглядит функция вbackup.sh
, реализующая это:
Как использовать артефакты из нее?
Как я понимаю, под “артефактами” в данном контексте подразумеваются результаты резервного копирования (резервные копии) и уведомления. Вот как их использовать:
- Резервные копии:
- Резервные копии данных хранятся в директориях
~/backup_dir/CA_node
и~/backup_dir/VPN_node
. - Для восстановления данных можно использовать тот же
rsync
для копирования файлов обратно на исходные ноды.
- Резервные копии данных хранятся в директориях
- Уведомления:
- Уведомления отправляются на указанный адрес электронной почты (хранится в переменной окружения
$ALERT_EMAIL
, задаваемой в env-файлеcua-infrastructure-setup/scripts/set-env.sh
) в случае ошибок или если размер резервной копии меньше ожидаемого. - Уведомления содержат информацию о статусе выполнения резервного копирования (
exit code
/$?
), которая будет полезна для мониторинга и устранения проблем.
- Уведомления отправляются на указанный адрес электронной почты (хранится в переменной окружения
Пример использования артефактов
- Запуск резервного копирования вручную:
- Проверка статуса службы резервного копирования:
- Проверка расписания таймера:
- Восстановление данных из резервной копии:
Система мониторинга
Описание системы мониторинга как части инфраструктуры
Система состоит из следующих компонентов:
- Prometheus:
- Сбор метрик с нод и сервисов
- Хранение и обработка метрик
- Настройка алертов для уведомления о сбоях
- Alertmanager:
- Управление алертами, отправленными Prometheus
- Группировка и отправка уведомлений по электронной почте
- Экспортеры, размещенные на всех нодах:
- Сбор метрик о состоянии системы на каждой ноде. Эту задачу выполняют
node-exporter
-ы, запущенные на всех нодах, включая саму Monitoring ноду - Сбор метрик о состоянии сервисов на каждой ноде. Во всей инфраструктуре есть один такой эспортер -
openvpn-exporter
- который запущен на VPN ноде и хостит метрики OpenVPN сервера.
- Сбор метрик о состоянии системы на каждой ноде. Эту задачу выполняют
- Grafana:
- Визуализация собранных метрик с Prometheus
Алерты
Алертов всего 10:
- InstanceDown:
- Условие:
up == 0
- Время: 1 минута
- Уровень: критический
- Описание: Уведомляет, если сервис недоступен более 1 минуты.
- Условие:
- CPUIdleLow:
- Условие:
avg(irate(node_cpu_seconds_total{mode="idle"}[10m])) * 100 < 10
- Время: 15 секунд
- Уровень: предупреждение
- Описание: Уведомляет, если время простоя CPU падает ниже 10% за последние 10 минут.
- Условие:
- HighCPULoad:
- Условие:
node_load1 > 1.5
- Время: 30 секунд
- Уровень: предупреждение
- Описание: Уведомляет о высокой загрузке CPU, если средняя нагрузка за 1 минуту превышает 1.5.
- Условие:
- SwapinHigh:
- Условие:
rate(node_vmstat_pswpin[5m]) / 1024 / 1024 > 1
- Время: 15 секунд
- Уровень: предупреждение
- Описание: Уведомляет, если скорость свопинга превышает 1 МБ/с за последние 2-5 минут.
- Условие:
- HighMemoryLoad:
- Условие:
(sum(node_memory_MemTotal) - sum(node_memory_MemFree + node_memory_Buffers + node_memory_Cached)) / sum(node_memory_MemTotal) * 100 > 85
- Время: 30 секунд
- Уровень: критический
- Описание: Уведомляет о высокой загрузке памяти, если использование памяти превышает 85%.
- Условие:
- IOStatHigh:
- Условие:
100 * (1 - avg_over_time(node_filesystem_avail_bytes[1h]) / avg_over_time(node_filesystem_size_bytes[1h])) > 95
- Время: 15 секунд
- Уровень: критический
- Описание: Уведомляет, если использование диска превышает 95% за последний час.
- Условие:
- HighStorageLoad:
- Условие:
(node_filesystem_size{fstype="aufs"} - node_filesystem_free{fstype="aufs"}) / node_filesystem_size{fstype="aufs"} * 100 > 85
- Время: 30 секунд
- Уровень: критический
- Описание: Уведомляет о высокой загрузке хранилища, если использование хранилища превышает 85%.
- Условие:
- TimeOutOfSync:
- Условие:
ntp_drift_seconds > 500
- Время: 5 минут
- Уровень: предупреждение
- Описание: Уведомляет, если время не синхронизировано более чем на 500 миллисекунд за последние 5 минут.
- Условие:
- ReceivedTrafficHigh:
- Условие:
irate(node_network_receive_bytes_total[5m]) / 1024^2 / 200 * 100 > 75
- Время: 15 секунд
- Уровень: предупреждение
- Описание: Уведомляет, если входящий трафик превышает 75% за последние 15 секунд.
- Условие:
- TransmittedTrafficHigh:
- Условие:
irate(node_network_transmit_bytes_total[5m]) / 1024^2 / 200 * 100 > 75
- Время: 15 секунд
- Уровень: предупреждение
- Описание: Уведомляет, если исходящий трафик превышает 75% за последние 15 секунд.
- Условие:
- OpenVPNServiceDown:
- Условие:
openvpn_up == 0
- Время: 1 минута
- Уровень: критический
- Описание: Уведомляет, если сервис OpenVPN недоступен более 1 минуты.
- Условие:
Помощь
Если возникли какие-то проблемы - обращайтесь к администратору/создателю проекта по электронной почте: test@gmail.com