Skip to content

Security: Aleksandr-Litvinenko/Claude_code.-project-crm

Security

docs/SECURITY.md

Безопасность развёртывания

Приложение хранит проектную документацию клиентов, ключ Anthropic и токен Telegram-бота. Ниже — то, что нужно проверить перед тем, как выставить его куда-то дальше собственного ноутбука.


1. JWT_SECRET — обязательно

Токены подписываются секретом из JWT_SECRET. Если переменная не задана, код берёт запасной dev-secret-change-in-production — строку, которая лежит в открытом репозитории. С ней кто угодно собирает валидный токен на любого пользователя, включая ADMIN, и авторизация перестаёт что-либо значить.

openssl rand -hex 32

Полученное значение — в .env:

JWT_SECRET=<64 hex-символа>

docker-compose.yml передаёт переменную в контейнер бэкенда. При старте с NODE_ENV=production и незаданным секретом сервис пишет в лог явное предупреждение — если вы его видите, авторизация не защищена.

Смена секрета разлогинивает всех. Старые токены перестают проверяться, пользователи входят заново. Это единственное последствие, данные не теряются.

2. Порт Postgres

В docker-compose.yml база опубликована как 5432:5432 — то есть слушает на всех интерфейсах машины. Внутри compose-сети бэкенд ходит к базе по имени db, публикация нужна только чтобы подключиться psql с хоста.

На сервере с белым IP это означает открытый наружу Postgres. Либо закройте порт файрволом, либо привяжите его к петле:

ports:
  - "127.0.0.1:5432:5432"

Строку не меняли в репозитории намеренно: у кого-то к этому порту может ходить внешний инструмент, и тихо оборвать ему доступ хуже, чем написать здесь.

3. Ключи в переменных, а не в образе

ANTHROPIC_API_KEY, TG_BOT_TOKEN и пароль базы приходят из .env. Файл .env в .gitignore — держите его там. В образ ключи не попадают, пересборка при их смене не нужна: достаточно docker compose up -d.

Если ключ всё же утёк в коммит — перевыпустите его. Удаление файла следующим коммитом не помогает: значение остаётся в истории git навсегда.

4. Загруженные файлы

Документы лежат в томе files_data (/app/files внутри контейнера) и отдаются только через API с проверкой токена. Не подключайте эту папку напрямую к веб-серверу как статику — проверка доступа в этом случае обходится по прямой ссылке.

5. Что проверить перед выкладкой

  • JWT_SECRET задан и не равен значению из репозитория;
  • в логе бэкенда нет строки [БЕЗОПАСНОСТЬ];
  • пароль базы (DB_PASSWORD) не your_postgres_password из примера;
  • порт 5432 не смотрит в интернет;
  • .env не в git (git check-ignore .env отвечает .env);
  • приложение за HTTPS — токен ходит в заголовке Authorization и по HTTP читается любым, кто видит трафик.

There aren't any published security advisories