#!/bin/bash # # Script d'installation et configuration de rkhunter et ClamAV # pour la détection de rootkits et malwares sur Debian 12 # # Idempotent et professionnel # Usage: sudo ./install_security_tools.sh set -euo pipefail # Couleurs pour l'output readonly RED='\033[0;31m' readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly NC='\033[0m' # Constantes readonly LOG_FILE="/var/log/security_tools_install.log" readonly RKHUNTER_CONF="/etc/rkhunter.conf" readonly RKHUNTER_LOCAL_CONF="/etc/rkhunter.conf.local" readonly CLAMAV_CONF="/etc/clamav/clamd.conf" readonly AIDE_CONF="/etc/aide/aide.conf" ################################################################# # CONFIGURATION DES EXCEPTIONS - FAUX POSITIFS CONNUS ################################################################# # Ajoutez ici les fichiers/commandes qui génèrent des faux positifs # Format: un chemin complet par ligne readonly RKHUNTER_EXCEPTIONS=( "/usr/bin/lwp-request" "/usr/bin/GET" "/usr/bin/HEAD" "/usr/bin/POST" "/usr/sbin/unhide" # Ajoutez vos propres exceptions ici # "/chemin/vers/votre/fichier" ) # Vérifier les privilèges root en premier if [[ $EUID -ne 0 ]]; then echo -e "${RED}ERREUR: Ce script doit être exécuté avec les privilèges root${NC}" echo -e "${YELLOW}Utilisation: sudo $0${NC}" exit 1 fi # Fonction de logging log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*" | tee -a "$LOG_FILE" } log_error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR:${NC} $*" | tee -a "$LOG_FILE" } log_warning() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING:${NC} $*" | tee -a "$LOG_FILE" } # Vérifier les privilèges root check_root() { if [[ $EUID -ne 0 ]]; then log_error "Ce script doit être exécuté en tant que root" exit 1 fi } # Vérifier la distribution check_distribution() { if [[ ! -f /etc/debian_version ]]; then log_error "Ce script est conçu pour Debian 12" exit 1 fi local version version=$(cat /etc/debian_version | cut -d. -f1) if [[ "$version" != "12" ]]; then log_warning "Version Debian détectée: $version (recommandé: 12)" fi } # Mise à jour du système update_system() { log "Mise à jour de la liste des paquets..." if ! apt-get update -qq; then log_error "Échec de la mise à jour des paquets" exit 1 fi } # Installation de rkhunter install_rkhunter() { log "Vérification de l'installation de rkhunter..." if command -v rkhunter &> /dev/null; then log "rkhunter est déjà installé ($(rkhunter --version | head -n1))" return 0 fi log "Installation de rkhunter..." if ! apt-get install -y rkhunter; then log_error "Échec de l'installation de rkhunter" exit 1 fi log "rkhunter installé avec succès" } # Configuration de rkhunter configure_rkhunter() { log "Configuration de rkhunter..." # Backup du fichier de configuration original if [[ -f "$RKHUNTER_CONF" && ! -f "${RKHUNTER_CONF}.backup" ]]; then cp "$RKHUNTER_CONF" "${RKHUNTER_CONF}.backup" log "Backup de la configuration: ${RKHUNTER_CONF}.backup" fi # Configuration recommandée sed -i 's/^UPDATE_MIRRORS=.*/UPDATE_MIRRORS=1/' "$RKHUNTER_CONF" sed -i 's/^MIRRORS_MODE=.*/MIRRORS_MODE=0/' "$RKHUNTER_CONF" sed -i 's/^WEB_CMD=.*/WEB_CMD=""/' "$RKHUNTER_CONF" # Activer les mises à jour automatiques de la base de données if ! grep -q "^CRON_DAILY_RUN=" "$RKHUNTER_CONF"; then echo "CRON_DAILY_RUN=true" >> "$RKHUNTER_CONF" else sed -i 's/^CRON_DAILY_RUN=.*/CRON_DAILY_RUN=true/' "$RKHUNTER_CONF" fi if ! grep -q "^CRON_DB_UPDATE=" "$RKHUNTER_CONF"; then echo "CRON_DB_UPDATE=true" >> "$RKHUNTER_CONF" else sed -i 's/^CRON_DB_UPDATE=.*/CRON_DB_UPDATE=true/' "$RKHUNTER_CONF" fi log "Configuration de rkhunter terminée" } # Configurer les exceptions rkhunter (faux positifs) configure_rkhunter_exceptions() { log "Configuration des exceptions rkhunter (faux positifs)..." # Créer ou vider le fichier local : > "$RKHUNTER_LOCAL_CONF" cat >> "$RKHUNTER_LOCAL_CONF" << 'EOF' # Configuration locale rkhunter # Fichier généré automatiquement - Exceptions pour faux positifs # Date: $(date) EOF local count=0 for exception in "${RKHUNTER_EXCEPTIONS[@]}"; do # Vérifier si le fichier existe avant de l'ajouter if [[ -f "$exception" ]]; then echo "SCRIPTWHITELIST=\"$exception\"" >> "$RKHUNTER_LOCAL_CONF" log "Exception ajoutée: $exception" ((count++)) else log_warning "Fichier non trouvé (exception ignorée): $exception" fi done log "$count exception(s) configurée(s) dans $RKHUNTER_LOCAL_CONF" } # Initialisation de rkhunter initialize_rkhunter() { log "Mise à jour de la base de données rkhunter..." if ! rkhunter --update; then log_warning "Mise à jour de la base de données rkhunter échouée (peut nécessiter une connexion Internet)" fi log "Initialisation de la base de données des fichiers système..." if ! rkhunter --propupd; then log_error "Échec de l'initialisation de rkhunter" exit 1 fi log "rkhunter initialisé avec succès" } # Installation de ClamAV install_clamav() { log "Vérification de l'installation de ClamAV..." if command -v clamscan &> /dev/null; then log "ClamAV est déjà installé ($(clamscan --version))" return 0 fi log "Installation de ClamAV et ClamAV Daemon..." if ! apt-get install -y clamav clamav-daemon clamav-freshclam; then log_error "Échec de l'installation de ClamAV" exit 1 fi log "ClamAV installé avec succès" } # Configuration de ClamAV configure_clamav() { log "Configuration de ClamAV..." # Arrêter les services pour la configuration systemctl stop clamav-freshclam 2>/dev/null || true # Mise à jour de la base de données virale log "Mise à jour de la base de données antivirale (cela peut prendre plusieurs minutes)..." if ! freshclam; then log_warning "Première mise à jour freshclam échouée, nouvelle tentative..." sleep 5 freshclam || log_warning "Mise à jour freshclam échouée" fi # Activer et démarrer les services systemctl enable clamav-freshclam systemctl start clamav-freshclam log "Configuration de ClamAV terminée" } # Installation de AIDE install_aide() { log "Vérification de l'installation de AIDE..." if command -v aide &> /dev/null; then log "AIDE est déjà installé ($(aide --version 2>&1 | head -n1))" return 0 fi log "Installation de AIDE (Advanced Intrusion Detection Environment)..." if ! apt-get install -y aide aide-common; then log_error "Échec de l'installation de AIDE" exit 1 fi log "AIDE installé avec succès" } # Configuration de AIDE configure_aide() { log "Configuration de AIDE..." # Backup de la configuration originale if [[ -f "$AIDE_CONF" && ! -f "${AIDE_CONF}.backup" ]]; then cp "$AIDE_CONF" "${AIDE_CONF}.backup" log "Backup de la configuration AIDE: ${AIDE_CONF}.backup" fi # Vérifier si la base de données existe if [[ ! -f /var/lib/aide/aide.db ]]; then log "Initialisation de la base de données AIDE (cela peut prendre 10-30 minutes)..." log_warning "Cette opération est longue lors de la première exécution..." if ! aideinit; then log_error "Échec de l'initialisation de AIDE" exit 1 fi # Copier la nouvelle base en tant que base active if [[ -f /var/lib/aide/aide.db.new ]]; then cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db log "Base de données AIDE initialisée avec succès" fi else log "Base de données AIDE déjà existante" fi log "Configuration de AIDE terminée" } # Créer un script de vérification AIDE create_aide_check_script() { log "Création du script de vérification AIDE..." local aide_script="/usr/local/bin/aide-check.sh" cat > "$aide_script" << 'EOF' #!/bin/bash # Script de vérification AIDE # Généré automatiquement LOGFILE="/var/log/aide-check-$(date +%Y%m%d).log" MAILTO="root" echo "=== Vérification AIDE du $(date) ===" > "$LOGFILE" # Vérifier l'intégrité du système aide --check >> "$LOGFILE" 2>&1 # Envoyer un email si des changements sont détectés if grep -qE "changed|added|removed" "$LOGFILE"; then echo "Des changements de fichiers ont été détectés. Consultez $LOGFILE" | \ mail -s "Alerte AIDE: $(hostname)" "$MAILTO" fi echo -e "\n=== Vérification terminée ===" >> "$LOGFILE" # Mettre à jour la base de données après vérification (optionnel) # Décommenter la ligne suivante pour mettre à jour automatiquement # aide --update && cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db EOF chmod +x "$aide_script" log "Script de vérification AIDE créé: $aide_script" } # Créer un script de scan quotidien create_daily_scan_script() { log "Création du script de scan quotidien..." local scan_script="/usr/local/bin/daily-security-scan.sh" cat > "$scan_script" << 'EOF' #!/bin/bash # Script de scan quotidien de sécurité # Généré automatiquement LOGFILE="/var/log/security-scan-$(date +%Y%m%d).log" MAILTO="root" echo "=== Scan de sécurité du $(date) ===" > "$LOGFILE" # Scan rkhunter echo -e "\n--- Scan rkhunter ---" >> "$LOGFILE" rkhunter --check --skip-keypress --report-warnings-only >> "$LOGFILE" 2>&1 # Scan ClamAV des répertoires critiques echo -e "\n--- Scan ClamAV ---" >> "$LOGFILE" clamscan -r -i --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" \ /home /root /tmp /var/www 2>&1 | tee -a "$LOGFILE" # Envoyer un email si des problèmes sont détectés if grep -qiE "warning|infected|rootkit" "$LOGFILE"; then echo "Des problèmes de sécurité ont été détectés. Consultez $LOGFILE" | \ mail -s "Alerte sécurité: $(hostname)" "$MAILTO" fi echo -e "\n=== Scan terminé ===" >> "$LOGFILE" EOF chmod +x "$scan_script" log "Script de scan créé: $scan_script" } # Configurer le cron pour les scans quotidiens setup_cron() { log "Configuration des tâches cron..." local cron_file="/etc/cron.d/security-scan" cat > "$cron_file" << EOF # Scan de sécurité quotidien SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Scan quotidien à 2h du matin 0 2 * * * root /usr/local/bin/daily-security-scan.sh # Scan quotidien à 13h (milieu de journée) 0 13 * * * root /usr/local/bin/daily-security-scan.sh # Vérification AIDE hebdomadaire (dimanche à 3h) 0 3 * * 0 root /usr/local/bin/aide-check.sh # Mise à jour rkhunter hebdomadaire 30 3 * * 0 root /usr/bin/rkhunter --update --quiet && /usr/bin/rkhunter --propupd # Mise à jour base de données AIDE mensuelle (1er du mois à 4h) 0 4 1 * * root /usr/bin/aide --update && cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Mise à jour ClamAV (freshclam gère déjà cela via systemd) EOF chmod 644 "$cron_file" log "Tâches cron configurées: $cron_file" } # Exécuter un premier scan run_initial_scan() { log "Exécution d'un scan initial (cela peut prendre du temps)..." log "Scan rkhunter..." if rkhunter --check --skip-keypress --report-warnings-only; then log "Scan rkhunter terminé avec succès" else log_warning "Scan rkhunter terminé avec des avertissements (consultez /var/log/rkhunter.log)" fi } # Afficher les informations finales print_summary() { cat << EOF ${GREEN}╔═══════════════════════════════════════════════════════════════╗ ║ Installation terminée avec succès! ║ ╚═══════════════════════════════════════════════════════════════╝${NC} ${YELLOW}Outils installés:${NC} • rkhunter: $(rkhunter --version | head -n1) • ClamAV: $(clamscan --version) • AIDE: $(aide --version 2>&1 | head -n1) ${YELLOW}Commandes utiles:${NC} ${GREEN}rkhunter:${NC} • Scan manuel: sudo rkhunter --check • Mise à jour DB: sudo rkhunter --update • Mise à jour proplist: sudo rkhunter --propupd ${GREEN}ClamAV:${NC} • Scan manuel: sudo clamscan -r /chemin • Mise à jour: sudo freshclam ${GREEN}AIDE:${NC} • Vérifier intégrité: sudo aide --check • Mettre à jour DB: sudo aide --update • Initialiser DB: sudo aideinit ${YELLOW}Fichiers de configuration:${NC} • rkhunter principal: $RKHUNTER_CONF • rkhunter exceptions: $RKHUNTER_LOCAL_CONF • AIDE config: $AIDE_CONF ${YELLOW}Logs:${NC} • Installation: $LOG_FILE • rkhunter: /var/log/rkhunter.log • AIDE checks: /var/log/aide-check-*.log • Scans quotidiens: /var/log/security-scan-*.log ${YELLOW}Automatisation:${NC} • Scan quotidien: 2h00 et 13h00 • Vérif AIDE: Dimanche 3h00 • MAJ rkhunter: Dimanche 3h30 • MAJ AIDE DB: 1er du mois 4h00 ${YELLOW}Scripts créés:${NC} • /usr/local/bin/daily-security-scan.sh • /usr/local/bin/aide-check.sh ${GREEN}Le système est maintenant protégé avec une détection multicouche:${NC} ✓ Rootkits et backdoors (rkhunter) ✓ Malwares et virus (ClamAV) ✓ Intégrité des fichiers (AIDE) ${YELLOW}Note:${NC} Pour ajouter des exceptions rkhunter, éditez le script et ajoutez les chemins dans le tableau RKHUNTER_EXCEPTIONS, puis relancez le script. EOF } # Fonction principale main() { log "=== Démarrage de l'installation des outils de sécurité ===" check_root check_distribution update_system install_rkhunter configure_rkhunter configure_rkhunter_exceptions initialize_rkhunter install_clamav configure_clamav install_aide configure_aide create_daily_scan_script create_aide_check_script setup_cron run_initial_scan log "=== Installation terminée ===" print_summary } # Exécution main "$@"