#!/bin/bash # Script de monitoring pour Serveur Samba Active Directory # Configuration LOG_FILE="/var/log/samba-ad-monitor.log" REPORT_FILE="/tmp/samba_ad_report_$(date +%Y%m%d_%H%M%S).html" ADMIN_EMAIL="serviceinfo@h3campus.fr" DOMAIN_NAME=$(hostname -d) REALM=$(samba-tool domain info $(hostname -f) | grep "Realm" | cut -d: -f2 | tr -d '[:space:]') ADMIN_USER="Administrator" SERVER_NAME=$(hostname) NTP_SERVER="pool.ntp.org" # Ports requis pour Samba AD REQUIRED_PORTS=( 53 # DNS 88 # Kerberos 123 # NTP 139 # NetBIOS 389 # LDAP 445 # SMB 464 # Kerberos password 636 # LDAPS 3268 # Global Catalog 3269 # Global Catalog SSL 8385 # Port utilisé par Syncthing pour l'interface du serveur de relais (STRelaySrv) 22000 # Port utilisé par Syncthing pour les transferts de fichiers 22001 # Port utilisé par Syncthing pour les connexions relayées 22027 # Port utilisé par Syncthing pour la découverte globale 161 # Port utilisé par SNMP (Simple Network Management Protocol) pour les requêtes de gestion ) # Couleurs pour le rapport HTML COLOR_GREEN="#e6ffe6" COLOR_RED="#ffe6e6" COLOR_YELLOW="#fffae6" # Fonction de logging log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # Vérification des outils LDAP check_ldap_tools() { local ldap_packages=("ldap-utils") local missing_packages=() for pkg in "${ldap_packages[@]}"; do if ! dpkg -s "$pkg" &> /dev/null; then missing_packages+=("$pkg") fi done if [ ${#missing_packages[@]} -gt 0 ]; then log_message "Installation des paquets LDAP manquants : ${missing_packages[*]}" apt-get update apt-get install -y "${missing_packages[@]}" fi } # Vérification de la cohérence de la base de données check_database_consistency() { local db_checks=() local temp_file="/tmp/dbcheck_output.txt" log_message "Début de la vérification de la base de données AD" # Vérification de la base de données avec dbcheck if samba-tool dbcheck --cross-ncs > "$temp_file" 2>&1; then db_checks+=("Base de données ADCohérente") else db_checks+=("Base de données ADProblèmes détectés") # Extraction et formatage des erreurs local db_errors=$(cat "$temp_file" | sed 's//\>/g' | sed 's/\n/
/g') db_checks+=("Erreurs détectées:
$db_errors
") fi # Vérification des objets supprimés local deleted_objects=$(samba-tool dbcheck --cross-ncs --fix --yes 2>&1 | grep "fix_all_deleted_objects") if [ -n "$deleted_objects" ]; then db_checks+=("Objets supprimésNettoyage effectué") fi # Vérification de la réplication (si applicable dans votre environnement) if samba-tool drs showrepl 2>/dev/null | grep -q "failed"; then db_checks+=("Réplication ADErreurs de réplication détectées") else db_checks+=("Réplication ADFonctionnelle") fi # Nettoyage rm -f "$temp_file" echo "${db_checks[@]}" } # Vérification des processus Samba check_samba_processes() { local processes_to_check=( "samba" "winbind_server" "ldap_server" "dns" "kdc_server" "dreplsrv" "rpc_server" "cldap_server" "nbt_server" ) local process_status=() log_message "Début de la vérification des processus Samba" local samba_processes=$(samba-tool processes | tail -n +3 | awk '{print $1}' | sort | uniq) for proc in "${processes_to_check[@]}"; do if echo "$samba_processes" | grep -q "$proc"; then process_status+=("$procActif") else process_status+=("$procInactif") fi done echo "${process_status[@]}" } check_syncthing_processes() { local processes_to_check=( "syncthing" ) local process_status=() #log_message "Début de la vérification des processus Syncthing" # Correction: utilisation de ps ou pgrep pour vérifier les processus local syncthing_processes=$(ps aux | awk '{print $11}' | sort | uniq) for proc in "${processes_to_check[@]}"; do if echo "$syncthing_processes" | grep -q "$proc"; then process_status+=("$procActif") else process_status+=("$procInactif") fi done echo "${process_status[@]}" } check_tis_services() { local services_to_check=( "tis-sysvolsync" "tis-sysvolacl" ) local service_status=() #log_message "Début de la vérification des services TIS" for service in "${services_to_check[@]}"; do # Vérifier si le service est activé (enabled au démarrage) if systemctl is-enabled "$service" &>/dev/null; then local enabled_status="Activé au démarrage" local enabled_color="$COLOR_GREEN" else local enabled_status="Non activé au démarrage" local enabled_color="$COLOR_RED" fi # Vérifier si le service est démarré (running) if systemctl is-active "$service" &>/dev/null; then local active_status="Démarré" local active_color="$COLOR_GREEN" else local active_status="Arrêté" local active_color="$COLOR_RED" fi service_status+=("$service$enabled_status$active_status") done echo "${service_status[@]}" } # Vérification détaillée Kerberos check_kerberos() { local kerberos_checks=() local password="Linux741!" # Demander interactivement le mot de passe #read -s -p "Mot de passe pour $ADMIN_USER : " password echo local kdc_processes=$(samba-tool processes | grep "kdc_server") if [ -n "$kdc_processes" ]; then if echo "$password" | kinit "$ADMIN_USER" &> /dev/null; then kerberos_checks+=("Authentification KerberosActif et Valide") else kerberos_checks+=("Authentification KerberosProblème détecté") kerberos_checks+=("Problème avec l'authentification Kerberos pour l'utilisateur '$ADMIN_USER'.") fi else kerberos_checks+=("Authentification KerberosProblème détecté") kerberos_checks+=("Service KDC inactif.") fi echo "${kerberos_checks[@]}" } # Vérification LDAP check_ldap() { local ldap_checks=() # Vérifier la configuration LDAP via samba-tool if samba-tool domain info $(hostname -f) &> /dev/null; then ldap_checks+=("Annuaire LDAPConfiguré et Accessible") else ldap_checks+=("Annuaire LDAPProblème de configuration") ldap_checks+=("Impossible de récupérer les informations du domaine.") fi echo "${ldap_checks[@]}" } # Vérification DNS check_dns() { local dns_checks=() local dns_processes=$(samba-tool processes | grep "dns") if [ -n "$dns_processes" ] && host "$DOMAIN_NAME" &> /dev/null; then dns_checks+=("Serveur DNSActif et Fonctionnel") else dns_checks+=("Serveur DNSProblème détecté") dns_checks+=("Problème avec le service DNS.") fi echo "${dns_checks[@]}" } # Vérification de la synchronisation de l'heure check_time_sync() { local time_checks=() # Vérifier si ntpd ou chronyd est installé if ! command -v ntpstat &> /dev/null && ! command -v chronyc &> /dev/null; then time_checks+=("Service NTPNon installé") return fi # Vérifier la synchronisation avec chronyd if command -v chronyc &> /dev/null; then if chronyc tracking | grep -q "^Leap status.*Normal"; then local offset=$(chronyc tracking | grep "Last offset" | awk '{print $4}') if [ "$(echo "$offset < 1.0" | bc -l)" -eq 1 ]; then time_checks+=("Synchronisation NTP (chronyd)Synchronisé (offset: ${offset}s)") else time_checks+=("Synchronisation NTP (chronyd)Offset important: ${offset}s") fi else time_checks+=("Synchronisation NTP (chronyd)Non synchronisé") fi fi # Vérifier la synchronisation avec ntpd if command -v ntpq &> /dev/null; then if ntpq -p &> /dev/null; then local offset=$(ntpq -c rv | grep offset | cut -d= -f2) if [ "$(echo "$offset < 1.0" | bc -l)" -eq 1 ]; then time_checks+=("Synchronisation NTP (ntpd)Synchronisé (offset: ${offset}ms)") else time_checks+=("Synchronisation NTP (ntpd)Offset important: ${offset}ms") fi else time_checks+=("Synchronisation NTP (ntpd)Non synchronisé") fi fi echo "${time_checks[@]}" } # Vérification des ports UFW check_ufw_ports() { local ufw_checks=() # Vérifier si UFW est installé if ! command -v ufw &> /dev/null; then ufw_checks+=("UFWNon installé") return fi # Vérifier si UFW est actif if ! ufw status | grep -q "Status: active"; then ufw_checks+=("UFW StatusInactif") return fi # Vérifier chaque port requis for port in "${REQUIRED_PORTS[@]}"; do if ufw status | grep -qE "^$port/(tcp|udp).*ALLOW"; then ufw_checks+=("Port $portOuvert") else ufw_checks+=("Port $portFermé") fi done echo "${ufw_checks[@]}" } # Génération du rapport HTML generate_html_report() { cat << EOF > "$REPORT_FILE" Rapport Monitoring Samba AD DC - $SERVER_NAME

