Production hardening: host-aware install, ownership contracts, firewall safety

This commit is contained in:
2026-04-30 03:26:14 +05:00
parent 0545990968
commit c10ab1fafd
25 changed files with 190 additions and 262 deletions
+27 -1
View File
@@ -29,10 +29,20 @@
Рекомендуемый hardening:
- `NoNewPrivileges=true`
- `PrivateTmp=true`
- `UMask=0077`
- `ProtectHome=true`
- `ProtectSystem=strict`
- `ReadOnlyPaths=/etc/hysteria/config.yaml`
- `ReadWritePaths=/var/lib/hy2xs-admin /var/log/hy2xs`
- `RestrictAddressFamilies=AF_INET AF_UNIX`
- `SystemCallArchitectures=native`
- `LockPersonality=true`
Для `hysteria-server.service` также обязателен sandbox-контур:
- `ProtectSystem=strict`
- `ReadOnlyPaths=/etc/hysteria/config.yaml`
- `ReadWritePaths=/var/lib/hysteria`
- `CapabilityBoundingSet=CAP_NET_BIND_SERVICE`
Важно:
- HY2XS admin не должен запускаться как часть unit Hysteria
@@ -48,7 +58,23 @@
IPv4-only policy:
- использовать `table ip`, а не `table inet`;
- IPv6 правила не добавлять;
- UI-порт разрешать только с локального bind-host.
- UI работает только на `127.0.0.1` в production baseline.
## Firewall modes
`HY2XS_FIREWALL_ENABLED=true`:
- orchestrator управляет baseline nftables.
`HY2XS_FIREWALL_ALLOW_TAKEOVER=false`:
- safe default.
- существующий не-HY2XS `/etc/nftables.conf` блокирует install/reconfigure (fail-fast).
`HY2XS_FIREWALL_ALLOW_TAKEOVER=true`:
- явный destructive takeover.
- использовать только после ручной проверки хоста.
`HY2XS_FIREWALL_ENABLED=false` или `--skip-firewall`:
- оператор полностью управляет firewall вручную.
После staged-проверки можно включать default policy `drop`.
+4 -2
View File
@@ -39,13 +39,15 @@
/etc/hysteria/post-install.env
```
Оба файла должны иметь права `0600`.
`/etc/hy2xs/hy2xs.env` и `/etc/hysteria/post-install.env` должны иметь права `0600 root:root`.
`/etc/hysteria/config.yaml` должен иметь права `0640 hysteria:hy2xs-admin` (UI только читает).
## Минимальный набор переменных
### Deploy / package
- `DEPLOY_TARGET_OS`
- `DEPLOY_TIMESTAMP`
- `DEPLOY_TIMESTAMP` (last apply timestamp)
- `PACKAGE_NAME`
- `PACKAGE_BUILD_ID`
- `PACKAGE_VERSION`
+3 -1
View File
@@ -25,7 +25,7 @@
3. bundled HY2XS admin раскладывается локально из пакета
4. создаются нужные каталоги
5. создаются systemd unit-файлы
6. создаются `hy2xs.env` и `post-install.env` с правами `0600`
6. создаются `hy2xs.env` и `post-install.env` с правами `0600 root:root`
7. baseline firewall применяется корректно через staged mode
8. SSH остаётся доступным
9. `reconfigure --dry-run` выводит план изменений
@@ -53,6 +53,8 @@
18. пароль admin и `con_pass` не перезаписываются при рестарте `hy2xs-admin`
19. остановка/рестарт UI не останавливает `hysteria-server`
20. traffic accounting/kick ориентируются на systemd status, а не на SQLite `HYSTERIA2_ENABLE`
21. `/etc/hysteria/config.yaml` имеет `0640 hysteria:hy2xs-admin`
22. `hy2xs-admin` может читать `/etc/hysteria/config.yaml`, но не может писать
## D. Negative tests
+24
View File
@@ -51,6 +51,30 @@ nft list ruleset
cat /etc/hysteria/post-install.env
```
Проверка логов через journald:
```bash
journalctl -u hysteria-server -n 100 --no-pager
journalctl -u hy2xs-admin -n 100 --no-pager
```
## Auth endpoint fail checklist
```bash
systemctl status hysteria-server
systemctl status hy2xs-admin
sudo -u hy2xs-admin test -r /etc/hysteria/config.yaml
curl -sS -X POST \
-H 'Content-Type: application/json' \
--data '{"addr":"127.0.0.1:12345","auth":"invalid","tx":"0"}' \
http://127.0.0.1:8080/hui/hysteria2/auth
curl -sS \
-H "Authorization: <trafficStatsSecret>" \
http://127.0.0.1:36712/online
```
## Типовые проблемы
### Сервер установился, но UI не работает