İzleme ve Anomali Tespiti (Monitoring) 📊
Sunucunuzda Prometheus veya Grafana gibi gelişmiş araçlar yoksa, basit Bash scriptleri ile CPU kullanımı veya Ağ trafiği anormalleştiğinde mail atmanızı sağlayabilirsiniz.
Özellikle "Gece 3'te CPU neden %100 oldu?" sorusunun cevabını yakalamak için hayati önem taşır.
⚠️ İlk Kurulumda Test Edin! Script'leri cron'a eklemeden önce manuel çalıştırıp mail/bildirim geldiğini doğrulayın:
sudo /usr/local/bin/cpu_alert.sh
1. Ön Gereksinim: Mail Kurulumu 📬
Scriptlerin çalışması için sunucunun mail atabilmesi gerekir.
# Basit mail client kurulumu
sudo apt install mailutils -y
# Test et
echo "Test mail" | mail -s "Test" admin@example.com
Not: Eğer sunucu mail atamıyorsa (Port 25 kapalıysa), aşağıda anlatılan Telegram yöntemini kullanın.
2. CPU Anomali Alarmı 🚨
Bu script, CPU kullanımı belirlediğiniz eşiği (örn: %80) geçerse size mail atar ve log tutar.
Dosya: /usr/local/bin/cpu_alert.sh
#!/bin/bash
# cpu_alert.sh - CPU Spike Monitor
THRESHOLD=80
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print int($2)}')
LOG_FILE="/var/log/cpu_alerts.log"
EMAIL="admin@example.com"
if [ "$CPU_USAGE" -gt "$THRESHOLD" ]; then
TOP_PROCESS=$(ps aux --sort=-%cpu | head -6)
MESSAGE="⚠️ CPU ALERT: Sunucu kullanımı %$CPU_USAGE seviyesinde!\n\nDetaylar:\n$TOP_PROCESS"
echo -e "$MESSAGE" | mail -s "CPU Alert - $(hostname)" "$EMAIL"
echo "$(date): CPU $CPU_USAGE%" >> "$LOG_FILE"
fi
Kurulum:
sudo chmod +x /usr/local/bin/cpu_alert.sh
echo "*/5 * * * * root /usr/local/bin/cpu_alert.sh" | sudo tee /etc/cron.d/cpu-alert
3. Network Anomali Alarmı (DDoS Tespiti) 🌐
netstat yerine modern ve hızlı ss komutunu kullanıyoruz.
Dosya: /usr/local/bin/network_alert.sh
#!/bin/bash
# network_alert.sh - Outbound Connection Monitor
# Eşik değer: 100 bağlantıdan fazlası şüpheli
THRESHOLD=100
LOG_FILE="/var/log/network_alerts.log"
EMAIL="admin@example.com"
# Loopback hariç aktif bağlantıları say (Hızlı yöntem)
CONNECTIONS=$(ss -tunap | grep ESTAB | grep -v '127.0.0.1' | wc -l)
if [ "$CONNECTIONS" -gt "$THRESHOLD" ]; then
# Bağlantı detaylarını al
DETAILS=$(ss -tunap | grep ESTAB | awk '{print $6}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10)
echo "⚠️ NETWORK ALERT: $CONNECTIONS adet aktif bağlantı tespit edildi!" | \
mail -s "Network Anomaly - $(hostname)" "$EMAIL"
echo "$(date): $CONNECTIONS connections" >> "$LOG_FILE"
echo "$DETAILS" >> "$LOG_FILE"
fi
Kurulum:
sudo chmod +x /usr/local/bin/network_alert.sh
echo "*/5 * * * * root /usr/local/bin/network_alert.sh" | sudo tee /etc/cron.d/network-alert
4. Disk ve Memory Alarmları 💾🧠
Disk dolarsa sunucu durur, RAM dolarsa OOM Killer servisleri öldürür.
Dosya: /usr/local/bin/disk_alert.sh
#!/bin/bash
THRESHOLD=85
USAGE=$(df / | tail -1 | awk '{print int($5)}')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
df -h | mail -s "⚠️ Disk Alert: %$USAGE dolu - $(hostname)" admin@example.com
fi
Dosya: /usr/local/bin/memory_alert.sh
#!/bin/bash
THRESHOLD=90
USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
free -h | mail -s "⚠️ Memory Alert: %$USAGE - $(hostname)" admin@example.com
fi
(Bunları da cron'a eklemeyi unutmayın!)
5. Alternatif: Telegram Bildirimi 📱
Mail ile uğraşmak istemiyorsanız Telegram Botu kullanın.
# Telegram fonksiyonu (Scriptlerinizde mail komutu yerine bunu kullanın)
send_telegram() {
BOT_TOKEN="123456:ABC-xyz..."
CHAT_ID="987654321"
MESSAGE="$1"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" \
-d parse_mode="HTML" > /dev/null
}
6. Log Rotation (Logların Şişmesini Önleme) 🔄
Log dosyaları diski doldurmasın diye rotasyon ekleyelim.
Dosya: /etc/logrotate.d/security-alerts
/var/log/cpu_alerts.log
/var/log/network_alerts.log
{
weekly
rotate 4
compress
missingok
notifempty
}
7. Hızlı Durum Kontrol Scripti (Security Status) 🚀
Tek komutla sunucunun genel sağlık ve güvenlik rontgeni.
Dosya: /usr/local/bin/security_check.sh
#!/bin/bash
# security_check.sh - Genel Bakış
echo "=== 🛡️ GÜVENLİK KONTROLÜ: $(date) ==="
echo -e "\n[1] Bekleyen Kritik Güncellemeler:"
apt list --upgradable 2>/dev/null | grep -i security || echo "Temiz."
echo -e "\n[2] Son Başarısız SSH Denemeleri:"
grep "Failed password" /var/log/auth.log | tail -5 || echo "Log bulunamadı."
echo -e "\n[3] Root Olarak Çalışan Docker Konteynerleri:"
if command -v docker &> /dev/null; then
docker ps --quiet | xargs -I {} docker inspect {} --format '{{.Name}}: User={{.Config.User}}' | grep -E "User=$|User=root" || echo "Yok (Güvenli)."
else
echo "Docker kurulu değil."
fi
echo -e "\n[4] Yüksek CPU Kullanan Süreçler:"
ps aux --sort=-%cpu | head -5
echo -e "\n[5] En Çok Bağlantı Kuran Dış IP'ler:"
ss -tunap | grep ESTAB | awk '{print $6}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -5
echo -e "\n[6] Disk Kullanımı:"
df -h | grep -E '^/dev/' | awk '$5 > 80 {print "⚠️ " $0}'
echo -e "\n[7] Zombie Process'ler:"
ps aux | awk '$8 ~ /Z/ {print $0}' || echo "Yok."
echo -e "\n[8] Kernel Bilgisi:"
uname -r
echo -e "\n=== KONTROL TAMAMLANDI ==="