Обновить readme.md
This commit is contained in:
1 parent
b2447b6ea8
commit
7836e16daf
1 file changed
+75
-29
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user