6 KiB
Один процесс Xray и одно gRPC-соединение для строгого аудита пользователей
Задача
Строгий аудит VPnBot доказывает не только содержимое управляемого JSON-файла,
но и фактический реестр пользователей в уже работающем процессе Xray. Сейчас
узловой помощник запускает отдельную команду xray api для полного списка
inbound, затем отдельные команды списка и количества пользователей для каждого
inbound и повторяет весь проход второй раз. На узле с двенадцатью пользовательскими
inbound один строгий аудит создаёт примерно пятьдесят процессов Xray CLI и столько
же локальных gRPC-подключений; создание выполняет аудит до и после мутации.
Доказательная семантика правильна и не меняется. Ускорение должно убрать только повторный запуск процесса и подключения:
один vpnbot-xrayctl strict audit
-> один xray api vpnbot-audit-users
-> одно локальное gRPC-соединение
-> pass 1: ListInbounds + GetInboundUsers + GetInboundUsersCount
-> pass 2: ListInbounds + GetInboundUsers + GetInboundUsersCount
-> один типизированный JSON-ответ
-> прежнее сравнение managed/live и прежние digests в vpnbot-xrayctl
Инварианты
- Полнота каждого
GetInboundUsersпо-прежнему независимо проверяетсяGetInboundUsersCount. - Полный набор inbound и пользователей по-прежнему читается дважды. Любой drift между проходами даёт безопасную ошибку, а не частичный успех.
- Managed JSON, persisted confdir, systemd MainPID, process start time,
/proc/<pid>/exe, API-listener inode и capability активного отзыва остаются прежними внешними доказательствами узлового помощника. - Команда не пишет конфигурацию, не вызывает
AddUser/RemoveUser, не перезапускает Xray и не хранит результат на диске. - Пользовательские email и идентификаторы передаются только по локальному stdout между root-owned процессами. Они не попадают в журнал, manifest, pilot proof или операторский отчёт.
- Новый marker
vpnbot-live-user-audit-v1относится только к оптимизированной CLI-команде. Существующийvpnbot-active-revoke-v3остаётся обязательным security-capability и не ослабляется. - Узел без нового marker использует прежний строгий много-процессный путь. Узел, который marker заявил, но вернул некорректный ответ или сломанную команду, fail-closed завершает аудит ошибкой и не маскирует дефект fallback-ом.
Формат ответа команды
Команда возвращает JSON-контракт vpnbot-live-user-audit-v1 с двумя полными
проходами. Каждый проход содержит упорядоченный список inbound. Для каждого
inbound возвращаются tag, признак UserManager, полный protobuf-пользователь и
независимый count. Непользовательский inbound является нормальной строкой с
user_manager=false; любая иная RPC-ошибка завершает процесс ненулевым кодом.
vpnbot-xrayctl проверяет типы, точное число проходов, уникальность tag,
равенство count длине users и полное равенство двух снимков. Затем существующий
Python-код строит те же exact identities, runtime-only inbound id, managed/live
union и digests, что и до оптимизации. Контракт результата строгого аудита
остаётся vpnbot-live-user-registry-v2.
Проверка и выпуск
- Расширить третий существующий патч, сохранив ровно три файла в
patches/series. - Добавить Go unit-тест команды и включить пакет
main/commands/all/apiвscripts/test-patches.sh. - Проверять оба capability-маркера в собранных amd64-бинарниках.
- Расширить production-canary: до и после exact
RemoveUserвыполнить новую команду, доказать два прохода и точный состав пользователей, не записывая их в pilot proof. - Опубликовать candidate, дождаться CI, production-canary и byte-identical proven.
- Сначала обновить Xray на canary/парке и развернуть helper с capability-gated fallback. Только затем выпускать центральный VPnBot-снимок.
- На representative nodes сравнить старый и новый strict result по безопасным
counts/digests, измерить wall time и число
xray apiпроцессов. Финальный аудит и node-wide mutating lock не удаляются.