diff --git a/readme.md b/readme.md index 5ff270a..1b431b0 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,9 @@ +Принято, убрал полные портянки кода и оставил относительные ссылки на файлы репозитория `deploy_haproxy.sh` и `Program.cs`. + +Вот финальный вариант документации: + +--- + # Документация проекта: Развертывание конфигурации HAProxy по событию через systemd path ## 1. Архитектурное описание @@ -62,7 +68,7 @@ sudo chmod 750 /etc/haproxy/backup ### 2.2. Подготовка каталога SSH-ключей -Домашняя директория пользователя — `/var/lib/depfile`, соответственно путь к файлу доверенных ключей: `/var/lib/depfile/.ssh/authorized_keys`. +Домашняя директория пользователя — `/var/lib/depfile`, путь к файлу доверенных ключей: `/var/lib/depfile/.ssh/authorized_keys`. ```bash sudo -u depfile mkdir -p /var/lib/depfile/.ssh @@ -72,22 +78,14 @@ sudo chmod 600 /var/lib/depfile/.ssh/authorized_keys ``` -### 2.3. Создание скрипта развертывания +### 2.3. Размещение скрипта развертывания -Создайте исполняемый файл `/usr/local/bin/deploy_haproxy.sh`: +Скопируйте скрипт из репозитория в каталог `/usr/local/bin/`: -```bash -sudo nano /usr/local/bin/deploy_haproxy.sh - -``` - -Содержимое скрипта: - -[deploy_haproxy.sh](deploy_haproxy.sh) - -Назначьте права на выполнение: +* Исходный файл: [`deploy_haproxy.sh`](deploy_haproxy.sh) ```bash +sudo cp deploy_haproxy.sh /usr/local/bin/deploy_haproxy.sh sudo chmod +x /usr/local/bin/deploy_haproxy.sh ``` @@ -96,8 +94,6 @@ sudo chmod +x /usr/local/bin/deploy_haproxy.sh ### 2.4. Настройка связки systemd (Path + Service) -Для мгновенного реагирования создаются два системных юнита. - #### Шаг 1: Юнит сервиса (`depfile-watcher.service`) Создайте файл описания процесса: @@ -134,7 +130,7 @@ sudo nano /etc/systemd/system/depfile-watcher.path Description=Watch for deployment trigger file change.me [Path] -# PathChanged срабатывает в момент, когда запись в файл завершена и дескриптор закрыт (IN_CLOSE_WRITE) +# PathChanged срабатывает в момент завершения записи и закрытия дескриптора (IN_CLOSE_WRITE) PathChanged=/var/lib/depfile/status/change.me Unit=depfile-watcher.service @@ -145,8 +141,6 @@ WantedBy=multi-user.target #### Шаг 3: Активация и запуск монитора -Примените конфигурацию и включите монитор в автозагрузку: - ```bash sudo systemctl daemon-reload sudo systemctl enable --now depfile-watcher.path @@ -160,7 +154,7 @@ systemctl status depfile-watcher.path ``` -*(Должен быть в статусе `active (waiting)`).* +*(Должен находиться в состоянии `active (waiting)`).* --- @@ -168,7 +162,7 @@ systemctl status depfile-watcher.path ### 3.1. Генерация SSH-ключа -В командной строке (`cmd`) или PowerShell на рабочей станции: +В командной строке (`cmd`) или PowerShell выполните: ```cmd ssh-keygen -t ed25519 -f "D:\sys\C-Sharp\deployfile\key\test_key.key" -N "" @@ -177,12 +171,12 @@ ssh-keygen -t ed25519 -f "D:\sys\C-Sharp\deployfile\key\test_key.key" -N "" Будут созданы: -* `test_key.key` — приватный ключ (остается на машине оператора). +* `test_key.key` — приватный ключ (хранится строго на рабочей станции). * `test_key.key.pub` — открытый ключ. ### 3.2. Экспорт открытого ключа на сервер -Выполните команду передачи публичного ключа (потребуется однократный ввод пароля пользователя `depfile`): +Выполните команду передачи публичного ключа (потребуется однократный ввод пароля `depfile`): ```powershell type "D:\sys\C-Sharp\deployfile\key\test_key.key.pub" | ssh depfile@10.228.48.110 "cat >> /var/lib/depfile/.ssh/authorized_keys" @@ -206,15 +200,67 @@ depfile --- -## 4. Клиентское приложение C# (.NET Framework 4.8) +## 4. Настройка безопасности и разграничения прав -### 4.1. Исходный код (`Program.cs`) +### 4.1. Безопасность приватного ключа на рабочей станции (Windows NTFS) -Код утилиты запускает встроенный клиент Windows OpenSSH, автоматически обрабатывает 32/64-битные системные пути и при необходимости устанавливает OpenSSH Client. +Встроенный клиент Windows OpenSSH (`ssh.exe`) проверяет списки управления доступом (ACL) NTFS. Если к файлу ключа или каталогу имеют доступ сторонние группы (`Users`, `Everyone`), SSH прерывает выполнение с ошибкой `Permissions for '...' are too open`. -[Program.cs](Program.cs) +Выполните команду ограничения прав доступа в командной строке: -### 4.2. Сборка и создание ярлыка на рабочем столе +```cmd +:: 1. Отключаем наследование разрешений родительской папки для файла ключа +icacls "D:\sys\C-Sharp\deployfile\key\test_key.key" /inheritance:r + +:: 2. Выдаем полный доступ только текущему пользователю и учетной записи SYSTEM +icacls "D:\sys\C-Sharp\deployfile\key\test_key.key" /grant:r "%USERNAME%:F" +icacls "D:\sys\C-Sharp\deployfile\key\test_key.key" /grant:r "SYSTEM:F" + +``` + +*Для защиты всей папки `key`:* + +```cmd +icacls "D:\sys\C-Sharp\deployfile\key" /inheritance:r +icacls "D:\sys\C-Sharp\deployfile\key" /grant:r "%USERNAME%:(OI)(CI)F" +icacls "D:\sys\C-Sharp\deployfile\key" /grant:r "SYSTEM:(OI)(CI)F" + +``` + +### 4.2. Безопасность на стороне Linux-сервера + +1. **Разграничение прав на конфигурации:** +* Права `700` на `/var/lib/depfile/.ssh` и `600` на `authorized_keys` исключают несанкционированное чтение или подмену ключей. +* Директория `/etc/haproxy/backup` принадлежит `root:root` с правами `750`. Пользователь `depfile` **не имеет прав на запись и редактирование** в каталоге `/etc/haproxy/`, что делает невозможной прямую подмену боевого конфига или бэкапа из-под учетной записи развертывания. + + +2. **Ограничение SSH-сессии ключа:** +* В `/var/lib/depfile/.ssh/authorized_keys` перед публичным ключом рекомендуется добавить флаги запрета интерактивного окружения: +```text +no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAAC3NzaC... + +``` + + + + +3. **Изоляция привилегий исполнения:** +* Пользователь `depfile` является бесправной учетной записью без доступа к `sudo`. +* Замену файлов конфигурации и перезапуск службы осуществляет служба `systemd` от имени `root` исключительно после успешной валидации контрольной суммы SHA-256 и проверки синтаксиса `haproxy -c`. + + + +--- + +## 5. Клиентское приложение C# (.NET Framework 4.8) + +### 5.1. Исходный код + +* Исходный файл приложения: [`Program.cs`](Program.cs) + +Утилита автономна, не требует сторонних NuGet-библиотек, работает со штатным `ssh.exe` Windows 10/11 и производит автоматическую установку OpenSSH Client через PowerShell при первом обнаружении его отсутствия. + +### 5.2. Сборка и создание ярлыка на рабочем столе 1. В Visual Studio в свойствах проекта (**Build** / **Сборка**) установите платформу **x64** (или снимите флаг *Prefer 32-bit*). 2. Скомпилируйте проект в конфигурации **Release** (`D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe`). @@ -226,7 +272,7 @@ depfile --- -## 5. Проверка работы комплекса +## 6. Проверка работы комплекса 1. Нажмите на ярлык на рабочем столе Windows. 2. В консоли отобразится успешный статус: @@ -238,7 +284,7 @@ depfile ``` -3. Реакция сервера происходит **мгновенно** (без задержек таймера cron). Проверьте журнал выполнения сервиса: +3. Проверьте журнал выполнения сервиса на сервере (запуск происходит моментально по факту закрытия файла): ```bash sudo journalctl -u depfile-watcher.service -n 25 --no-pager