Compare commits

..

1 commit

Author SHA1 Message Date
58334e8688 docs: report RU panel domain mTLS acceptance
All checks were successful
Bash syntax / syntax (push) Successful in 19s
Bash syntax / syntax (pull_request) Successful in 20s
2026-10-23 13:15:18 +00:00

View file

@ -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 этого отчёта; слияние автоматически не выполнялось.