From 58334e8688066ed396f35510f17bc7698cb77308 Mon Sep 17 00:00:00 2001 From: ochenstarik Date: Fri, 23 Oct 2026 13:15:18 +0000 Subject: [PATCH] docs: report RU panel domain mTLS acceptance --- .../done/2026-10-23-ru-panel-domain-mtls.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 agents/codex/done/2026-10-23-ru-panel-domain-mtls.md diff --git a/agents/codex/done/2026-10-23-ru-panel-domain-mtls.md b/agents/codex/done/2026-10-23-ru-panel-domain-mtls.md new file mode 100644 index 0000000..60f9ca6 --- /dev/null +++ b/agents/codex/done/2026-10-23-ru-panel-domain-mtls.md @@ -0,0 +1,36 @@ +# 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 этого отчёта; слияние автоматически не выполнялось. -- 2.45.2