Backlog: уточнить SSH-задачу, завести очистку устаревшего инвентаря
This commit is contained in:
@@ -20,7 +20,6 @@ _(sec-ревью)_ — три независимых security-ревью на м
|
||||
- [Закрыть admin API Caddy](caddy-admin-api-localhost.md) — `admin :2019` слушает всю docker-сеть; любой контейнер может переписать маршрутизацию и снять forward_auth _(sec-ревью)_
|
||||
- [Убрать группу `docker` у сервисных пользователей](service-users-docker-group.md) — `docker` = root на хосте; ~все app-аккаунты фактически root, изоляция «юзер на сервис» обнуляется _(sec-ревью)_
|
||||
- [Изолировать/запаролить сессионный redis Authelia](authelia-redis-isolation.md) — стор сессий SSO в общей сети без пароля; запись в него = hijack SSO всех сервисов _(sec-ревью)_
|
||||
- [Запретить SSH-вход под root](ssh-disable-root-login.md) — `permit_root_login: yes` на открытом 22; root — цель брутфорса, компрометация ключа = uid 0 _(sec-ревью)_
|
||||
- [Алерты на проблемные контейнеры](container-alerts.md) — wakapi крутился в restart-loop несколько дней незамеченным; healthcheck в compose + алерты Netdata
|
||||
- [Рестарт контейнеров через handlers](ansible-handlers-restart.md) — `state: restarted` выполняется безусловно на каждом прогоне (лишний downtime), нет ни одного handler _(ансибл-ревью)_
|
||||
|
||||
@@ -32,6 +31,8 @@ _(sec-ревью)_ — три независимых security-ревью на м
|
||||
- [Закрыть calibre-web forward-auth](calibre-forward-auth.md) — домен без forward_auth, защита на встроенной авторизации с дефолтом `admin/admin123` _(sec-ревью)_
|
||||
- [Понизить log level Authelia до info](authelia-log-level.md) — `debug` в проде утекает детали аутентификации и OIDC через `docker logs`/dozzle _(sec-ревью)_
|
||||
- [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_
|
||||
- [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(sec-ревью)_
|
||||
- [Убрать устаревший инвентарь после миграции](stale-inventory-cleanup.md) — `production.yml` указывает на мёртвый YC-хост, живой — `timeweb.yml`; имена инвертированы
|
||||
- [Gitea runner on-demand в Yandex Cloud](gitea-runner-on-demand.md) — раннер активен только во время сборки; webhook→Cloud Function стартует ВМ, probe/decide гасят по idle; экономия ~95%
|
||||
- [Синхронизация общих Ansible-ролей](shared-roles-sync.md) — `owner`/`eget`/`secrets` дублируются между репозиториями и дрейфуют; канон в ansible-shared + rsync-таски invoke
|
||||
- [Уведомления о размере приложений и диске](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_
|
||||
|
||||
@@ -1,16 +1,26 @@
|
||||
# Запретить SSH-вход под root
|
||||
|
||||
**Приоритет:** высокий
|
||||
**Приоритет:** средний
|
||||
|
||||
`playbook-system.yml:34` переопределяет дефолт роли на
|
||||
`security_ssh_permit_root_login: "yes"`. Парольная аутентификация выключена (вход
|
||||
только по ключу), но root — единственный аккаунт, который брутфорсят все боты на
|
||||
открытом 22/tcp, и компрометация ключа сразу даёт uid 0 без следа sudo. Деплой
|
||||
идёт под отдельным непривилегированным пользователем с become (`production.yml`),
|
||||
root-логин для Ansible не нужен. Поставить `"no"`, либо `prohibit-password`, если
|
||||
root-ключ нужен для аварийного доступа (то же поведение по ключу, но явный запрет
|
||||
пароля на будущее).
|
||||
`security_ssh_permit_root_login: "yes"` → `PermitRootLogin yes`. Это управляет
|
||||
**только** тем, пускать ли root по SSH, и не имеет отношения к паролю: вход по
|
||||
паролю уже запрещён отдельной директивой `PasswordAuthentication no` (дефолт роли
|
||||
`security_ssh_password_authentication: "no"`, не переопределён). То есть брутфорса
|
||||
пароля тут нет — остаётся то, что root **явно разрешён к входу по ключу**.
|
||||
|
||||
Из sec-ревью (fable, 2026-07-13).
|
||||
Почему всё равно стоит закрыть:
|
||||
|
||||
Связано: playbook-system.yml, production.yml, galaxy.roles/geerlingguy.security.
|
||||
- **Наименьшие привилегии.** Ansible ходит под непривилегированным `major` с
|
||||
`become` (`production.yml`/`timeweb.yml`), root-логин для деплоя не нужен вовсе.
|
||||
- **Defense-in-depth.** Если `PasswordAuthentication` когда-нибудь вернётся в
|
||||
`yes` (правка, `Match`-блок, чужая роль), `PermitRootLogin yes` тут же откроет
|
||||
root по паролю. `prohibit-password` держит root key-only независимо.
|
||||
|
||||
Рекомендация: поставить `"no"` (root по SSH недоступен, деплой под `major` не
|
||||
страдает). Если нужен аварийный вход root по ключу — `"prohibit-password"`.
|
||||
|
||||
Из sec-ревью (fable, 2026-07-13); мотивировка уточнена после проверки конфига.
|
||||
|
||||
Связано: playbook-system.yml, production.yml, timeweb.yml,
|
||||
galaxy.roles/geerlingguy.security.
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Убрать устаревший инвентарь после миграции на Timeweb
|
||||
|
||||
**Приоритет:** средний
|
||||
|
||||
После переезда на Timeweb (cutover 2026-05-23) имена инвентарей инвертировались:
|
||||
|
||||
- `timeweb.yml` → `92.53.105.41` — **живой** хост, именно его использует `inv pl`
|
||||
(`tasks.py:12` `HOSTS_FILE = "timeweb.yml"`).
|
||||
- `production.yml` → `158.160.46.255` — **мёртвый** старый YC-хост (ВМ
|
||||
остановлена). При этом AGENTS.md всё ещё называет `production.yml` рабочим
|
||||
инвентарём.
|
||||
|
||||
Ловушка: любой прямой запуск `ansible-playbook -i production.yml ...` (как в
|
||||
примерах AGENTS.md) уедет на несуществующий/чужой хост. Плюс `production.yml`
|
||||
содержит `application_dir`/`mount_external_storage`, которых нет в `timeweb.yml` —
|
||||
простой заменой файла эти переменные потеряются.
|
||||
|
||||
Сделать: сделать `production.yml` актуальным инвентарём Timeweb-хоста (перенести
|
||||
недостающие host-vars), удалить `timeweb.yml`, поправить `HOSTS_FILE` в `tasks.py`
|
||||
и примеры в AGENTS.md. Согласуется с задачей
|
||||
[ansible-inventory-hostvars](ansible-inventory-hostvars.md) (host-специфику в
|
||||
`host_vars/server.yml`, хост в именованную группу) — логично делать вместе.
|
||||
|
||||
Связано: production.yml, timeweb.yml, tasks.py, AGENTS.md,
|
||||
docs/drafts/timeweb-migration-log.md, ansible-inventory-hostvars.
|
||||
Reference in New Issue
Block a user