commit a99479e4c6257b12847775f22bd9ce04bf09c5cc Author: no Date: Thu Nov 28 13:24:48 2024 +0100 first commit diff --git a/v2/README.md b/v2/README.md new file mode 100644 index 0000000..07ed72d --- /dev/null +++ b/v2/README.md @@ -0,0 +1,176 @@ + +# VPN Monitoring Script + +## **Überblick** + +Dieses Projekt implementiert ein flexibles und robustes VPN-Überwachungsskript, das den Netzwerkverkehr und die VPN-Funktionalität überprüft. Das Skript bietet zeitabhängige Prüfungen und die Möglichkeit, bei Erkennung von Problemen den VPN-Dienst automatisch neu zu starten. Das Skript wurde modular aufgebaut, um die Wartbarkeit und Erweiterbarkeit zu verbessern. + +## **Funktionen** + +1. **Netzwerkverkehrsprüfung**: + - Misst den eingehenden und ausgehenden Netzwerkverkehr eines bestimmten Netzwerkinterfaces. + - Verwendet Schwellenwerte zur Bewertung der Verbindung. + - Automatischer Dienstneustart bei Abweichung von Schwellwerten. + +2. **SQL-basierte Aktivitätsprüfung** (außerhalb der Hauptarbeitszeit): + - Überprüft die Datenbank auf Aktivitäten, die durch spezifische Benutzer oder Dienste ausgelöst wurden. + - Erkennt inaktive Verbindungen und leitet notwendige Schritte ein. + +3. **Automatischer Neustart des VPN-Dienstes**: + - Führt einen Dienstneustart remote über SSH aus. + - Überprüft die Funktionalität nach dem Neustart. + +4. **Detailliertes Logging**: + - JSON-basiertes Logging für maschinenlesbare und gut strukturierte Ausgaben. + - Logrotation zum Schutz vor übermäßigem Speicherverbrauch. + +5. **Konfigurierbarkeit**: + - Anpassbare Zeitfenster, Schwellenwerte, Datenbankeinstellungen und SSH-Verbindungsdetails. + - Modularer Aufbau für einfache Anpassungen und Erweiterungen. + +--- + +## **Installationsanleitung** + +### **Systemanforderungen** +- Betriebssystem: Linux (z. B. Ubuntu, Debian, CentOS) +- Pakete: + - `ifstat` + - `mysql-client` + - `openssh-client` + - `logrotate` + - `bc` (für Gleitkommaoperationen) + +### **Installation** +1. Klone das Repository oder kopiere die Skriptdateien auf deinen Server: + ```bash + git clone + cd vpn-monitor + ``` + +2. Stelle sicher, dass die erforderlichen Pakete installiert sind: + ```bash + sudo apt update + sudo apt install ifstat mysql-client openssh-client logrotate bc + ``` + +3. Konfiguriere die Berechtigungen: + ```bash + chmod +x vpn_monitor.sh + chmod +x functions/*.sh + ``` + +4. Passe die `config.conf` Datei an: + - Definiere Netzwerkinterface, Schwellenwerte, Datenbankeinstellungen, SSH-Details und Logdateipfad. + +5. (Optional) Füge die Logrotation hinzu: + - Kopiere die Datei `logrotate/vpn_monitor` nach `/etc/logrotate.d/`: + ```bash + sudo cp logrotate/vpn_monitor /etc/logrotate.d/ + ``` + +6. Plane das Skript mit Cron: + - Öffne den Cron-Editor: + ```bash + crontab -e + ``` + - Füge den Eintrag hinzu, um das Skript regelmäßig auszuführen: + ```bash + */5 * * * * /path/to/vpn_monitor.sh + ``` + +--- + +## **Nutzung** + +### **Konfiguration** + +Die Einstellungen werden in der Datei `config.conf` vorgenommen. Nachfolgend eine Übersicht der wichtigsten Parameter: + +| Parameter | Beschreibung | Standardwert | +|----------------------|-----------------------------------------------------------|-----------------------| +| `INTERFACE` | Netzwerkinterface zur Überwachung | `ens19` | +| `LOG_FILE` | Pfad zur Logdatei | `/var/log/vpn_monitor.log` | +| `THRESHOLD_INBOUND` | Schwellenwert für eingehenden Verkehr (KB/s) | `0.5` | +| `THRESHOLD_OUTBOUND` | Schwellenwert für ausgehenden Verkehr (KB/s) | `0.5` | +| `MEASUREMENT_COUNT` | Anzahl der Messzyklen | `10` | +| `INTERVAL` | Intervall zwischen Messungen (Sekunden) | `6` | +| `DB_USER` | Benutzername für die Datenbank | `username` | +| `DB_PASSWORD` | Passwort für die Datenbank | `password` | +| `DB_NAME` | Name der Datenbank | `database` | +| `SSH_KEY` | Pfad zur SSH-Schlüsseldatei | `/path/to/private_key`| +| `SSH_USER` | Benutzername für SSH | `user` | +| `SSH_HOST` | Hostname oder IP der SSH-Verbindung | `remote_host` | +| `SERVICE_NAME` | Name des zu überprüfenden Dienstes | `ipsec.service` | + +--- + +### **Ablauf** + +#### **Innerhalb der Hauptarbeitszeit (07:00-18:00 Uhr)** +- Misst eingehenden und ausgehenden Netzwerkverkehr. +- Vergleicht die Durchschnittswerte mit den definierten Schwellenwerten. +- Protokolliert den Status. +- Führt bei Bedarf einen Neustart des VPN-Dienstes aus. + +#### **Außerhalb der Hauptarbeitszeit (18:00-07:00 Uhr)** +- Überprüft SQL-Aktivitäten: + - Letzter Eintrag eines bestimmten Benutzers. + - Letzter Eintrag eines spezifischen Dienstes im Log. +- Leitet einen Neustart ein, wenn Aktivitätskriterien nicht erfüllt sind. + +--- + +## **Fehlerbehandlung** + +Das Skript behandelt potenzielle Fehler folgendermaßen: +1. **Netzwerkfehler**: + - Kein Output von `ifstat`: Meldet einen Fehler und bricht ab. +2. **SQL-Verbindungsfehler**: + - Fehlschlagende SQL-Abfragen werden geloggt und führen zum Abbruch. +3. **SSH-Fehler**: + - Fehler beim Neustart des Dienstes werden detailliert protokolliert. +4. **Dienstprüfung**: + - Nach Neustart überprüft `ipsec statusall` den Dienststatus. Fehlerhafte Zustände führen zur Eskalation. + +--- + +## **Logging** + +- Logs werden standardmäßig unter `/var/log/vpn_monitor.log` gespeichert. +- JSON-Format für maschinenlesbare Logs. +- Beispiel eines Logeintrags: + ```json + { + "timestamp": "2024-11-28 12:45:00", + "level": "INFO", + "message": "Network traffic is above thresholds. Avg In: 0.6 KB/s, Avg Out: 0.7 KB/s." + } + ``` + +--- + +## **Erweiterungsideen** + +1. **Benachrichtigungssystem**: + - Integration eines E-Mail- oder Push-Benachrichtigungssystems bei Eskalationen. +2. **Multithreading**: + - Parallele Prüfung mehrerer Netzwerkinterfaces oder SQL-Datenbanken. +3. **Web-Dashboard**: + - Echtzeit-Monitoring und Visualisierung der Logs über eine Weboberfläche. +4. **Externe API-Integration**: + - Verknüpfung mit Monitoring-Tools wie Zabbix oder Prometheus. + +--- + +## **Autoren** + +- **Dein Name** + E-Mail: [deine.email@example.com](mailto:deine.email@example.com) + GitHub: [DeinGitHub](https://github.com/DeinGitHub) + +--- + +## **Lizenz** + +Dieses Projekt steht unter der MIT-Lizenz. Weitere Informationen findest du in der Datei `LICENSE`. diff --git a/v2/config.conf b/v2/config.conf new file mode 100644 index 0000000..d597c48 --- /dev/null +++ b/v2/config.conf @@ -0,0 +1,26 @@ +# Netzwerkinterface +INTERFACE="ens19" + +# Log-Datei +LOG_FILE="/var/log/vpn_monitor.log" + +# Schwellwerte +THRESHOLD_INBOUND=0.5 +THRESHOLD_OUTBOUND=0.5 + +# Messparameter +MEASUREMENT_COUNT=10 +INTERVAL=6 + +# SQL-Datenbankverbindung +DB_USER="username" +DB_PASSWORD="password" +DB_NAME="database" + +# SSH-Verbindung +SSH_KEY="/path/to/private_key" +SSH_USER="user" +SSH_HOST="remote_host" + +# Dienstname für Neustart +SERVICE_NAME="ipsec.service" diff --git a/v2/functions/logging.sh b/v2/functions/logging.sh new file mode 100644 index 0000000..ee1acff --- /dev/null +++ b/v2/functions/logging.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +function log_info() { + echo "{\"timestamp\": \"$(date)\", \"level\": \"INFO\", \"message\": \"$1\"}" >> $LOG_FILE +} + +function log_error() { + echo "{\"timestamp\": \"$(date)\", \"level\": \"ERROR\", \"message\": \"$1\"}" >> $LOG_FILE +} + +function log_critical() { + echo "{\"timestamp\": \"$(date)\", \"level\": \"CRITICAL\", \"message\": \"$1\"}" >> $LOG_FILE +} diff --git a/v2/functions/network_check.sh b/v2/functions/network_check.sh new file mode 100644 index 0000000..c6a720f --- /dev/null +++ b/v2/functions/network_check.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +function check_network_traffic() { + total_inbound=0 + total_outbound=0 + + for ((i=1; i<=$MEASUREMENT_COUNT; i++)); do + usage=$(ifstat -i $INTERFACE $INTERVAL 1 | tail -n 1) + + if [[ -z "$usage" ]]; then + log_error "No output from ifstat on measurement $i." + exit 2 + fi + + inbound=$(echo $usage | awk '{print $1}') + outbound=$(echo $usage | awk '{print $2}') + + total_inbound=$(echo "$total_inbound + $inbound" | bc) + total_outbound=$(echo "$total_outbound + $outbound" | bc) + done + + avg_inbound=$(echo "scale=2; $total_inbound / $MEASUREMENT_COUNT" | bc) + avg_outbound=$(echo "scale=2; $total_outbound / $MEASUREMENT_COUNT" | bc) + + if (( $(echo "$avg_inbound < $THRESHOLD_INBOUND" | bc -l) )) || (( $(echo "$avg_outbound < $THRESHOLD_OUTBOUND" | bc -l) )); then + log_critical "Network traffic below thresholds. Avg In: $avg_inbound KB/s, Avg Out: $avg_outbound KB/s." + restart_service + else + log_info "Network traffic is above thresholds. Avg In: $avg_inbound KB/s, Avg Out: $avg_outbound KB/s." + fi +} diff --git a/v2/functions/restart_service.sh b/v2/functions/restart_service.sh new file mode 100644 index 0000000..1eae40f --- /dev/null +++ b/v2/functions/restart_service.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +function restart_service() { + log_info "Attempting to restart service $SERVICE_NAME on $SSH_HOST." + + ssh -i $SSH_KEY $SSH_USER@$SSH_HOST "sudo systemctl restart $SERVICE_NAME" + if [ $? -ne 0 ]; then + log_error "Failed to restart service $SERVICE_NAME on $SSH_HOST." + exit 2 + fi + + ssh -i $SSH_KEY $SSH_USER@$SSH_HOST "sudo ipsec statusall | grep -i 'running'" + if [ $? -ne 0 ]; then + log_critical "Service $SERVICE_NAME not running after restart." + exit 2 + fi + + log_info "Service $SERVICE_NAME successfully restarted and verified." +} diff --git a/v2/functions/sql_check.sh b/v2/functions/sql_check.sh new file mode 100644 index 0000000..6bd2646 --- /dev/null +++ b/v2/functions/sql_check.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +function check_sql_activity() { + last_order_time=$(mysql -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -sse \ + "SELECT MAX(create_time) FROM otrs_ticket WHERE create_user = 'LIDLWebservice';") + + last_bsi_log_time=$(mysql -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -sse \ + "SELECT MAX(log_time) FROM bsi_logs WHERE service = 'ITNovumBSIConnector';") + + if [[ -z "$last_order_time" || -z "$last_bsi_log_time" ]]; then + log_error "SQL query failed or returned no data." + exit 2 + fi + + now=$(date +%s) + last_order_epoch=$(date -d "$last_order_time" +%s) + last_bsi_epoch=$(date -d "$last_bsi_log_time" +%s) + + if (( (now - last_order_epoch) > 3600 && (now - last_bsi_epoch) > 7200 )); then + log_critical "SQL activity check failed. No activity in expected timeframes." + restart_service + else + log_info "SQL activity is within acceptable limits." + fi +} diff --git a/v2/logrotate_vpn_monitor b/v2/logrotate_vpn_monitor new file mode 100644 index 0000000..d6cbcd6 --- /dev/null +++ b/v2/logrotate_vpn_monitor @@ -0,0 +1,10 @@ +# Speichern unter /etc/logrotate.d/vpn_monitor +/var/log/vpn_monitor.log { + daily + missingok + rotate 7 + compress + delaycompress + notifempty + create 640 root root +} diff --git a/v2/vpn_monitor.sh b/v2/vpn_monitor.sh new file mode 100644 index 0000000..0009899 --- /dev/null +++ b/v2/vpn_monitor.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Source Konfigurations- und Modul-Dateien +source config.conf +source functions/logging.sh +source functions/network_check.sh +source functions/sql_check.sh +source functions/restart_service.sh + +# Funktion zur Prüfung der Arbeitszeit +function is_within_business_hours() { + current_hour=$(date +%H) + if (( current_hour >= 7 && current_hour < 18 )); then + return 0 # True + else + return 1 # False + fi +} + +# Hauptlogik +function main() { + log_info "Starting VPN monitoring script." + + if is_within_business_hours; then + log_info "Within business hours. Running network check." + check_network_traffic + else + log_info "Outside business hours. Running SQL activity check." + check_sql_activity + fi +} + +main