#!/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
139 # NetBIOS
389 # LDAP
445 # SMB
464 # Kerberos password
636 # LDAPS
3268 # Global Catalog
3269 # Global Catalog SSL
)
# 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 AD | Cohérente |
")
else
db_checks+=("| Base de données AD | Problèmes détectés |
")
# Extraction et formatage des erreurs
local db_errors=$(cat "$temp_file" | sed 's/\</g' | 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és | Nettoyage 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 AD | Erreurs de réplication détectées |
")
else
db_checks+=("| Réplication AD | Fonctionnelle |
")
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+=("| $proc | Actif |
")
else
process_status+=("| $proc | Inactif |
")
fi
done
echo "${process_status[@]}"
}
# Vérification détaillée Kerberos
check_kerberos() {
local kerberos_checks=()
local password
# 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 Kerberos | Actif et Valide |
")
else
kerberos_checks+=("| Authentification Kerberos | Problème détecté |
")
kerberos_checks+=("| Problème avec l'authentification Kerberos pour l'utilisateur '$ADMIN_USER'. |
")
fi
else
kerberos_checks+=("| Authentification Kerberos | Problè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 LDAP | Configuré et Accessible |
")
else
ldap_checks+=("| Annuaire LDAP | Problè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 DNS | Actif et Fonctionnel |
")
else
dns_checks+=("| Serveur DNS | Problè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 NTP | Non 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) )); 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 < 1000" | bc -l) )); 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+=("| UFW | Non installé |
")
return
fi
# Vérifier si UFW est actif
if ! ufw status | grep -q "Status: active"; then
ufw_checks+=("| UFW Status | Inactif |
")
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 $port | Ouvert |
")
else
ufw_checks+=("| Port $port | Fermé |
")
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')
Synchronisation de l'heure
État des ports UFW
État de la Base de Données AD
$(check_database_consistency)
Processus Samba AD
Authentification Kerberos
Annuaire LDAP
Serveur DNS
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"