Границы
| Что | Как защищено |
|---|---|
| Сессия | httpOnly cookie, SameSite=Lax, Secure в production |
| Пароль | хеш на сервере, проверка постоянного времени |
| Секреты провайдеров и вебхука | конверт: свой DEK, обёрнутый KEK; KEK не в базе |
| Токены интеграций | только SHA-256 в базе, секрет показывается один раз |
| Токены агентов | хеш, срок, отзыв |
| Публичная ссылка | без токена, только чтение, пароль и срок по желанию |
| Метрики | токен в production; прокси закрывает /api/metrics снаружи |
| Read-only сокет | тип и шаг читаются varint-декодером; разрешены awareness и один syncStep1, update и syncStep2 отбрасываются |
| Приглашение | токен — bearer-секрет; email получателя проверяется до выдачи прав, внутри транзакции |
| Метаданные доски | без доступа /access отвечает 404 и не отдаёт название, организацию и visibility |
| Исходящие AI-запросы и вебхуки | только HTTPS, проверка всех DNS-адресов на каждой доставке, привязка к IP, запрет редиректов; ALLOW_PRIVATE — явное исключение |
| Комментарии | только аккаунт с доступом; ссылка-посетитель обсуждение не видит |
| Замок | координация правок, не ACL; сырой клиент с board.edit может обойти |
Что нельзя оставлять по умолчанию
REMO_KEK— 32 байта base64, хранится вне сервера и резервируется. Потеря KEK делает сохранённые ключи провайдеров нечитаемыми.NODE_ENV=production— иначе cookie неSecure; без HTTPS вход будет выглядеть сломанным.REMO_METRICS_TOKEN— иначе/metricsотвечает 404 (что лучше, чем открытые метрики).REMO_CORS_ORIGIN— конкретный origin, не*, если используете cookie.- Postgres на loopback —
POSTGRES_PORT=127.0.0.1:5432иufw. REMO_WEBHOOK_ALLOW_PRIVATE— только если действительно нужен внутренний эндпоинт.
Публичная ссылка
Ссылка — свойство доски, а не токен: она даёт только чтение и никогда не даёт экспорт или бэкап. Смена пароля закрывает все открытые браузеры. Отзыв ссылки не отзывает персональные роли.
Что стоит проверить на установке
/api/metricsснаружи отвечает 404.- Порт 1234 и 5432 не видны из интернета (
ss -ltnp). .envдоступен только пользователю сервиса.- Резервная копия KEK лежит отдельно от базы.
- Доска без доступа отвечает 404 на
/api/boards/<id>/access, без названия и организации. - Подделанный varint-кадр от viewer не меняет документ.
- Приглашение, открытое чужим аккаунтом, не выдаёт членство и остаётся доступным получателю.
- Custom AI endpoint с
[::ffff:127.0.0.1]отклоняется при сохранении.
Куда дальше
Наблюдаемость — как убедиться, что всё это работает.