Обновить readme.md

This commit is contained in:
admin committed 2026-10-13 12:30:26 +00:00
1 parent b2447b6ea8
commit 7836e16daf
1 file changed
+75 -29
+75 -29
View File
@@ -1,3 +1,9 @@
Принято, убрал полные портянки кода и оставил относительные ссылки на файлы репозитория `deploy_haproxy.sh` и `Program.cs`.
Вот финальный вариант документации:
---
# Документация проекта: Развертывание конфигурации HAProxy по событию через systemd path # Документация проекта: Развертывание конфигурации HAProxy по событию через systemd path
## 1. Архитектурное описание ## 1. Архитектурное описание
@@ -62,7 +68,7 @@ sudo chmod 750 /etc/haproxy/backup
### 2.2. Подготовка каталога SSH-ключей ### 2.2. Подготовка каталога SSH-ключей
Домашняя директория пользователя — `/var/lib/depfile`, соответственно путь к файлу доверенных ключей: `/var/lib/depfile/.ssh/authorized_keys`. Домашняя директория пользователя — `/var/lib/depfile`, путь к файлу доверенных ключей: `/var/lib/depfile/.ssh/authorized_keys`.
```bash ```bash
sudo -u depfile mkdir -p /var/lib/depfile/.ssh 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 * Исходный файл: [`deploy_haproxy.sh`](deploy_haproxy.sh)
sudo nano /usr/local/bin/deploy_haproxy.sh
```
Содержимое скрипта:
[deploy_haproxy.sh](deploy_haproxy.sh)
Назначьте права на выполнение:
```bash ```bash
sudo cp deploy_haproxy.sh /usr/local/bin/deploy_haproxy.sh
sudo chmod +x /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) ### 2.4. Настройка связки systemd (Path + Service)
Для мгновенного реагирования создаются два системных юнита.
#### Шаг 1: Юнит сервиса (`depfile-watcher.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 Description=Watch for deployment trigger file change.me
[Path] [Path]
# PathChanged срабатывает в момент, когда запись в файл завершена и дескриптор закрыт (IN_CLOSE_WRITE) # PathChanged срабатывает в момент завершения записи и закрытия дескриптора (IN_CLOSE_WRITE)
PathChanged=/var/lib/depfile/status/change.me PathChanged=/var/lib/depfile/status/change.me
Unit=depfile-watcher.service Unit=depfile-watcher.service
@@ -145,8 +141,6 @@ WantedBy=multi-user.target
#### Шаг 3: Активация и запуск монитора #### Шаг 3: Активация и запуск монитора
Примените конфигурацию и включите монитор в автозагрузку:
```bash ```bash
sudo systemctl daemon-reload sudo systemctl daemon-reload
sudo systemctl enable --now depfile-watcher.path 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-ключа ### 3.1. Генерация SSH-ключа
В командной строке (`cmd`) или PowerShell на рабочей станции: В командной строке (`cmd`) или PowerShell выполните:
```cmd ```cmd
ssh-keygen -t ed25519 -f "D:\sys\C-Sharp\deployfile\key\test_key.key" -N "" 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` — открытый ключ. * `test_key.key.pub` — открытый ключ.
### 3.2. Экспорт открытого ключа на сервер ### 3.2. Экспорт открытого ключа на сервер
Выполните команду передачи публичного ключа (потребуется однократный ввод пароля пользователя `depfile`): Выполните команду передачи публичного ключа (потребуется однократный ввод пароля `depfile`):
```powershell ```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" 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*). 1. В Visual Studio в свойствах проекта (**Build** / **Сборка**) установите платформу **x64** (или снимите флаг *Prefer 32-bit*).
2. Скомпилируйте проект в конфигурации **Release** (`D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe`). 2. Скомпилируйте проект в конфигурации **Release** (`D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe`).
@@ -226,7 +272,7 @@ depfile
--- ---
## 5. Проверка работы комплекса ## 6. Проверка работы комплекса
1. Нажмите на ярлык на рабочем столе Windows. 1. Нажмите на ярлык на рабочем столе Windows.
2. В консоли отобразится успешный статус: 2. В консоли отобразится успешный статус:
@@ -238,7 +284,7 @@ depfile
``` ```
3. Реакция сервера происходит **мгновенно** (без задержек таймера cron). Проверьте журнал выполнения сервиса: 3. Проверьте журнал выполнения сервиса на сервере (запуск происходит моментально по факту закрытия файла):
```bash ```bash
sudo journalctl -u depfile-watcher.service -n 25 --no-pager sudo journalctl -u depfile-watcher.service -n 25 --no-pager