nakama/SECURITY.md

145 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Безопасность модераторского сайта
## Меры безопасности
### 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. **Измените секретные ключи**:
```bash
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 файл**:
```bash
chmod 600 .env
```
- Не коммитьте .env в git
- Используйте переменные окружения в Docker
4. **Ограничьте доступ к MongoDB**:
- Используйте firewall
- Ограничьте IP адреса
- Используйте аутентификацию MongoDB
5. **Мониторинг**:
- Следите за логами безопасности
- Настройте алерты на подозрительную активность
- Регулярно проверяйте логи авторизации
## Переменные окружения для безопасности
```bash
# 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
```
## Проверка безопасности
```bash
# Проверить что пароли не возвращаются
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"}'
```