NODEDC_PLATFORM/docs/SECURITY_CHECKLIST.md

4.1 KiB
Raw Blame History

Security Checklist

Staging path and runbook: docs/STAGING_SECURITY_PLAN.md.

Network

  • Local dev compose публикует только reverse proxy port.
  • Postgres не опубликован наружу в staging/production.
  • Redis не опубликован наружу в staging/production.
  • MinIO/storage не опубликован наружу в staging/production.
  • Внутренние API не доступны напрямую извне.
  • Authentik получает X-Forwarded-Proto, X-Forwarded-For, Host через Caddy.
  • Caddy reverse proxy сохраняет HTTP/1.1/WebSocket upgrade behavior для upstream.

Authentik

  • Каждое приложение имеет отдельный Authentik Application.
  • Каждое приложение имеет отдельный Provider.
  • Для каждого приложения задана отдельная access policy.
  • Группы app access заведены отдельно от app-local ролей.
  • MFA/enrollment policy вынесены в отдельный этап.
  • 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.
  • Local runtime не отдает storage/launcher-data.json напрямую через public static route.
  • 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.
  • Local internal API token отделен от PLANE_OIDC_CLIENT_SECRET.
  • Launcher internal access API отклоняет запросы без token, с неверным token и со старым OIDC client secret.
  • Tasker internal logout API отклоняет запросы без token и со старым OIDC client secret.

Acceptance scenarios

  • Без логина Launcher отправляет в Authentik.
  • Пользователь без Task Manager app access не видит Task Manager в Launcher.
  • Пользователь без Task Manager app access получает deny в Tasker access middleware при прямом доступе.
  • Пользователь с доступом открывает Task Manager.
  • Старый Plane admin после OIDC видит старые workspace/tasks/comments.
  • Деактивированный пользователь теряет доступ.
  • Hard-deleted/annulled user теряет stale Tasker identity link и старая unlinked-сессия отзывается middleware.
  • Hard-deleted/annulled user удаляется из active Tasker workspace/project members и issue assignees.
  • Self-host Tasker workspace invite создает pending request в Launcher, а launcher-managed workspace не принимает self-service invite request.
  • Admin action появляется в audit log.
  • Повторный accept уже принятого invite отклоняется.