Rapport de Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y %H:%M:%S')

Processus Samba AD

$(check_samba_processes)

Processus Syncthing Sysvol

$(check_syncthing_processes)

Processus tis-sysvol services

$(check_tis_services)

Authentification Kerberos

$(check_kerberos)

Annuaire LDAP

$(check_ldap)

Serveur DNS

$(check_dns)

Synchronisation de l'heure

$(check_time_sync)

État des ports UFW

$(check_ufw_ports)

État de la Base de Données AD

$(check_database_consistency)
EOF } # Envoi du rapport par email send_email_report() { if [ -f "$REPORT_FILE" ]; then if command -v sendmail &> /dev/null; then ( echo "To: $ADMIN_EMAIL" echo "Subject: Rapport Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y')" echo "Content-Type: text/html" echo "" cat "$REPORT_FILE" ) | sendmail -t log_message "Rapport envoyé via sendmail à $ADMIN_EMAIL" elif command -v ssmtp &> /dev/null; then ( echo "To: $ADMIN_EMAIL" echo "Subject: Rapport Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y')" echo "Content-Type: text/html" echo "" cat "$REPORT_FILE" ) | ssmtp "$ADMIN_EMAIL" log_message "Rapport envoyé via ssmtp à $ADMIN_EMAIL" else log_message "Aucun outil d'envoi d'email (sendmail/ssmtp) trouvé. Le rapport n'a pas été envoyé." fi else log_message "Le fichier de rapport $REPORT_FILE n'existe pas. Impossible d'envoyer l'email." fi } # Démarrage du monitoring log_message "Démarrage du script de monitoring" check_ldap_tools generate_html_report send_email_report log_message "Script terminé avec succès"