diff --git a/servers/linux/config_adminSys.sh b/servers/linux/config_adminSys.sh index 65dbd23..d71d321 100755 --- a/servers/linux/config_adminSys.sh +++ b/servers/linux/config_adminSys.sh @@ -29,17 +29,23 @@ DEBIAN_FRONTEND=noninteractive apt install -y curl bc # --- 3. RÉCUPÉRATION ET TEST DU MOT DE PASSE SMTP --- -PASS_FILE=".smtp_pass" +# Ici, PASS_FILE_ORI pointe probablement vers /etc/msmtprc ou une sauvegarde +PASS_FILE_ORI="/etc/msmtprc" AUTH_OK=false while [ "$AUTH_OK" = false ]; do - # 1. Tentative de lecture depuis le fichier - if [ -f "$PASS_FILE" ] && [ -s "$PASS_FILE" ]; then - SMTP_PASS=$(head -n 1 "$PASS_FILE") - echo "📄 Mot de passe lu depuis le fichier $PASS_FILE." + # 1. Tentative d'extraction depuis le fichier de config existant + if [ -f "$PASS_FILE_ORI" ]; then + # On cherche la ligne commençant par 'password', on ignore les espaces/tabulations, + # et on récupère la deuxième colonne. + SMTP_PASS=$(grep -E "^password[[:space:]]+" "$PASS_FILE_ORI" | awk '{print $2}') + fi + + if [ -n "$SMTP_PASS" ]; then + echo "📄 Mot de passe extrait depuis $PASS_FILE_ORI." else - # 2. Sinon, saisie manuelle - echo -n "🔑 Mot de passe SMTP pour ${SMTP_USER} : " + # 2. Sinon, saisie manuelle si le fichier n'existe pas ou ne contient pas de password + echo -n "🔑 Mot de passe SMTP non trouvé. Entrez le pour ${SMTP_USER} : " read -s SMTP_PASS echo "" fi @@ -62,7 +68,7 @@ account default : test EOF chmod 600 /tmp/.msmtp_test - # Test d'envoi réel (indispensable pour valider) + # Test d'envoi réel echo "Test de configuration" | msmtp --file=/tmp/.msmtp_test -t "$DEST_EMAIL" 2>/dev/null if [ $? -eq 0 ]; then @@ -71,9 +77,11 @@ EOF rm /tmp/.msmtp_test else echo "❌ Échec de l'authentification SMTP." - if [ -f "$PASS_FILE" ]; then - echo "⚠️ Le mot de passe dans $PASS_FILE est incorrect ou le serveur est injoignable." - mv "$PASS_FILE" "${PASS_FILE}.old" # On renomme pour forcer la saisie manuelle au prochain tour + # Si le password extrait était mauvais, on vide la variable pour forcer la saisie au prochain tour + if [ -f "$PASS_FILE_ORI" ]; then + echo "⚠️ Le mot de passe extrait de $PASS_FILE_ORI est incorrect." + SMTP_PASS="" + PASS_FILE_ORI="/dev/null" # On "désactive" la lecture fichier pour ce tour fi rm /tmp/.msmtp_test fi diff --git a/servers/linux/sys_check.sh b/servers/linux/sys_check.sh index 3a379ab..ed5047f 100644 --- a/servers/linux/sys_check.sh +++ b/servers/linux/sys_check.sh @@ -1,8 +1,11 @@ #!/bin/bash # --- CONFIGURATION --- -THRESHOLD=90 +THRESHOLD=80 LOAD_THRESHOLD=5.0 +PROC_THRESHOLD=500 +TMP_THRESHOLD=90 +CONN_THRESHOLD=500 HOST=$(hostname) # On envoie à 'root', le système fera la redirection grâce aux aliases @@ -11,31 +14,44 @@ DEST="root" REPORT="" ALERT=false + +# Fonction pour ajouter une ligne au rapport avec une icône +add_to_report() { + REPORT="${REPORT}$1\n" +} + + + # 1. CHECK DISQUE & INODES DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//') INODE_USAGE=$(df -i / | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then - REPORT="${REPORT}⚠️ DISQUE : $DISK_USAGE% utilisé\n" + add_to_report "⚠️ DISQUE : $DISK_USAGE% utilisé\n" ALERT=true fi if [ "$INODE_USAGE" -gt "$THRESHOLD" ]; then - REPORT="${REPORT}⚠️ INODES : $INODE_USAGE% utilisé\n" + add_to_report "⚠️ INODES : $INODE_USAGE% utilisé\n" ALERT=true fi -# 2. CHECK RAM & SWAP +# --- CHECK RAM & SWAP --- RAM_USAGE=$(free | grep Mem | awk '{print int($3/$2 * 100)}') -SWAP_TOTAL=$(free | grep Swap | awk '{print $2}') + +# On ajoute '|| echo 0' pour s'assurer que la variable n'est jamais vide +SWAP_TOTAL=$(free | grep Swap | awk '{print $2}' | grep -E '^[0-9]+$' || echo 0) if [ "$RAM_USAGE" -gt "$THRESHOLD" ]; then - REPORT="${REPORT}⚠️ RAM : $RAM_USAGE% utilisé\n" + add_to_report "⚠️ RAM : $RAM_USAGE% utilisé\n" ALERT=true fi -if [ "$SWAP_TOTAL" -gt 0 ]; then - SWAP_USAGE=$(free | grep Swap | awk '{print int($3/$2 * 100)}') + +# On vérifie si SWAP_TOTAL est supérieur à 0 et n'est pas vide +if [ -n "$SWAP_TOTAL" ] && [ "$SWAP_TOTAL" -gt 0 ]; then + # Calcul du SWAP_USAGE avec une sécurité pour éviter la division par zéro + SWAP_USAGE=$(free | grep Swap | awk '{print ($2>0) ? int($3/$2 * 100) : 0}') if [ "$SWAP_USAGE" -gt 50 ]; then - REPORT="${REPORT}⚠️ SWAP : $SWAP_USAGE% utilisé\n" + add_to_report "⚠️ SWAP : $SWAP_USAGE% utilisé (Saturation RAM imminente)\n" ALERT=true fi fi @@ -43,20 +59,96 @@ fi # 3. CHECK CHARGE CPU CPU_LOAD=$(uptime | awk -F'load average:' '{ print $2 }' | cut -d',' -f1 | tr -d ' ' | tr ',' '.') if (( $(echo "$CPU_LOAD > $LOAD_THRESHOLD" | bc -l) )); then - REPORT="${REPORT}🔥 CPU LOAD : $CPU_LOAD (Surcharge)\n" + add_to_report "🔥 CPU LOAD : $CPU_LOAD (Surcharge)\n" ALERT=true fi # 4. CHECK SERVICES (SSH et Fail2Ban sont vitaux) for SVC in "ssh" "fail2ban"; do if ! systemctl is-active --quiet "$SVC"; then - REPORT="${REPORT}❌ SERVICE : $SVC est ARRÊTÉ\n" + add_to_report "❌ SERVICE : $SVC est ARRÊTÉ\n" ALERT=true fi done -# --- ENVOI VIA ALIAS ROOT --- +# ------------------------------------------------ +# 5. NOMBRE DE PROCESSUS +# ------------------------------------------------ +PROC_COUNT=$(ps -e --no-headers | wc -l) + +if [ "$PROC_COUNT" -gt "$PROC_THRESHOLD" ]; then + add_to_report "PROCESSUS : $PROC_COUNT processus actifs\n" + ALERT=true +fi + +# ------------------------------------------------ +# 6. ESPACE /tmp +# ------------------------------------------------ +TMP_USAGE=$(df /tmp | awk 'NR==2 {print $5}' | sed 's/%//') + +if [ "$TMP_USAGE" -gt "$TMP_THRESHOLD" ]; then + add_to_report "/tmp : $TMP_USAGE% utilisé\n" + ALERT=true +fi + +# ------------------------------------------------ +# 7. PROCESSUS ZOMBIES +# ------------------------------------------------ +ZOMBIES=$(ps aux | awk '{ if ($8=="Z") print $0 }' | wc -l) + +if [ "$ZOMBIES" -gt 0 ]; then + add_to_report "ZOMBIES : $ZOMBIES processus zombies\n" + ALERT=true +fi + +# ------------------------------------------------ +# 8. FICHIERS SUPPRIMÉS MAIS OUVERTS +# ------------------------------------------------ +# On utilise tail -n +2 pour ignorer la ligne d'en-tête de lsof +DELETED_DATA=$(sudo lsof +L1 2>/dev/null | tail -n +2) +DELETED_COUNT=$(echo -n "$DELETED_DATA" | grep -c '^' || echo 0) + +if [ "$DELETED_COUNT" -gt 0 ]; then + # On extrait les noms des commandes uniques pour le rapport (ex: systemd-j, apache2) + PROCESS_NAMES=$(echo "$DELETED_DATA" | awk '{print $1}' | sort -u | tr '\n' ' ') + + add_to_report "📂 FICHIERS SUPPRIMÉS MAIS OUVERTS : $DELETED_COUNT (Processus : $PROCESS_NAMES)" + ALERT=true +fi + + +# ------------------------------------------------ +# 9. CONNEXIONS RÉSEAU +# ------------------------------------------------ +CONN_COUNT=$(ss -tun | tail -n +2 | wc -l) + +if [ "$CONN_COUNT" -gt "$CONN_THRESHOLD" ]; then + add_to_report "CONNEXIONS RÉSEAU : $CONN_COUNT\n" + ALERT=true +fi + +# ------------------------------------------------ +# 10. ERREURS RÉCENTES DANS LES LOGS +# ------------------------------------------------ +LOG_ERRORS=$(journalctl -p 3 -n 20 --no-pager | wc -l) + +if [ "$LOG_ERRORS" -gt 0 ]; then + add_to_report "ERREURS CRITIQUES DANS LES LOGS : $LOG_ERRORS\n" + ALERT=true +fi + +# ------------------------------------------------ +# ENVOI MAIL +# ------------------------------------------------ if [ "$ALERT" = true ]; then - # Le sujet sera automatiquement préfixé par le wrapper [$HOSTNAME] - echo -e "Détails de l'alerte :\n\n$REPORT\n---\nDate: $(date)" | mail -s "ALERTE RESSOURCES" "$DEST" + SUBJECT="🔴 ALERTE SERVEUR [$HOST] - $(date +'%H:%M')" + + # Construction du corps du mail avec un header propre + MAIL_BODY="Bonjour,\n\nUne ou plusieurs anomalies ont été détectées sur le serveur : $HOST\n" + MAIL_BODY="$MAIL_BODY\n------------------------------------------------\n" + MAIL_BODY="$MAIL_BODY$REPORT" + MAIL_BODY="$MAIL_BODY\n------------------------------------------------\n" + MAIL_BODY="$MAIL_BODY\nDate du rapport : $(date)" + + echo -e "$MAIL_BODY" | mail -s "$SUBJECT" "$DEST" fi \ No newline at end of file