#!/bin/bash ############################################# # 🔐 CONFIG ############################################# # Telegram Bot Token (⚠️ später besser auslagern!) TOKEN="8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw" CHAT_ID="581059353" # Alle überwachten Hosts PIS=("192.168.178.2" "192.168.178.3" "192.168.178.5" "localhost") # Datei zur Speicherung des letzten Checks STATE_FILE="/home/kai/.ssh-monitor-lastcheck" ############################################# # 🧠 INITIALISIERUNG ############################################# # Falls keine State-Datei existiert → jetzt erstellen if [ ! -f "$STATE_FILE" ]; then date --iso-8601=seconds > "$STATE_FILE" fi LAST_CHECK=$(cat "$STATE_FILE") NOW=$(date --iso-8601=seconds) ############################################# # 🔧 SSH WRAPPER (WICHTIG FÜR CRON) ############################################# SSH_OPTS="-o ConnectTimeout=5 \ -o StrictHostKeyChecking=accept-new \ -o BatchMode=yes \ -o UserKnownHostsFile=/home/kai/.ssh/known_hosts" ############################################# # 🔁 HAUPTSCHLEIFE ÜBER ALLE HOSTS ############################################# for PI in "${PIS[@]}" do ######################################### # 🏠 LOKALER HOST (kein SSH nötig) ######################################### if [ "$PI" == "localhost" ]; then LOG=$(journalctl -u ssh --since "$LAST_CHECK" --no-pager 2>/dev/null || true) HOST=$(hostname) else ######################################### # 🌐 REMOTE HOST VIA SSH ######################################### LOG=$(ssh $SSH_OPTS kai@$PI \ "journalctl -u ssh --since \"$LAST_CHECK\" --no-pager" 2>/dev/null || true) HOST=$(ssh $SSH_OPTS kai@$PI hostname 2>/dev/null || echo "$PI") fi ############################################# # 🚨 ANALYSE: FAILED LOGINS ############################################# if [ -n "$LOG" ]; then FAILS=$(echo "$LOG" | grep "Failed password" | wc -l) else FAILS=0 fi ############################################# # 📊 DETAILS ZU ANGREIFERN ############################################# if [ "$FAILS" -gt 0 ]; then IPS=$(echo "$LOG" | grep "Failed password" \ | awk '{print $(NF-3)}' \ | sort | uniq -c | sort -nr) ######################################### # 📡 TELEGRAM ALERT ######################################### MESSAGE="🚨 SSH Angriff erkannt! Host: $HOST ($PI) Fehlversuche: $FAILS Top Angreifer: $IPS" curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ -d chat_id="$CHAT_ID" \ -d text="$MESSAGE" >/dev/null fi done ############################################# # 💾 STATE UPDATE ############################################# echo "$NOW" > "$STATE_FILE"