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"}'
|
|||
|
|
```
|
|||
|
|
|