Files
OpenVPN-Monitoring-Simple/DOCS/Operations/IMPLEMENTATION-01-settings-validation.md
iclaoudezinandClaude Sonnet 5.5 3836049230 Docs: add operations records (SUMMARY, Hysteria chain manifest, reboot test, plans)
- DOCS/Operations: current-state SUMMARY of the ENTRY deployment (access,
  install, egress via Hysteria2, security findings and fixes, risk
  assessment, commits/backups, open items), the Hysteria chain manifest
  with an OpenVPN Monitor section, reboot test results, and the plan and
  rollout records for settings validation and privilege separation.
- Link them from README and DOCS/General/Index.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 12:59:55 +00:00

51 lines
3.8 KiB
Markdown

# Артефакт внедрения: п.1 — валидация настроек Profiler
Дата: 2026-09-30. Узел: 213.226.125.13 (Alpine, OpenRC). Приложение: `/opt/OpenVPN-Monitoring-Simple`. План: `PLAN-validation-and-privilege-drop.md`.
Коммит в репозитории приложения на узле: `05f44b9` («Profiler: validate server/PKI settings before they reach OpenVPN config»), пуш не выполнялся.
## 1. Что внедрено
| Слой | Файл | Суть |
|---|---|---|
| A | `APP_PROFILER/schemas.py` | валидаторы `SystemSettingsUpdate`, `PKISettingUpdate` (422) |
| B | `APP_PROFILER/services/validation.py` (новый), `services/generator.py` | `check_script`: скрипт только из `/etc/openvpn/scripts/`, root-owned, без записи group/other |
| C | `APP_PROFILER/services/generator.py`, `routers/server.py` | отказ при `\n`, `\r`, NUL, управляющих символах, `"`, `\`; `ValueError` → HTTP 400 |
## 2. Порядок внедрения
1. Бэкап изменяемых файлов: `/root/app-bak/p1/` (`schemas.py`, `generator.py`, `server.py`).
2. Добавлен `services/validation.py`; правки `schemas.py`, `generator.py`, `routers/server.py` (Python-патч с проверкой якорей `assert`).
3. Проверка импорта: `venv/bin/python -c "import schemas"`.
4. `rc-service ovpmon-profiler restart`.
5. Тесты (скрипт запускался на узле с локально выпущенным токеном, т.к. на учётке включена 2FA).
6. Документация: `DOCS/Changes/2026-09-30_Settings_Validation.md`, ссылки в `README.md`, `DOCS/General/Index.md`; коммит.
## 3. Доказательства (результаты тестов)
| Проверка | Результат |
|---|---|
| Круговой `PUT` текущих настроек server / pki | 200 / 200 |
| 17 вредоносных или невалидных значений | все 422 |
| 4 валидных изменения | все 200 |
| Скрипты: root 755 / group-writable / симлинк / нет файла / вне каталога / traversal / пусто | принят / отклонён / отклонён / отклонён / отклонён / отклонён / принят |
| Слой C при обходе схемы (5 инъекций) | все заблокированы, ничего не записано |
| Рендер текущих настроек против рабочего `server.conf` | идентичен |
| После тестов | настройки восстановлены и совпадают с исходными; `rc-status`: все сервисы `started` |
## 4. Откат
```sh
cd /opt/OpenVPN-Monitoring-Simple/APP_PROFILER
cp /root/app-bak/p1/schemas.py schemas.py
cp /root/app-bak/p1/generator.py services/generator.py
cp /root/app-bak/p1/server.py routers/server.py
rm services/validation.py
rc-service ovpmon-profiler restart
```
Либо `git revert 05f44b9` в репозитории.
## 5. Оговорки
- Каталога `/etc/openvpn/scripts/` по умолчанию нет (для теста создавался временно и удалён): перед включением скриптов создать `root:root 755`, файлы `755` от root.
- Валидаторы действуют на обновления; ранее сохранённые значения проверяются при рендере (слой C).
- Слой B/C защищает конфиг, но сервис по-прежнему работает от root — это закрывает пункт 2 (см. `IMPLEMENTATION-02-…` после выполнения).