Организация базовой безопасности Node.js сервиса (PostgreSQL + Redis)

1. Аутентификация и авторизация

JWT + Refresh токены:

Access Token → короткое время жизни (15 мин)
Refresh Token → длинное время жизни (7–30 дней), хранить в Redis

  • Используй bcrypt (rounds: 12+) для хеширования паролей
  • Храни refresh-токены в Redis с TTL, при логауте — инвалидируй
  • Реализуй Role-Based Access Control (RBAC)

2. Защита API

Rate Limiting → express-rate-limit + redis (общий лимит на IP)
Helmet.js → HTTP-заголовки безопасности
CORS → строгий whitelist origins
Input Validation → zod / joi / class-validator
SQL Injection → parameterized queries (pg / TypeORM / Prisma)

3. PostgreSQL

  • Создавай отдельного пользователя БД с минимальными правами (только нужные таблицы)
  • Никогда не используй postgres superuser в приложении
  • Включи SSL соединение (ssl: { rejectUnauthorized: true })
  • Шифруй чувствительные данные (PII) — pgcrypto или на уровне приложения
  • Регулярные бэкапы + мониторинг логов
CREATE USER app_user WITH PASSWORD 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

4. Redis

  • Обязательно ставь пароль (requirepass в redis.conf)
  • Отключи опасные команды: FLUSHALLCONFIGDEBUG
  • Redis не должен быть доступен публично — только внутренняя сеть
  • Используй TLS если Redis на отдельном сервере
  • Устанавливай TTL для всех ключей (никаких бессрочных сессий)
# redis.conf
requirepass your_strong_password
bind 127.0.0.1
rename-command FLUSHALL ""
rename-command CONFIG ""

5. Переменные окружения и секреты

  • Никогда не хардкоди секреты в коде
  • Используй .env + dotenv в разработке, в проде — секреты из Vault / AWS Secrets Manager / K8s Secrets
  • Добавляй .env в .gitignore
  • Валидируй переменные окружения при старте (zod/envalid)

6. Защита от атак

АтакаЗащита
SQL InjectionParameterized queries, ORM
XSShelmet CSP, sanitize input/output
CSRFSameSite cookies, CSRF-токены
Brute ForceRate limiting, временные блокировки в Redis
DoSRate limiting, payload size limit (express.json({ limit: '10kb' }))
Session HijackingSecure/HttpOnly cookies, HTTPS only

7. HTTPS и транспорт

  • Только HTTPS в продакшне (Let’s Encrypt / certbot)
  • HSTS заголовок (Strict-Transport-Security)
  • Используй nginx как reverse proxy перед Node.js — не открывай Node напрямую

8. Зависимости и код

npm audit          # проверка уязвимостей
npm audit fix      # автоисправление
  • Регулярно обновляй зависимости
  • Используй Snyk или Dependabot для автоматического мониторинга
  • Следи за CVE для используемых пакетов

9. Логирование и мониторинг

  • Логируй все попытки входа (успешные и неуспешные)
  • Не логируй пароли, токены, PII данные
  • Используй Winston / Pino + централизованный сбор логов (ELK / Grafana Loki)
  • Настрой алерты на аномальную активность

10. Минимальный чеклист перед деплоем

  •  Все секреты в переменных окружения
  •  HTTPS включён
  •  Rate limiting настроен
  •  Helmet.js подключён
  •  npm audit — 0 критических уязвимостей
  •  PostgreSQL пользователь с минимальными правами
  •  Redis защищён паролем и закрыт снаружи
  •  Логирование настроено
  •  Входные данные валидируются