nakama/SECURITY.md

145 lines
5.6 KiB
Markdown
Raw Normal View History

2025-12-08 23:42:32 +00:00
# Безопасность модераторского сайта
## Меры безопасности
### 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"}'
```