Безопасность
Безопасность API
SHM имеет встроенные системы безопасности, такие как:
- Общее ограничение количества запросов в API за определенное время (RPS)
- Ограничения на количество запросов в методы аутентификации
- Ограничения на количество запросов в методы регистрации клиентов и их услуг
- Проверка токенов Telegram и многие другие
Лимиты
При превышении одного из следующих лимитов пользователь получит ошибку HTTP: 429 Too Many Requests.
Лимиты накладываются на IP-адрес пользователя.
Общие ограничения HTTP запросов в API
- 1 запрос в секунду. Допускается кратковременное превышение этого лимита до 5 запросов в секунду.
Эти лимиты не распространяются на внутренние IP-адреса (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
Внутренние лимиты SHM
- Неуспешная аутентификация пользователя: 5 за 3 минуты (блокировка на 3 минуты)
- Регистрация пользователя: 5 за час (блокировка на час)
- Регистрация услуги пользователем: 5 за 10 минут (блокировка на 10 минут)
- Неуспешная аутентификация Telegram: 5 за час (блокировка на час)
Для работы этих ограничений необходимо убедиться, что запущен Redis.
Блокировка IP-адресов пользователей на сервере
Вы можете настроить автоматическую блокировку IP-адресов на уровне сервера с помощью fail2ban. Это обеспечит дополнительную защиту от злоупотреблений API.
Настройка логирования
1. Настройка Docker Compose
Раскомментируйте в файле docker-compose.yml строки для логирования API контейнера:
services:
api:
# ... другие настройки ...
logging:
driver: syslog
options:
syslog-address: "udp://127.0.0.1:514"
tag: "shm-api"
2. Настройка rsyslog
Создайте конфигурацию rsyslog для приема логов от Docker:
# Создайте файл /etc/rsyslog.d/49-docker.conf
sudo tee /etc/rsyslog.d/49-docker.conf << 'EOF'
# Включить UDP модуль для приема логов от Docker
module(load="imudp")
input(type="imudp" port="514")
# Шаблон для очистки JSON логов от Docker префиксов
$template SHMAPITemplate,"%msg:2:$%\n"
# Направить логи SHM API в отдельный файл
if $programname == 'shm-api' then /var/log/shm-api.log;SHMAPITemplate
& stop
EOF
# Создайте директорию для логов
sudo mkdir -p /var/log
sudo touch /var/log/shm-api.log
sudo chmod 644 /var/log/shm-api.log
# Перезапустите rsyslog
sudo systemctl restart rsyslog
Настройка fail2ban
1. Установка fail2ban
Ubuntu/Debian:
sudo apt update
sudo apt install fail2ban
2. Создание фильтра
Создайте фильтр для обработки JSON логов SHM API:
sudo tee /etc/fail2ban/filter.d/shm-api-json-429.conf << 'EOF'
# Fail2Ban filter for SHM API JSON format logs
[Definition]
failregex = ^.*"remote_addr"\s*:\s*"<HOST>".*"status"\s*:\s*429.*$
ignoreregex = ^.*"remote_addr"\s*:\s*"<HOST>".*"status"\s*:\s*(?:200|201|202|204|301|302|304).*$
datepattern = "time"\s*:\s*"%%Y-%%m-%%dT%%H:%%M:%%S
EOF
3. Создание jail конфигурации
Создайте jail для автоматической блокировки:
sudo tee /etc/fail2ban/jail.d/shm-api-json-429.conf << 'EOF'
# SHM API protection jail
[shm-api-json-429]
enabled = true
port = http,https
filter = shm-api-json-429
logpath = /var/log/shm-api.log
maxretry = 5
findtime = 300
bantime = 3600
ignoreip = 127.0.0.1/8 ::1 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
action = iptables-multiport[name=shm-api-429, port="http,https", protocol=tcp]
EOF
4. Параметры блокировки
- maxretry: 5 - количество попыток до блокировки
- findtime: 300 секунд (5 минут) - период анализа попыток
- bantime: 3600 секунд (1 час) - время блокировки IP-адреса
Запуск и проверка
1. Запуск fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
2. Проверка статуса
# Общий статус fail2ban
sudo fail2ban-client status
# Статус конкретного jail
sudo fail2ban-client status shm-api-json-429
# Просмотр заблокированных IP-адресов
sudo fail2ban-client get shm-api-json-429 banip
3. Мониторинг
# Мониторинг логов fail2ban
sudo tail -f /var/log/fail2ban.log | grep shm-api
# Мониторинг логов API
sudo tail -f /var/log/shm-api.log
# Проверка iptables правил
sudo iptables -L f2b-shm-api-json-429 -n
Управление блокировками
Разблокировка IP-адресов
# Разблокировать конкретный IP-адрес
sudo fail2ban-client set shm-api-json-429 unbanip 192.168.1.100
# Разблокировать все IP-адреса в jail
sudo fail2ban-client unban --all
Настройка уведомлений
Для получения уведомлений о блокировках добавьте в jail конфигурацию:
[shm-api-json-429]
# ... остальные параметры ...
# Email уведомления
action = %(action_mwl)s
destemail = admin@example.com
sendername = Fail2Ban SHM API
sender = fail2ban@example.com
Логротация
Настройте ротацию логов для предотвращения переполнения диска:
sudo tee /etc/logrotate.d/shm-api << 'EOF'
/var/log/shm-api.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 syslog syslog
postrotate
/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
EOF
Рекомендации по безопасности
- Мониторинг: Регулярно проверяйте логи fail2ban и заблокированные IP-адреса
- Настройка: Корректируйте параметры
maxretry,findtimeиbantimeв зависимости от нагрузки - Whitelist: Добавляйте доверенные IP-адреса в
ignoreipдля избежания случайных блокировок - Резервное копирование: Регулярно создавайте резервные копии конфигураций fail2ban
- Обновления: Поддерживайте fail2ban в актуальном состоянии
Устранение неполадок
Проблема: Jail не запускается
# Проверка конфигурации
sudo fail2ban-client --test
# Проверка логов
sudo journalctl -u fail2ban -n 50
Проблема: IP-адрес не блокируется
# Тестирование фильтра
sudo fail2ban-regex /var/log/shm-api.log /etc/fail2ban/filter.d/shm-api-json-429.conf
# Проверка формата логов
sudo tail -5 /var/log/shm-api.log