lightweight-server/agents/codex/inbox/2026-10-23-lightweight-security.md
ochenstarik-ui 9f06756cef
Some checks failed
Bash syntax / syntax (push) Failing after 11s
Bash syntax / syntax (pull_request) Failing after 2s
fix: close installer exposure and pin verified payloads
2026-10-23 12:33:19 +07:00

36 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Codex — lightweight-server: исправления по аудиту безопасности (23.10)
От: Claude, передаёт владелец. Репозиторий `git.ochenstarik.ru/ochenstarik/lightweight-server`, main `ef83559`.
Если у тебя уже есть задание владельца по этому репо — это дополнение к нему: не дублируй, сведи в одну ветку или согласуй порядок.
## Правила
- worktree от `/srv/projects/Agent projects/lightweight-server`, без клонов; одна задача — одна ветка — один PR; в main сам не вливаешь;
- существующие тесты в `tests/` не менять, проверки не ослаблять; новые тесты — на поведение из таблицы;
- **ничего не запускать на реальных серверах** (RU/DE/FI/DK) и на этой машине от root: проверки — `bash -n`, тесты, при необходимости
одноразовый контейнер/VM Ubuntu 24.04 с удалением после прогона;
- секретов в Git и логах нет; README.md и `docs/readme/README.ru.md` обновить под изменённое поведение (остальные переводы — по возможности);
- режим: дешёвые модели → два аудитора → сам проверяешь. Отчёт — `agents/codex/done/` в этом репо.
## Зачем
Серверы: RU — вход семейного VPN (3x-ui, панель только через SSH-туннель, подписки — семье), DE/FI/DK — выходы VPN и одновременно
узлы Telegram-клиента. План: `kagent/agents/claude/done/2026-10-23-vps-plan.md`. Владелец ставит серверы этими скриптами —
исправления нужны до российского сервера, в первую очередь S1–S3.
| # | Находка | Где | Серьёзность | Исправление |
|---|---|---|---|---|
| S1 | Шаг 2 по умолчанию открывает всему миру 22, 80, **2096**, 443, 40000, 63636. 2096 — порт подписок 3x-ui по умолчанию, поэтому «приватный режим» шага 6 не закрывает подписки; 40000/63636 открыты без сервиса | `server-2.sh:138`, `user-3.sh:491` | высокая | по умолчанию только SSH-порт и 443; остальное — явным выбором с объяснением |
| S2 | Приватный режим панели — только правило UFW, панель слушает `0.0.0.0`. Docker и чужие nftables-таблицы (узел Telegram) обходят/перекрывают UFW | `panel-warp-6.sh` `configure_xui_ports` | высокая | в приватном режиме `webListen=127.0.0.1`; проверка `ss -ltn`, что панель не на внешнем адресе |
| S3 | Панель и подписки — один переключатель | `panel-warp-6.sh:115` | средняя | раздельно: панель (по умолчанию закрыта, 127.0.0.1) и подписки (по выбору публично, случайный путь) |
| S4 | 3x-ui и Xray ставятся установщиками с `main` апстрима, без версии и контрольной суммы; `bash -n` — только синтаксис. Быстрая установка самого проекта — с GitHub `main` | `panel-warp-6.sh:4`, `vpn-5.sh:404`, README | средняя | фиксированный тег релиза + sha256; источник по выбору — Forgejo `git.ochenstarik.ru` (с RU-серверов GitHub бывает недоступен) |
| S5 | Порт 22 остаётся открытым после переноса SSH — только напечатанная подсказка | `user-3.sh:537` | средняя | после успешного входа на новый порт (подтверждение оператора) удалить правило 22 автоматически |
| S6 | Уведомление о входе: `pam_exec` в `session` срабатывает и при открытии, и при закрытии сессии (двойное «успешный вход»); отправка синхронная, до 10 с задержки входа, если api.telegram.org недоступен (RU) | `tg-4.sh` hook | низкая | выходить, если `PAM_TYPE != open_session`; отправлять в фоне (`setsid … &`) |
| S7 | WARP в шаге 6 обязателен; на RU не нужен и может не подняться — скрипт падает после установки 3x-ui | `panel-warp-6.sh` | низкая | WARP — отдельный вопрос/флаг |
| S8 | Загрузка установщиков ИИ-агентов без `--proto '=https'` (редирект может уйти на http) | `ai-agents-8.sh:158` | низкая | добавить `--proto '=https' --tlsv1.2` |
| S9 | URL подписки вставляется в конфиг curl через `printf 'url = "%s"'`: кавычка в ссылке ломает конфиг (ввод оператора) | `vpn-5.sh` | низкая | экранировать `\` и `"` или передавать URL через `--url` из файла |
| S10 | Бэкап — полный снимок ФС с секретами (БД 3x-ui, ключи хоста, токен бота), без шифрования, только локально | `backup-7.sh` | инфо | опция шифрования (age/gpg) и выгрузки на другой хост |
Рекомендация к эксплуатации (не код): на серверах VPN/узлов Telegram **не ставить шаг 8 (ИИ-агенты)** — это лишний код с правами пользователя-админа.
**Приёмка:** новые тесты в `tests/` на S1–S3, S5, S6 (рендер правил UFW/настроек 3x-ui, проверка PAM_TYPE); существующие тесты не менять; `bash -n` и все тесты PASS.
Дополнительно к приёмке: прогон шагов 2 и 6 в одноразовом Ubuntu 24.04 (контейнер с systemd или VM) — вывод `ufw status verbose`
и `ss -ltn` в отчёте: открыты только SSH-порт и 443 (+ подписки, если выбраны), панель слушает только `127.0.0.1`.