Моніторинг безпеки сайту
Моніторинг безпеки — постійне спостереження за ознаками атак, вразливостей та несанкціонованих змін. Складається з кількох шарів, кожен із яких виявляє різні класи загроз.
Рівні мониторинга безпеки
1. WAF (Web Application Firewall) — фільтрація шкідливих запитів до потрапляння у додаток.
- Cloudflare WAF, AWS WAF, ModSecurity (self-hosted)
- Блокує SQL injection, XSS, CSRF, path traversal
2. Аналіз журналів — аналіз журналів доступу на підозрілі шаблони.
3. Моніторинг цілісності файлів (FIM) — виявлення змін файлів.
4. Сканування залежностей — моніторинг CVE в використаних бібліотеках.
5. Час роботи + частота помилок — непрямі ознаки атаки (DDoS, brute force).
Cloudflare WAF + события безпеки
// Отримання подій безпеки через Cloudflare API
const events = await fetch(
`https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/security/events?per_page=50`,
{
headers: {
'Authorization': `Bearer ${CF_API_TOKEN}`,
'Content-Type': 'application/json',
},
}
).then(r => r.json());
// Аналіз: топ атакуючих IP-адрес
const ipCounts = events.result.reduce((acc, e) => {
acc[e.clientIP] = (acc[e.clientIP] || 0) + 1;
return acc;
}, {});
ModSecurity + Nginx
# /etc/nginx/modsec/modsecurity.conf
SecRuleEngine On
SecRequestBodyAccess On
SecRule ARGS "@detectSQLi" "id:1000,deny,status:403,msg:'SQL Injection'"
SecRule ARGS "@detectXSS" "id:1001,deny,status:403,msg:'XSS Attack'"
Моніторинг цілісності файлів за допомогою AIDE
# Встановлення AIDE
sudo apt install aide
# Ініціалізація бази даних (після встановлення, до очікуваних змін)
sudo aide --init
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Щоденна перевірка (cron)
sudo aide --check | mail -s "AIDE Report" [email protected]
Моніторинг через Fail2ban
# /etc/fail2ban/jail.local
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 3600
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 86400
Сканування залежностей
# GitHub Actions: щотижневий аудит залежностей
name: Security Audit
on:
schedule:
- cron: '0 9 * * 1' # Кожного понеділка
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm audit --audit-level=high
- run: npx snyk test --severity-threshold=high
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
Оповіщення про аномалії
# Скрипт аналізу журналів на brute force
import re
from collections import defaultdict
def detect_brute_force(log_file, threshold=50):
ip_attempts = defaultdict(int)
with open(log_file) as f:
for line in f:
if '/wp-login.php' in line or '/admin/login' in line:
ip = re.search(r'(\d+\.\d+\.\d+\.\d+)', line)
if ip:
ip_attempts[ip.group(1)] += 1
return {ip: count for ip, count in ip_attempts.items() if count >= threshold}
Налаштування базового моніторингу безпеки (Cloudflare WAF + Fail2ban + dependency alerts) — 1–2 дні.







