nakama/SECURITY.md

5.6 KiB
Raw Blame History

Безопасность модераторского сайта

Меры безопасности

1. Шифрование паролей

Пароли зашифрованы с использованием bcrypt

  • Используется bcrypt.hash() с солью 10 раундов
  • Пароли никогда не хранятся в открытом виде
  • passwordHash имеет select: false в модели User - не возвращается в API ответах

2. Защита API

Rate Limiting

  • Авторизация: 5 попыток за 15 секунд
  • Отправка кода: 1 запрос в минуту
  • Общий лимит: 100 запросов за 15 секунд

Middleware безопасности

  • Helmet - защита HTTP headers
  • XSS Protection - защита от XSS атак
  • MongoDB Sanitize - защита от NoSQL injection
  • HPP Protection - защита от HTTP Parameter Pollution
  • DDoS Protection - защита от DDoS

JWT Токены

  • Access token: 5 минут жизни
  • Refresh token: 7 дней
  • Токены хранятся в httpOnly cookies в production
  • Секретные ключи настраиваются через .env

3. Защита данных

Email не возвращается в API ответах

  • Email используется только для авторизации
  • Не включается в JWT payload
  • Не возвращается в /me и других эндпоинтах

Пароли

  • Никогда не возвращаются в ответах API
  • Хранятся только как bcrypt hash
  • Проверка через bcrypt.compare() только при входе

4. Авторизация

Двухфакторная авторизация для админов

  • Код подтверждения отправляется на email владельца (aaem9848@gmail.com)
  • Код действителен 5 минут
  • Fallback на Telegram если email не работает

Проверка ролей

  • Все эндпоинты модерации проверяют роль пользователя
  • Только moderator и admin имеют доступ
  • Владелец имеет дополнительные права

5. Валидация данных

Валидация входных данных

  • Email валидируется через validator.isEmail()
  • Пароль минимум 6 символов
  • Все данные санитизируются перед сохранением

6. Логирование безопасности

События безопасности логируются

  • Неудачные попытки входа
  • Невалидные токены
  • Попытки несанкционированного доступа
  • Все события логируются через logSecurityEvent()

7. CORS и Headers

CORS настройки

  • Настраивается через MODERATION_CORS_ORIGIN
  • Credentials включены для cookies
  • Ограниченные методы и headers

Security Headers

  • X-Frame-Options: SAMEORIGIN
  • X-Content-Type-Options: nosniff
  • X-XSS-Protection: 1; mode=block
  • Referrer-Policy: no-referrer-when-downgrade

Рекомендации для production

  1. Измените секретные ключи:

    JWT_SECRET=your_very_secure_random_string
    JWT_ACCESS_SECRET=another_secure_random_string
    JWT_REFRESH_SECRET=yet_another_secure_random_string
    
  2. Настройте HTTPS (обязательно):

    • SSL сертификат через Let's Encrypt
    • Все HTTP редиректятся на HTTPS
  3. Защитите .env файл:

    chmod 600 .env
    
    • Не коммитьте .env в git
    • Используйте переменные окружения в Docker
  4. Ограничьте доступ к MongoDB:

    • Используйте firewall
    • Ограничьте IP адреса
    • Используйте аутентификацию MongoDB
  5. Мониторинг:

    • Следите за логами безопасности
    • Настройте алерты на подозрительную активность
    • Регулярно проверяйте логи авторизации

Переменные окружения для безопасности

# JWT секреты (ОБЯЗАТЕЛЬНО измените в production!)
JWT_SECRET=your_secure_secret
JWT_ACCESS_SECRET=your_access_secret
JWT_REFRESH_SECRET=your_refresh_secret

# Email для кодов подтверждения админа
OWNER_EMAIL=aaem9848@gmail.com

# CORS (ограничьте в production)
MODERATION_CORS_ORIGIN=https://moderation.nkm.guru

# Внутренний токен бота (опционально)
INTERNAL_BOT_TOKEN=your_internal_bot_token

Проверка безопасности

# Проверить что пароли не возвращаются
curl -H "Authorization: Bearer YOUR_TOKEN" https://moderation.nkm.guru/api/moderation-auth/me

# Проверить rate limiting
for i in {1..10}; do curl -X POST https://moderation.nkm.guru/api/moderation-auth/login -d '{"email":"test@test.com","password":"wrong"}'; done

# Проверить защиту от SQL injection
curl -X POST https://moderation.nkm.guru/api/moderation-auth/login -d '{"email":{"$ne":null},"password":"test"}'