145 lines
5.6 KiB
Markdown
145 lines
5.6 KiB
Markdown
# Безопасность модераторского сайта
|
||
|
||
## Меры безопасности
|
||
|
||
### 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"}'
|
||
```
|
||
|