59 lines
3.1 KiB
Markdown
59 lines
3.1 KiB
Markdown
# Безопасность
|
||
|
||
## Секреты
|
||
|
||
Секретами считаются Hysteria authentication, obfs password, URI целиком,
|
||
generated config и все backups.
|
||
|
||
- CLI не принимает URI в argv.
|
||
- Dataclass скрывает credentials из `repr()`.
|
||
- Ошибки parser не включают исходное значение.
|
||
- diff заменяет secret values на `<REDACTED>`.
|
||
- state хранит только SHA-256 source/config и безопасный endpoint label.
|
||
- Policy/URI/config/state/backups имеют `root:root 0600`, каталоги —
|
||
`root:root 0700`; `doctor` проверяет этот ограниченный набор объектов.
|
||
- subprocess вызывается массивом аргументов без shell.
|
||
|
||
После попадания действующего URI в чат, issue, shell history или journal оба
|
||
credential следует перевыпустить.
|
||
|
||
## Fail closed
|
||
|
||
До изменения production проверяются:
|
||
|
||
- policy schema;
|
||
- URI syntax и поддерживаемые параметры;
|
||
- точная версия, `with_quic` и `with_gvisor` для `stack=mixed`;
|
||
- deterministic candidate;
|
||
- `sing-box check`.
|
||
|
||
Неизвестные параметры никогда не игнорируются. Production bypass для другой
|
||
версии отсутствует.
|
||
|
||
## Anti-leak
|
||
|
||
Отдельная таблица `inet vpn_egress_guard` отклоняет forwarding с `eth1` напрямую
|
||
на `eth0`. Она не принадлежит sing-box и остаётся отдельной от динамической
|
||
таблицы `inet sing-box`.
|
||
|
||
Guard запускается до sing-box. Drop-in `sing-box.service` одновременно задаёт
|
||
requirement и ordering dependency: ошибка запуска guard блокирует sing-box.
|
||
Остановка, удаление guard unit или ручное изменение его nftables-таблицы является
|
||
security-sensitive операцией и не выполняется CLI автоматически.
|
||
|
||
Имена интерфейсов поступают из уже провалидированного policy, subprocess не
|
||
использует shell, а замена таблицы выполняется одной nft batch-транзакцией.
|
||
|
||
## Healthcheck
|
||
|
||
HTTPS healthcheck подтверждает локальную post-activation связность шлюза, но не
|
||
весь forwarded path `eth1 -> TUN -> HY2`. Он раскрывает проверочному endpoint факт
|
||
обращения с VPN egress IP. URL можно заменить внутренним контролируемым endpoint.
|
||
Отключение URL ослабляет проверку до состояния systemd.
|
||
|
||
## Ограничения URI 1.13.19
|
||
|
||
`pinSHA256` не преобразуется в `certificate_public_key_sha256`, потому что это
|
||
разные fingerprint semantics. `ech` не преобразуется без проверенного PEM/config
|
||
list adapter. Silent downgrade TLS запрещён.
|