69 lines
4.3 KiB
Markdown
69 lines
4.3 KiB
Markdown
# Security Checklist
|
||
|
||
Staging path and runbook: `docs/STAGING_SECURITY_PLAN.md`.
|
||
DevOps handoff: `docs/DEVOPS_SECURITY_HANDOFF.md`.
|
||
Service catalog UX rules: `docs/SERVICE_CATALOG_UX_RULES.md`.
|
||
|
||
## Network
|
||
|
||
- [x] Local dev compose публикует только reverse proxy port.
|
||
- [ ] Postgres не опубликован наружу в staging/production.
|
||
- [ ] Redis не опубликован наружу в staging/production.
|
||
- [ ] MinIO/storage не опубликован наружу в staging/production.
|
||
- [ ] Внутренние API не доступны напрямую извне.
|
||
- [x] Authentik получает `X-Forwarded-Proto`, `X-Forwarded-For`, `Host` через Caddy.
|
||
- [x] Caddy reverse proxy сохраняет HTTP/1.1/WebSocket upgrade behavior для upstream.
|
||
|
||
## Authentik
|
||
|
||
- [ ] Каждое приложение имеет отдельный Authentik Application.
|
||
- [ ] Каждое приложение имеет отдельный Provider.
|
||
- [ ] Для каждого приложения задана отдельная access policy.
|
||
- [ ] Группы app access заведены отдельно от app-local ролей.
|
||
- [ ] MFA/enrollment policy вынесены в отдельный этап.
|
||
- [x] Authentik local compose не публикует server/worker/Postgres ports напрямую.
|
||
|
||
## Launcher
|
||
|
||
- [ ] Authentik service token хранится только server-side.
|
||
- [ ] Frontend не получает service token.
|
||
- [ ] Admin endpoints требуют `nodedc:superadmin` или `nodedc:launcher:admin`.
|
||
- [ ] Все admin actions пишутся в audit log.
|
||
- [ ] Удаление пользователя реализовано как deactivate/disable, не hard delete.
|
||
- [x] Local runtime не отдает `storage/launcher-data.json` напрямую через public static route.
|
||
- [x] Local runtime требует user session для `/api/storage/data`.
|
||
|
||
## Plane
|
||
|
||
- [ ] Перед изменениями сделан backup DB/env/uploads/storage.
|
||
- [ ] Существующий Plane user не пересоздается.
|
||
- [ ] `owner_id`, `created_by`, `assignee_id`, `member_id` не меняются без отдельной миграции.
|
||
- [ ] Публичный signup отключен.
|
||
- [ ] Лишние обходные auth сценарии закрыты или явно оставлены как временные.
|
||
- [ ] OIDC login проверяет state/nonce/token.
|
||
- [ ] `authentik_sub` связан с существующим `plane_user_id`.
|
||
|
||
## Tokens and secrets
|
||
|
||
- [ ] Secrets не попадают в git.
|
||
- [ ] Access/refresh tokens не логируются.
|
||
- [ ] Session cookies имеют `secure=true` в staging/production.
|
||
- [ ] В production включены HTTPS и HSTS.
|
||
- [x] Local internal API token отделен от `PLANE_OIDC_CLIENT_SECRET`.
|
||
- [x] Launcher internal access API отклоняет запросы без token, с неверным token и со старым OIDC client secret.
|
||
- [x] Tasker internal logout API отклоняет запросы без token и со старым OIDC client secret.
|
||
|
||
## Acceptance scenarios
|
||
|
||
- [x] Без логина Launcher отправляет в Authentik.
|
||
- [ ] Пользователь без Task Manager app access видит карточку Task Manager в Launcher, но не может открыть сервис.
|
||
- [x] Пользователь без Task Manager app access получает deny в Tasker access middleware при прямом доступе.
|
||
- [ ] Пользователь с доступом открывает Task Manager.
|
||
- [ ] Старый Plane admin после OIDC видит старые workspace/tasks/comments.
|
||
- [ ] Деактивированный пользователь теряет доступ.
|
||
- [x] Hard-deleted/annulled user теряет stale Tasker identity link и старая unlinked-сессия отзывается middleware.
|
||
- [x] Hard-deleted/annulled user удаляется из active Tasker workspace/project members и issue assignees.
|
||
- [x] Self-host Tasker workspace invite создает pending request в Launcher, а launcher-managed workspace не принимает self-service invite request.
|
||
- [x] Admin action появляется в audit log.
|
||
- [x] Повторный accept уже принятого invite отклоняется.
|