Обновить 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
|
||||
|
||||
## 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
|
||||
|
||||
|
||||
Reference in new issue
Block a user