lightweight-server/agents/codex/done/2026-10-23-ru-panel-domain-mtls.md
ochenstarik 58334e8688
All checks were successful
Bash syntax / syntax (push) Successful in 19s
Bash syntax / syntax (pull_request) Successful in 20s
docs: report RU panel domain mTLS acceptance
2026-10-23 13:15:18 +00:00

36 lines
9 KiB
Markdown
Raw 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.

# RU panel via domain with mTLS — 23.10.2026
Задание CODEX-panels-via-domain-mtls.md выполнено только для RU. DE/FI/DK не посещались и не изменялись. Конфигурация домашнего proxy и доверенных сертификатов ОС не менялась; операторские файлы сохранены в согласованном защищённом каталоге. Операционная приёмка PASS; этот PR содержит только отчёт, независимый review gate сохраняется.
## Реализация
Выбран отдельный HTTPS8443 для домена подписок. Reality443 и публичные подписки2096 не изменены. Штатная панель2053 остаётся loopback; сохранены прежний длинный случайный base path, имя/пароль владельца и запасной SSH-туннель.
Обязательный клиентский TLS и проверка CRL реализованы HAProxy (`verify required`, без игнорирования ошибок сертификата); nginx за ним слушает только loopback18081 и передаёт запросы панели. Такой выбор обеспечивает именно TLS-отказ, а не страницу HTTP403 для анонимного клиента. Клиентский CA независим от Let's Encrypt; его ключ никогда не передавался на сервер. На сервер загружены только публичный CA и CRL. HAProxy использует существующий серверный Let's Encrypt, проверенный deploy-hook обновляет его после продления. Старые hooks подписок и certbot.timer сохранены.
Для owner-pc, owner-phone и owner-tablet выпущены отдельные годовые клиентские сертификаты и защищённые паролями PKCS#12. Пароли находятся в отдельных файлах. CA — долговременный, закрытый ключ и реестр отзывов остаются локально с правами0600/каталог0700. Пользовательская инструкция описывает установку на Windows/Chrome, Android и планшет, закладку, отзыв и годовое обслуживание сертификатов/CRL. Автоматической установки в ОС владельца не производилось.
TLS разрешён начиная с1.2. SNI ограничен нужным доменом. Session tickets и серверный session cache отключены, чтобы новые подключения не обходили проверку CRL через resumption. При публикации отзыва HAProxy перезапускается и закрывает действующие сессии панели; VPN/подписки это не перезапускает.
nginx добавляет HSTS, noindex/nofollow и nosniff; лимитирует запросы, сохраняет WebSocket/CSRF/Origin и перезаписывает заголовки адреса клиента. Адрес поступает по PROXYv2 только от локального HAProxy. Журнал содержит только адрес клиента и HTTP-статус, без URL, заголовков, query и секретного пути. Включены два fail2ban jail: HTTP4xx/429 и реальные failed-login записи панели; баны ограничены8443. Прежние правила защиты сохранены. UFW открывает только новый8443; backend18081, панель2053 и HTTP80 не открыты наружу.
## Проверки
- Без клиентского сертификата: curl exit56, TLS alert, HTTP000.
- С owner-pc/phone/tablet: страница входа HTTP200, нормальная проверка серверной цепочки; HSTS/noindex присутствуют. Дополнительно проверен импорт PKCS#12 для owner-pc.
- С заранее отозванным тестовым сертификатом: TLS alert, HTTP000.
- Полная процедура отзыва: отдельный одноразовый тестовый сертификат до отзыва HTTP200; локальная генерация и публикация CRL штатным операторским helper; после отзыва TLS alert/HTTP000. Все три сертификата владельца снова проверены после перезапуска и работают. Ни один сертификат владельца не отзывался.
- Через публичный mTLS выполнен обычный вход владельца. 2FA проверена на временном изолированном экземпляре того же установленного бинарного файла панели: отдельные новая тестовая БД/пользователь/TOTP, неверный код отклонён, правильный принят. Рабочая БД и 2FA владельца не изменены. Тестовый экземпляр и временный маршрут удалены из работы.
- fail2ban-regex распознал ожидаемые HTTP и failed-login fixtures; оба jail активны. Ban/unban проверен на зарезервированном тестовом адресе, правила установились; тестовые баны сняты. Рабочий адрес владельца не блокировался.
- Новый deploy-hook Let's Encrypt успешно выполнен на действующем сертификате; HAProxy активен, certbot.timer enabled. Предыдущий полноценный renewal dry-run семейной задачи уже PASS; новый ACME-заказ этой задачей не инициировался.
- После всех основных изменений: все5 подписок HTTPS200 без клиентского сертификата, ровно3 ожидаемые строки и интервал12ч; все15 профилей прошли foreign/RU egress. Никакой новый outage-тест не запускался.
- Через временный контрольный SSH-forward получена страница входа HTTP200; контрольный forward закрыт, прежние туннели не изменены.
- Финальный аудит:2053/18081 только loopback,8443 публичный;443/2096/24443/24444 сохранены. Сравнение согласованного снимка с текущими настройками и записями пользователей подтвердило отсутствие изменений рабочей панели. x-ui/nginx/HAProxy/fail2ban active; nginx/HAProxy и certbot.timer enabled. Ограниченный независимый rollback отменён после положительных проверок; root-only snapshot оставлен.
## Остаточные границы
Сервер и PKCS#12 проверены curl. Установка сертификатов и выбор их в конкретных браузерах ПК/телефона/планшета выполняются владельцем по инструкции и ещё не подтверждены им. Рабочую2FA владелец включает самостоятельно; положительная проверка2FA относится к изолированному экземпляру той же панели за тем же mTLS-прокси.
mTLS не делает открытый TCP-порт невидимым: он не допускает анонимный HTTP-доступ к панели. Подписки остаются отдельным публичным HTTPS-сервисом без mTLS. CRL и сертификаты устройств требуют годового обслуживания; инструкция явно описывает fail-closed при просроченной CRL и запрещает повторное использование потерянного ключа.
Секретные ссылки, пути, IP, UUID, ключи, пароли и PKCS#12 не включены в PR. Санитизированные mtls/auth/CRL/fail2ban/SSH/VPN/acceptance proofs сохранены в постоянном artifact bundle. CI и разрешённое независимое ревью оцениваются на точном head этого отчёта; слияние автоматически не выполнялось.