From 145c8b9ae74fba33433027624def9aa3ccce4f7e Mon Sep 17 00:00:00 2001 From: kai Date: Sun, 26 Apr 2026 18:13:10 +0000 Subject: [PATCH] umbau SSH und kommentare --- scripts/ssh-analyzer.sh | 95 ++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/scripts/ssh-analyzer.sh b/scripts/ssh-analyzer.sh index 561436d..471b495 100755 --- a/scripts/ssh-analyzer.sh +++ b/scripts/ssh-analyzer.sh @@ -1,12 +1,25 @@ #!/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 @@ -14,31 +27,69 @@ 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 - if [ "$PI" == "localhost" ]; then - LOG=$(journalctl -u ssh --since "$LAST_CHECK" --no-pager) - HOST=$(hostname) - else - LOG=$(ssh -o ConnectTimeout=5 \ - -o StrictHostKeyChecking=accept-new \ - -o UserKnownHostsFile=/home/kai/.ssh/known_hosts \ - kai@$PI \ - "journalctl -u ssh --since \"$LAST_CHECK\" --no-pager") - HOST=$(ssh -o ConnectTimeout=5 \ - -o StrictHostKeyChecking=accept-new \ - -o UserKnownHostsFile=/home/kai/.ssh/known_hosts \ - kai@$PI hostname) + ######################################### + # 🏠 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 - FAILS=$(echo "$LOG" | grep "Failed password" | wc -l) + + ############################################# + # 🚨 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) + | awk '{print $(NF-3)}' \ + | sort | uniq -c | sort -nr) + + ######################################### + # 📡 TELEGRAM ALERT + ######################################### MESSAGE="🚨 SSH Angriff erkannt! Host: $HOST ($PI) @@ -48,9 +99,15 @@ Top Angreifer: $IPS" curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ - -d chat_id="$CHAT_ID" \ - -d text="$MESSAGE" + -d chat_id="$CHAT_ID" \ + -d text="$MESSAGE" >/dev/null fi + done -echo "$NOW" > "$STATE_FILE" + +############################################# +# 💾 STATE UPDATE +############################################# + +echo "$NOW" > "$STATE_FILE" \ No newline at end of file