50 lines
3.8 KiB
Markdown
50 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-…` после выполнения).
|