Production hardening: host-aware install, ownership contracts, firewall safety
This commit is contained in:
@@ -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`.
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 не работает
|
||||
|
||||
Reference in New Issue
Block a user