diff --git a/system_hardening_optimized.sh b/system_hardening_optimized.sh index a9ed8b0..350c452 100644 --- a/system_hardening_optimized.sh +++ b/system_hardening_optimized.sh @@ -2,7 +2,7 @@ ################################################################################ # Script: system_hardening_optimized.sh -# Version: 8.1 +# Version: 8.2 # Date: $(date +%Y-%m-%d) # Author: Security Team # Description: Système de durcissement sécurité pour Debian/Ubuntu LTS @@ -44,8 +44,9 @@ readonly DEFAULT_UMASK="027" : "${AUTO_SKIP_LYNIS:=no}" : "${AUTO_YES:=no}" : "${AUTO_CLEANUP_SSH:=no}" +: "${AUTO_CHANGE_ROOT_PWD:=no}" -TOTAL_STEPS=31 +TOTAL_STEPS=32 CURRENT_STEP=1 # Variables de contrôle @@ -75,6 +76,7 @@ readonly NC='\033[0m' declare -A STEP_DESCRIPTIONS=( ["install_security_tools"]="Installation des outils de sécurité" + ["change_root_password"]="Changement mot de passe root aléatoire" ["detect_open_ports"]="Détection des ports ouverts" ["configure_process_accounting"]="Configuration Process Accounting" ["configure_sysctl_security"]="Durcissement sysctl" @@ -360,72 +362,35 @@ reset_all_steps() { fi } -configure_log_permissions() { - local step_name="configure_log_permissions" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 +restore_ssh_config() { + if [[ -f "${BACKUP_DIR}/sshd_config" ]]; then + cp "${BACKUP_DIR}/sshd_config" /etc/ssh/sshd_config + systemctl restart sshd 2>/dev/null || true + print_success "Configuration SSH restaurée" + else + print_warning "Sauvegarde SSH non trouvée" fi - - print_step "Configuration des permissions des fichiers de log" - - # Définir les permissions correctes pour les répertoires et fichiers de logs - print_info "Configuration des permissions des logs..." - - # Répertoire /var/log - chmod 750 /var/log 2>/dev/null || true - chown root:adm /var/log 2>/dev/null || true - - # Fichiers de logs système - find /var/log -type f -exec chmod 640 {} \; 2>/dev/null || true - - # Logs sensibles avec permissions restreintes - for log_file in /var/log/auth.log /var/log/syslog /var/log/secure /var/log/messages; do - [[ -f "$log_file" ]] && { - chmod 600 "$log_file" 2>/dev/null || true - print_info " → $log_file : permissions 600" - } - done - - # Logs d'audit - [[ -d /var/log/audit ]] && { - chmod 700 /var/log/audit 2>/dev/null || true - chown root:root /var/log/audit 2>/dev/null || true - find /var/log/audit -type f -exec chmod 600 {} \; 2>/dev/null || true - print_info " → /var/log/audit : permissions 700" - } - - # Logs Apache/Nginx - for log_dir in /var/log/apache2 /var/log/nginx /var/log/httpd; do - [[ -d "$log_dir" ]] && { - chmod 750 "$log_dir" 2>/dev/null || true - find "$log_dir" -type f -name "*.log" -exec chmod 640 {} \; 2>/dev/null || true - print_info " → $log_dir : permissions 750" - } - done - - # Journal systemd - if command -v journalctl > /dev/null 2>&1; then - chmod 2750 /var/log/journal 2>/dev/null || true - chown root:systemd-journal /var/log/journal 2>/dev/null || true - print_info " → /var/log/journal : permissions 2750" +} + +restore_ufw_config() { + if command -v ufw > /dev/null 2>&1; then + ufw --force reset > /dev/null 2>&1 || true + print_success "Configuration UFW réinitialisée" fi - - # Création des fichiers de log manquants avec permissions sécurisées - for log_file in /var/log/btmp /var/log/wtmp; do - [[ ! -f "$log_file" ]] && { - touch "$log_file" - chmod 660 "$log_file" 2>/dev/null || true - chown root:utmp "$log_file" 2>/dev/null || true - print_info " → Création $log_file : permissions 660" - } - done - - # Application du sticky bit sur /var/log - chmod +t /var/log 2>/dev/null || true - - print_success "Permissions des logs configurées" - mark_step_done "$step_name" +} + +restore_fail2ban_config() { + if [[ -f "${BACKUP_DIR}/jail.local" ]]; then + cp "${BACKUP_DIR}/jail.local" /etc/fail2ban/jail.local 2>/dev/null || true + systemctl restart fail2ban 2>/dev/null || true + print_success "Configuration Fail2ban restaurée" + fi +} + +restore_all_configs() { + restore_ssh_config + restore_ufw_config + restore_fail2ban_config } list_all_steps() { @@ -533,6 +498,11 @@ parse_arguments() { print_info "Fuseau horaire: $AUTO_TIMEZONE" shift ;; + --change-root-pwd) + AUTO_CHANGE_ROOT_PWD="yes" + print_info "Changement mot de passe root activé" + shift + ;; --yes|-y) AUTO_YES="yes" print_info "Mode auto-confirmation activé" @@ -553,7 +523,7 @@ parse_arguments() { show_help() { echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${CYAN}║ AIDE - SYSTEM HARDENING SCRIPT v8.1 ║${NC}" + echo -e "${CYAN}║ AIDE - SYSTEM HARDENING SCRIPT v8.2 ║${NC}" echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" echo "" echo -e "${GREEN}USAGE:${NC}" @@ -571,6 +541,7 @@ show_help() { echo " --unattended Mode autonome (pas d'interaction)" echo " --ssh-port=PORT Définir le port SSH personnalisé" echo " --timezone=TZ Définir le fuseau horaire" + echo " --change-root-pwd Changer mot de passe root aléatoirement" echo " --yes, -y Répondre 'oui' à toutes les questions" echo " --help, -h Afficher cette aide" echo "" @@ -589,6 +560,7 @@ show_help() { echo " AUTO_SKIP_LYNIS Sauter audit Lynis (défaut: no)" echo " AUTO_YES Répondre oui automatiquement (défaut: no)" echo " AUTO_CLEANUP_SSH Nettoyer SSH automatiquement (défaut: no)" + echo " AUTO_CHANGE_ROOT_PWD Changer mdp root aléatoirement (défaut: no)" echo "" echo -e "${GREEN}EXEMPLES:${NC}" echo " # Mode autonome complet" @@ -674,7 +646,7 @@ get_ssh_port_to_use() { } # ============================================================================== -# FONCTIONS DE DURCISSEMENT (AMÉLIORÉES) +# FONCTIONS DE DURCISSEMENT (COMPLÈTES) # ============================================================================== install_security_tools() { @@ -711,6 +683,232 @@ install_security_tools() { mark_step_done "$step_name" } +change_root_password() { + local step_name="change_root_password" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Changement du mot de passe root avec mot de passe aléatoire" + + # Ne rien faire en conteneur LXC/Docker + if detect_container; then + print_warning "Conteneur détecté - changement de mot de passe root ignoré" + mark_step_done "$step_name" + return 0 + fi + + # Vérifier si on doit changer le mot de passe + if [[ "$AUTO_CHANGE_ROOT_PWD" != "yes" ]] && ! auto_confirm; then + echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${YELLOW}║ CHANGEMENT MOT DE PASSE ROOT ║${NC}" + echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${RED}⚠ Cette action va changer le mot de passe root de ce système.${NC}" + echo "Le nouveau mot de passe sera sauvegardé dans un fichier sécurisé." + echo "" + echo -e "${YELLOW}Conseils:${NC}" + echo " • Notez le mot de passe ou conservez le fichier en lieu sûr" + echo " • Utilisez une clé SSH pour l'accès à distance" + echo " • Le mot de passe sera perdu si vous ne le sauvegardez pas" + echo "" + + read -p "Voulez-vous changer le mot de passe root ? (o/N): " -r confirm_change + + if [[ ! "$confirm_change" =~ ^[Oo]$ ]]; then + print_info "Changement de mot de passe root annulé" + mark_step_done "$step_name" + return 0 + fi + else + print_info "Changement automatique du mot de passe root activé" + fi + + # Vérifier si l'utilisateur root a un shell valide + if ! grep -q "^root:" /etc/passwd; then + print_error "L'utilisateur root n'existe pas" + return 1 + fi + + local root_shell=$(grep "^root:" /etc/passwd | cut -d: -f7) + if [[ "$root_shell" == "/usr/sbin/nologin" ]] || [[ "$root_shell" == "/bin/false" ]]; then + print_warning "Root a un shell non interactif ($root_shell) - changement de mot de passe ignoré" + mark_step_done "$step_name" + return 0 + fi + + # Générer un mot de passe aléatoire sécurisé + print_info "Génération d'un mot de passe aléatoire sécurisé..." + + # Méthode 1: Utiliser openssl (préféré) + if command -v openssl > /dev/null 2>&1; then + NEW_ROOT_PASSWORD=$(openssl rand -base64 32 | tr -dc 'A-Za-z0-9!@#$%^&*()_+-=' | head -c 24) + # Méthode 2: Utiliser /dev/urandom + elif [[ -e /dev/urandom ]]; then + NEW_ROOT_PASSWORD=$(tr -dc 'A-Za-z0-9!@#$%^&*()_+-=' < /dev/urandom | head -c 24) + # Méthode 3: Alternative + else + NEW_ROOT_PASSWORD=$(date +%s | sha256sum | base64 | head -c 24) + fi + + # Fichier pour sauvegarder le mot de passe + local PWD_FILE="/root/root_password_$(date +%Y%m%d_%H%M%S).txt" + local PWD_FILE_ENCRYPTED="/root/root_password_$(date +%Y%m%d_%H%M%S).gpg" + + # Sauvegarder le mot de passe en clair (avec permissions restreintes) + cat > "$PWD_FILE" << EOF +=== MOT DE PASSE ROOT - $(hostname) - $(date) === +Nouveau mot de passe root: $NEW_ROOT_PASSWORD + +⚠ CONSERVEZ CE FICHIER EN LIEU SÛR ⚠ +• Ce mot de passe a été généré automatiquement +• Il est nécessaire pour les connexions root locales +• Utilisez des clés SSH pour les connexions distantes +• Vous ne serez PAS obligé de changer ce mot de passe à la première connexion +• Le mot de passe expire dans 90 jours (politique système) + +=== FIN === +EOF + + # Restreindre les permissions du fichier + chmod 600 "$PWD_FILE" + chown root:root "$PWD_FILE" + + # Essayer de chiffrer le fichier avec GPG si disponible + if command -v gpg > /dev/null 2>&1; then + print_info "Chiffrement du mot de passe avec GPG..." + if echo "$NEW_ROOT_PASSWORD" | gpg --symmetric --cipher-algo AES256 --output "$PWD_FILE_ENCRYPTED" 2>/dev/null; then + # Supprimer le fichier en clair + shred -u "$PWD_FILE" 2>/dev/null || rm -f "$PWD_FILE" + PWD_FILE="$PWD_FILE_ENCRYPTED" + print_info "Mot de passe chiffré avec succès" + else + print_warning "Échec du chiffrement GPG - conservation en clair" + fi + fi + + # Changer le mot de passe root SANS forcer le changement + print_info "Changement du mot de passe root..." + + # Utiliser chpasswd avec l'option -c pour utiliser crypt (SHA512) + if echo "root:$NEW_ROOT_PASSWORD" | chpasswd -c SHA512 2>/dev/null; then + print_success "Mot de passe root changé avec succès" + + # NE PAS forcer l'expiration immédiate (c'est ce qui cause le problème) + # On met seulement à jour la date du dernier changement + chage -d $(date +%Y-%m-%d) root 2>/dev/null || true + + # Appliquer la politique d'expiration normale (90 jours) + chage -M 90 root 2>/dev/null || true + + # Afficher les informations de sécurité + echo "" + echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ MOT DE PASSE ROOT MODIFIÉ ║${NC}" + echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${YELLOW}Fichier de sauvegarde:${NC} $PWD_FILE" + echo -e "${YELLOW}Permissions:${NC} $(stat -c %A "$PWD_FILE" 2>/dev/null || echo "N/A")" + echo "" + + # Afficher le statut du compte root + print_info "Statut du compte root:" + local last_change=$(chage -l root | grep "Last password change" | cut -d: -f2) + local expires=$(chage -l root | grep "Password expires" | cut -d: -f2) + echo " • Dernier changement: $last_change" + echo " • Expiration: $expires" + echo "" + + # Vérifier la sécurité du mot de passe + print_info "Vérification de la force du mot de passe..." + local pwd_length=${#NEW_ROOT_PASSWORD} + local has_upper=$(echo "$NEW_ROOT_PASSWORD" | grep -q '[A-Z]' && echo 1 || echo 0) + local has_lower=$(echo "$NEW_ROOT_PASSWORD" | grep -q '[a-z]' && echo 1 || echo 0) + local has_digit=$(echo "$NEW_ROOT_PASSWORD" | grep -q '[0-9]' && echo 1 || echo 0) + local has_special=$(echo "$NEW_ROOT_PASSWORD" | grep -q '[!@#$%^&*()_+-=]' && echo 1 || echo 0) + + local score=0 + [[ $pwd_length -ge 12 ]] && score=$((score + 2)) + [[ $has_upper -eq 1 ]] && score=$((score + 1)) + [[ $has_lower -eq 1 ]] && score=$((score + 1)) + [[ $has_digit -eq 1 ]] && score=$((score + 1)) + [[ $has_special -eq 1 ]] && score=$((score + 1)) + + if [[ $score -ge 5 ]]; then + echo -e "${GREEN}✓ Force du mot de passe: Excellente${NC}" + elif [[ $score -ge 4 ]]; then + echo -e "${YELLOW}✓ Force du mot de passe: Bonne${NC}" + else + echo -e "${RED}⚠ Force du mot de passe: Moyenne${NC}" + fi + + # Conseils de sécurité + echo "" + echo -e "${YELLOW}🔒 CONSEILS DE SÉCURITÉ:${NC}" + echo " 1. Sauvegardez le fichier sur un support externe" + echo " 2. Utilisez 'sudo' pour les tâches administratives" + echo " 3. Configurez l'authentification par clé SSH" + echo " 4. Désactivez la connexion root SSH si possible" + echo " 5. Le mot de passe expirera dans 90 jours" + echo "" + + # Information pour la session actuelle + if [[ "$USER" == "root" ]]; then + echo -e "${GREEN}✓ VOTRE SESSION ROOT RESTE ACTIVE${NC}" + echo " • Les nouvelles connexions root nécessiteront le nouveau mot de passe" + echo " • Vous ne serez PAS forcé de changer le mot de passe à la connexion" + echo "" + fi + + else + print_error "Échec du changement de mot de passe root" + rm -f "$PWD_FILE" "$PWD_FILE_ENCRYPTED" 2>/dev/null + return 1 + fi + + # Vérifier les accès SSH + print_info "Vérification de la configuration SSH..." + if grep -q "^PermitRootLogin.*yes" /etc/ssh/sshd_config 2>/dev/null; then + echo -e "${YELLOW}⚠ Connexion root SSH activée${NC}" + echo " • Considérez la désactivation avec: PermitRootLogin prohibit-password" + echo "" + fi + + # Journaliser l'action + log_message "Mot de passe root changé - Fichier: $PWD_FILE" "SECURITY" + + mark_step_done "$step_name" +} + +configure_process_accounting() { + local step_name="configure_process_accounting" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Configuration du Process Accounting" + + if detect_container; then + print_warning "Conteneur détecté - Process Accounting désactivé" + for service in acct.service psacct.service; do + systemctl list-unit-files | grep -q "^${service}" && { + systemctl stop "$service" 2>/dev/null || true + systemctl disable "$service" 2>/dev/null || true + systemctl mask "$service" 2>/dev/null || true + } + done + else + systemctl enable acct.service 2>/dev/null && \ + systemctl start acct.service 2>/dev/null && \ + print_success "Process Accounting activé" || \ + print_warning "Process Accounting non disponible" + fi + + mark_step_done "$step_name" +} + configure_sysctl_security() { local step_name="configure_sysctl_security" if check_step_done "$step_name"; then @@ -772,6 +970,74 @@ EOF mark_step_done "$step_name" } +configure_log_permissions() { + local step_name="configure_log_permissions" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Configuration des permissions des fichiers de log" + + # Définir les permissions correctes pour les répertoires et fichiers de logs + print_info "Configuration des permissions des logs..." + + # Répertoire /var/log + chmod 750 /var/log 2>/dev/null || true + chown root:adm /var/log 2>/dev/null || true + + # Fichiers de logs système + find /var/log -type f -exec chmod 640 {} \; 2>/dev/null || true + + # Logs sensibles avec permissions restreintes + for log_file in /var/log/auth.log /var/log/syslog /var/log/secure /var/log/messages; do + [[ -f "$log_file" ]] && { + chmod 600 "$log_file" 2>/dev/null || true + print_info " → $log_file : permissions 600" + } + done + + # Logs d'audit + [[ -d /var/log/audit ]] && { + chmod 700 /var/log/audit 2>/dev/null || true + chown root:root /var/log/audit 2>/dev/null || true + find /var/log/audit -type f -exec chmod 600 {} \; 2>/dev/null || true + print_info " → /var/log/audit : permissions 700" + } + + # Logs Apache/Nginx + for log_dir in /var/log/apache2 /var/log/nginx /var/log/httpd; do + [[ -d "$log_dir" ]] && { + chmod 750 "$log_dir" 2>/dev/null || true + find "$log_dir" -type f -name "*.log" -exec chmod 640 {} \; 2>/dev/null || true + print_info " → $log_dir : permissions 750" + } + done + + # Journal systemd + if command -v journalctl > /dev/null 2>&1; then + chmod 2750 /var/log/journal 2>/dev/null || true + chown root:systemd-journal /var/log/journal 2>/dev/null || true + print_info " → /var/log/journal : permissions 2750" + fi + + # Création des fichiers de log manquants avec permissions sécurisées + for log_file in /var/log/btmp /var/log/wtmp; do + [[ ! -f "$log_file" ]] && { + touch "$log_file" + chmod 660 "$log_file" 2>/dev/null || true + chown root:utmp "$log_file" 2>/dev/null || true + print_info " → Création $log_file : permissions 660" + } + done + + # Application du sticky bit sur /var/log + chmod +t /var/log 2>/dev/null || true + + print_success "Permissions des logs configurées" + mark_step_done "$step_name" +} + configure_pam_password_policy() { local step_name="configure_pam_password_policy" if check_step_done "$step_name"; then @@ -867,6 +1133,176 @@ configure_umask() { mark_step_done "$step_name" } +configure_aide_sha512() { + local step_name="configure_aide_sha512" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then + print_info "AIDE désactivé par configuration (AUTO_ENABLE_AIDE=no)" + mark_step_done "$step_name" + return 0 + fi + + print_step "Configuration AIDE pour SHA512" + + backup_file "/etc/aide/aide.conf" + + # Configuration simplifiée pour monitoring essentiel + cat > /etc/aide/aide.conf << 'EOF' +# Configuration AIDE simplifiée +@@define DBDIR /var/lib/aide +@@define LOGDIR /var/log/aide + +database=file:@@{DBDIR}/aide.db.gz +database_out=file:@@{DBDIR}/aide.db.new.gz +gzip_dbout=yes + +# Niveaux de vérification +Normal = sha512 +Large = sha512+ftype +Everything = sha512+ftype+p+i+n+u+g+s+m+c+acl+selinux+xattrs + +# Répertoires à surveiller +/etc Everything +/bin Large +/sbin Large +/usr/bin Large +/usr/sbin Large +/boot Large +/lib Large +/lib64 Large +/root Large + +# Exclusions +!/proc +!/sys +!/tmp +!/var/tmp +!/var/run +!/var/log +!/dev +EOF + + print_success "AIDE configuré pour SHA512" + mark_step_done "$step_name" +} + +initialize_aide_db() { + local step_name="initialize_aide_db" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then + mark_step_done "$step_name" + return 0 + fi + + print_step "Initialisation de la base de données AIDE" + + print_info "Création de la base de données de référence..." + + if aide --init --config /etc/aide/aide.conf 2>&1 | tee -a "$LOG_FILE"; then + if [[ -f /var/lib/aide/aide.db.new.gz ]]; then + mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz + print_success "Base de données AIDE initialisée" + else + print_warning "Fichier de base de données non trouvé" + fi + else + print_error "Échec initialisation AIDE" + return 1 + fi + + mark_step_done "$step_name" +} + +configure_clamav() { + local step_name="configure_clamav" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + if [[ "$AUTO_ENABLE_CLAMAV" != "yes" ]]; then + print_info "ClamAV désactivé par configuration (AUTO_ENABLE_CLAMAV=no)" + mark_step_done "$step_name" + return 0 + fi + + print_step "Configuration de ClamAV" + + print_info "Mise à jour de la base de données ClamAV..." + systemctl stop clamav-freshclam 2>/dev/null || true + freshclam --quiet 2>/dev/null || print_warning "Échec mise à jour ClamAV" + + systemctl enable clamav-freshclam 2>/dev/null || true + systemctl start clamav-freshclam 2>/dev/null || true + systemctl enable clamav-daemon 2>/dev/null || true + systemctl start clamav-daemon 2>/dev/null || true + + print_success "ClamAV configuré" + mark_step_done "$step_name" +} + +configure_chrony() { + local step_name="configure_chrony" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Configuration de la synchronisation horaire" + + if detect_container; then + print_warning "Conteneur détecté - NTP géré par l'hôte" + mark_step_done "$step_name" + return 0 + fi + + backup_file "/etc/chrony/chrony.conf" + + # Configuration optimisée pour la France + cat > /etc/chrony/chrony.conf << EOF +# Serveurs NTP français +pool 2.debian.pool.ntp.org iburst +server 0.fr.pool.ntp.org iburst +server 1.fr.pool.ntp.org iburst +server 2.fr.pool.ntp.org iburst +server 3.fr.pool.ntp.org iburst + +# Fichiers de travail +driftfile /var/lib/chrony/chrony.drift +logdir /var/log/chrony + +# Ajustements +makestep 1.0 3 +rtcsync + +# Restrictions +allow 127.0.0.1 +deny all + +# Stratum local +local stratum 10 +EOF + + # Définir le fuseau horaire + timedatectl set-timezone "$AUTO_TIMEZONE" 2>/dev/null || \ + print_warning "Impossible de définir le fuseau horaire $AUTO_TIMEZONE" + + # Redémarrer le service + systemctl restart chrony 2>/dev/null && \ + print_success "Chrony configuré" || \ + print_warning "Erreur démarrage Chrony" + + mark_step_done "$step_name" +} + harden_ssh() { local step_name="harden_ssh" if check_step_done "$step_name"; then @@ -976,6 +1412,31 @@ EOF mark_step_done "$step_name" } +configure_banners() { + local step_name="configure_banners" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Configuration des bannières légales" + + local banner_text="╔════════════════════════════════════════════════════════════╗ +║ SYSTÈME SÉCURISÉ ║ +║ ║ +║ Accès réservé aux personnes autorisées uniquement. ║ +║ Toute tentative d'accès non autorisée est interdite ║ +║ et sera tracée et poursuivie selon la loi. ║ +║ ║ +║ Les activités sont surveillées et enregistrées. ║ +╚════════════════════════════════════════════════════════════╝" + + echo "$banner_text" | tee /etc/issue /etc/issue.net /etc/motd > /dev/null + + print_success "Bannières légales configurées" + mark_step_done "$step_name" +} + configure_firewall_ports() { local step_name="configure_firewall_ports" if check_step_done "$step_name"; then @@ -1166,459 +1627,6 @@ EOF mark_step_done "$step_name" } -configure_aide_sha512() { - local step_name="configure_aide_sha512" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then - print_info "AIDE désactivé par configuration (AUTO_ENABLE_AIDE=no)" - mark_step_done "$step_name" - return 0 - fi - - print_step "Configuration AIDE pour SHA512" - - backup_file "/etc/aide/aide.conf" - - # Configuration simplifiée pour monitoring essentiel - cat > /etc/aide/aide.conf << 'EOF' -# Configuration AIDE simplifiée -@@define DBDIR /var/lib/aide -@@define LOGDIR /var/log/aide - -database=file:@@{DBDIR}/aide.db.gz -database_out=file:@@{DBDIR}/aide.db.new.gz -gzip_dbout=yes - -# Niveaux de vérification -Normal = sha512 -Large = sha512+ftype -Everything = sha512+ftype+p+i+n+u+g+s+m+c+acl+selinux+xattrs - -# Répertoires à surveiller -/etc Everything -/bin Large -/sbin Large -/usr/bin Large -/usr/sbin Large -/boot Large -/lib Large -/lib64 Large -/root Large - -# Exclusions -!/proc -!/sys -!/tmp -!/var/tmp -!/var/run -!/var/log -!/dev -EOF - - print_success "AIDE configuré pour SHA512" - mark_step_done "$step_name" -} - -initialize_aide_db() { - local step_name="initialize_aide_db" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then - mark_step_done "$step_name" - return 0 - fi - - print_step "Initialisation de la base de données AIDE" - - print_info "Création de la base de données de référence..." - - if aide --init --config /etc/aide/aide.conf 2>&1 | tee -a "$LOG_FILE"; then - if [[ -f /var/lib/aide/aide.db.new.gz ]]; then - mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz - print_success "Base de données AIDE initialisée" - else - print_warning "Fichier de base de données non trouvé" - fi - else - print_error "Échec initialisation AIDE" - return 1 - fi - - mark_step_done "$step_name" -} - -configure_chrony() { - local step_name="configure_chrony" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - print_step "Configuration de la synchronisation horaire" - - if detect_container; then - print_warning "Conteneur détecté - NTP géré par l'hôte" - mark_step_done "$step_name" - return 0 - fi - - backup_file "/etc/chrony/chrony.conf" - - # Configuration optimisée pour la France - cat > /etc/chrony/chrony.conf << EOF -# Serveurs NTP français -pool 2.debian.pool.ntp.org iburst -server 0.fr.pool.ntp.org iburst -server 1.fr.pool.ntp.org iburst -server 2.fr.pool.ntp.org iburst -server 3.fr.pool.ntp.org iburst - -# Fichiers de travail -driftfile /var/lib/chrony/chrony.drift -logdir /var/log/chrony - -# Ajustements -makestep 1.0 3 -rtcsync - -# Restrictions -allow 127.0.0.1 -deny all - -# Stratum local -local stratum 10 -EOF - - # Définir le fuseau horaire - timedatectl set-timezone "$AUTO_TIMEZONE" 2>/dev/null || \ - print_warning "Impossible de définir le fuseau horaire $AUTO_TIMEZONE" - - # Redémarrer le service - systemctl restart chrony 2>/dev/null && \ - print_success "Chrony configuré" || \ - print_warning "Erreur démarrage Chrony" - - mark_step_done "$step_name" -} - -configure_automatic_updates() { - local step_name="configure_automatic_updates" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - print_step "Configuration des mises à jour automatiques" - - # Configuration unattended-upgrades - cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF' -Unattended-Upgrade::Allowed-Origins { - "${distro_id}:${distro_codename}"; - "${distro_id}:${distro_codename}-security"; - "${distro_id}ESM:${distro_codename}"; -}; -Unattended-Upgrade::Origins-Pattern { - "origin=Debian,codename=${distro_codename},label=Debian-Security"; -}; -Unattended-Upgrade::AutoFixInterruptedDpkg "true"; -Unattended-Upgrade::MinimalSteps "true"; -Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; -Unattended-Upgrade::Remove-Unused-Dependencies "true"; -Unattended-Upgrade::Automatic-Reboot "false"; -Unattended-Upgrade::Automatic-Reboot-Time "04:00"; -EOF - - # Configuration périodique - cat > /etc/apt/apt.conf.d/10periodic << 'EOF' -APT::Periodic::Update-Package-Lists "1"; -APT::Periodic::Download-Upgradeable-Packages "1"; -APT::Periodic::AutocleanInterval "7"; -APT::Periodic::Unattended-Upgrade "1"; -EOF - - print_success "Mises à jour automatiques configurées" - mark_step_done "$step_name" -} - -configure_aide_cron() { - local step_name="configure_aide_cron" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then - mark_step_done "$step_name" - return 0 - fi - - print_step "Configuration des vérifications AIDE planifiées" - - # Tâche cron quotidienne - cat > /etc/cron.daily/aide-check << 'EOF' -#!/bin/bash -LOGFILE="/var/log/aide-check-$(date +%Y%m%d).log" - -if command -v aide > /dev/null; then - echo "=== Vérification AIDE $(date) ===" > "$LOGFILE" - - if /usr/bin/aide --check 2>&1 >> "$LOGFILE"; then - echo "AIDE: Vérification OK - $(date)" >> "$LOGFILE" - else - echo "AIDE: ALERTE - Changements détectés - $(date)" >> "$LOGFILE" - # Notification simple - echo "Alerte AIDE sur $(hostname)" | mail -s "[AIDE] Changements détectés" root 2>/dev/null || true - fi - - # Nettoyage des vieux logs (30 jours) - find /var/log -name "aide-check-*.log" -mtime +30 -delete 2>/dev/null || true -fi -EOF - - chmod 755 /etc/cron.daily/aide-check - - print_success "Vérification AIDE quotidienne configurée" - mark_step_done "$step_name" -} - -run_lynis_audit() { - local step_name="run_lynis_audit" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - if [[ "$AUTO_SKIP_LYNIS" == "yes" ]]; then - print_info "Audit Lynis ignoré (AUTO_SKIP_LYNIS=yes)" - mark_step_done "$step_name" - return 0 - fi - - print_step "Exécution de l'audit Lynis" - - print_info "Audit système en cours..." - - lynis audit system --quick --no-colors > "$SECURITY_REPORT" 2>&1 - - # Extraire le score - local score=$(grep -i "Hardening index" "$SECURITY_REPORT" | grep -oP '\d+' | head -1) - local max_score=100 - [[ -z "$score" ]] && score=0 - - # Afficher le score - local percentage=$((score * 100 / max_score)) - local bar_length=50 - local filled_length=$((percentage * bar_length / 100)) - - echo "" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo " SCORE LYNIS FINAL" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo -n "Score: [" - for ((i=0; i /dev/null 2>&1 && ufw status | grep -q "22/tcp"; then - ufw delete allow 22/tcp 2>/dev/null || true - fi - - # Redémarrer SSH - if sshd -t && systemctl restart sshd 2>/dev/null; then - print_success "Port SSH 22 supprimé - SSH disponible uniquement sur le port $ssh_port" - else - print_error "Erreur configuration - restauration..." - cp "${BACKUP_DIR}/sshd_config" /etc/ssh/sshd_config - systemctl restart sshd 2>/dev/null - return 1 - fi - else - print_warning "Nettoyage SSH non effectué (utilisez --cleanup-ssh ou AUTO_CLEANUP_SSH=yes)" - print_info "Ports SSH actifs: 22 (temporaire) et $ssh_port (permanent)" - fi -} - -# ============================================================================== -# FONCTIONS PRINCIPALES -# ============================================================================== - -check_requirements() { - print_info "Vérification des prérequis..." - - [[ $EUID -ne 0 ]] && { - print_error "Ce script doit être exécuté en tant que root" - exit 1 - } - - [[ ! -f /etc/debian_version ]] && { - print_warning "Système non Debian/Ubuntu - compatibilité limitée" - if ! auto_confirm; then - read -p "Continuer malgré tout ? (o/N): " -r confirm - [[ "$confirm" != "o" ]] && exit 1 - fi - } - - mkdir -p "$BACKUP_DIR" - touch "$LOG_FILE" "$STATUS_FILE" 2>/dev/null || { - print_error "Impossible de créer les fichiers de log" - exit 1 - } - - print_success "Prérequis vérifiés" -} - -print_header() { - clear - - echo -e "${CYAN}" - echo "╔══════════════════════════════════════════════════════════════════╗" - echo "║ SCRIPT DE DURCISSEMENT SYSTÈME OPTIMISÉ v8.1 ║" - echo "║ Sécurité Debian/Ubuntu ║" - echo "║ MODE AUTONOME ║" - echo "╚══════════════════════════════════════════════════════════════════╝" - echo -e "${NC}" - - echo -e "${BLUE}Informations système:${NC}" - echo " • Distribution: $(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | tr -d '\"')" - echo " • Noyau: $(uname -r)" - echo " • Hostname: $(hostname)" - echo " • Type: $(detect_container && echo "Conteneur/LXC" || echo "Hôte physique/VM")" - echo "" - - echo -e "${BLUE}Configuration automatique:${NC}" - echo " • Port SSH: $AUTO_SSH_PORT" - echo " • Fuseau horaire: $AUTO_TIMEZONE" - echo " • Umask: $AUTO_UMASK" - echo " • Durée max mot de passe: $AUTO_PASS_MAX_DAYS jours" - echo " • Mode autonome: $( [[ "$UNATTENDED" == true ]] && echo "Activé" || echo "Désactivé" )" - echo "" - - echo -e "${YELLOW}Configuration des composants:${NC}" - echo " • Fail2ban: $( [[ "$AUTO_ENABLE_FAIL2BAN" == "yes" ]] && echo "✓" || echo "✗" )" - echo " • UFW: $( [[ "$AUTO_ENABLE_UFW" == "yes" ]] && echo "✓" || echo "✗" )" - echo " • AIDE: $( [[ "$AUTO_ENABLE_AIDE" == "yes" ]] && echo "✓" || echo "✗" )" - echo " • ClamAV: $( [[ "$AUTO_ENABLE_CLAMAV" == "yes" ]] && echo "✓" || echo "✗" )" - echo "" - - if ! auto_confirm; then - echo -e "${YELLOW}⚠ Ce script va modifier profondément la configuration système ⚠${NC}" - echo "" - read -p "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..." - else - echo -e "${GREEN}Mode autonome activé - Démarrage automatique dans 3 secondes...${NC}" - sleep 3 - fi -} - -configure_process_accounting() { - local step_name="configure_process_accounting" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - print_step "Configuration du Process Accounting" - - if detect_container; then - print_warning "Conteneur détecté - Process Accounting désactivé" - for service in acct.service psacct.service; do - systemctl list-unit-files | grep -q "^${service}" && { - systemctl stop "$service" 2>/dev/null || true - systemctl disable "$service" 2>/dev/null || true - systemctl mask "$service" 2>/dev/null || true - } - done - else - systemctl enable acct.service 2>/dev/null && \ - systemctl start acct.service 2>/dev/null && \ - print_success "Process Accounting activé" || \ - print_warning "Process Accounting non disponible" - fi - - mark_step_done "$step_name" -} - -configure_clamav() { - local step_name="configure_clamav" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - print_step "Configuration de ClamAV" - - print_info "Mise à jour de la base de données ClamAV..." - systemctl stop clamav-freshclam 2>/dev/null || true - freshclam --quiet 2>/dev/null || print_warning "Échec mise à jour ClamAV" - - systemctl enable clamav-freshclam 2>/dev/null || true - systemctl start clamav-freshclam 2>/dev/null || true - systemctl enable clamav-daemon 2>/dev/null || true - systemctl start clamav-daemon 2>/dev/null || true - - print_success "ClamAV configuré" - mark_step_done "$step_name" -} - -configure_banners() { - local step_name="configure_banners" - if check_step_done "$step_name"; then - skip_step "${STEP_DESCRIPTIONS[$step_name]}" - return 0 - fi - - print_step "Configuration des bannières légales" - - local banner_text="╔════════════════════════════════════════════════════════════╗ -║ SYSTÈME SÉCURISÉ ║ -║ ║ -║ Accès réservé aux personnes autorisées uniquement. ║ -║ Toute tentative d'accès non autorisée est interdite ║ -║ et sera tracée et poursuivie selon la loi. ║ -║ ║ -║ Les activités sont surveillées et enregistrées. ║ -╚════════════════════════════════════════════════════════════╝" - - echo "$banner_text" | tee /etc/issue /etc/issue.net /etc/motd > /dev/null - - print_success "Bannières légales configurées" - mark_step_done "$step_name" -} - remove_unneeded_packages() { local step_name="remove_unneeded_packages" if check_step_done "$step_name"; then @@ -1751,6 +1759,86 @@ verify_packages_integrity() { mark_step_done "$step_name" } +configure_automatic_updates() { + local step_name="configure_automatic_updates" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + print_step "Configuration des mises à jour automatiques" + + # Configuration unattended-upgrades + cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF' +Unattended-Upgrade::Allowed-Origins { + "${distro_id}:${distro_codename}"; + "${distro_id}:${distro_codename}-security"; + "${distro_id}ESM:${distro_codename}"; +}; +Unattended-Upgrade::Origins-Pattern { + "origin=Debian,codename=${distro_codename},label=Debian-Security"; +}; +Unattended-Upgrade::AutoFixInterruptedDpkg "true"; +Unattended-Upgrade::MinimalSteps "true"; +Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; +Unattended-Upgrade::Remove-Unused-Dependencies "true"; +Unattended-Upgrade::Automatic-Reboot "false"; +Unattended-Upgrade::Automatic-Reboot-Time "04:00"; +EOF + + # Configuration périodique + cat > /etc/apt/apt.conf.d/10periodic << 'EOF' +APT::Periodic::Update-Package-Lists "1"; +APT::Periodic::Download-Upgradeable-Packages "1"; +APT::Periodic::AutocleanInterval "7"; +APT::Periodic::Unattended-Upgrade "1"; +EOF + + print_success "Mises à jour automatiques configurées" + mark_step_done "$step_name" +} + +configure_aide_cron() { + local step_name="configure_aide_cron" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + if [[ "$AUTO_ENABLE_AIDE" != "yes" ]]; then + mark_step_done "$step_name" + return 0 + fi + + print_step "Configuration des vérifications AIDE planifiées" + + # Tâche cron quotidienne + cat > /etc/cron.daily/aide-check << 'EOF' +#!/bin/bash +LOGFILE="/var/log/aide-check-$(date +%Y%m%d).log" + +if command -v aide > /dev/null; then + echo "=== Vérification AIDE $(date) ===" > "$LOGFILE" + + if /usr/bin/aide --check 2>&1 >> "$LOGFILE"; then + echo "AIDE: Vérification OK - $(date)" >> "$LOGFILE" + else + echo "AIDE: ALERTE - Changements détectés - $(date)" >> "$LOGFILE" + # Notification simple + echo "Alerte AIDE sur $(hostname)" | mail -s "[AIDE] Changements détectés" root 2>/dev/null || true + fi + + # Nettoyage des vieux logs (30 jours) + find /var/log -name "aide-check-*.log" -mtime +30 -delete 2>/dev/null || true +fi +EOF + + chmod 755 /etc/cron.daily/aide-check + + print_success "Vérification AIDE quotidienne configurée" + mark_step_done "$step_name" +} + harden_smtp_banner() { local step_name="harden_smtp_banner" if check_step_done "$step_name"; then @@ -2022,6 +2110,162 @@ prepare_ssh_cleanup() { mark_step_done "$step_name" } +run_lynis_audit() { + local step_name="run_lynis_audit" + if check_step_done "$step_name"; then + skip_step "${STEP_DESCRIPTIONS[$step_name]}" + return 0 + fi + + if [[ "$AUTO_SKIP_LYNIS" == "yes" ]]; then + print_info "Audit Lynis ignoré (AUTO_SKIP_LYNIS=yes)" + mark_step_done "$step_name" + return 0 + fi + + print_step "Exécution de l'audit Lynis" + + print_info "Audit système en cours..." + + lynis audit system --quick --no-colors > "$SECURITY_REPORT" 2>&1 + + # Extraire le score + local score=$(grep -i "Hardening index" "$SECURITY_REPORT" | grep -oP '\d+' | head -1) + local max_score=100 + [[ -z "$score" ]] && score=0 + + # Afficher le score + local percentage=$((score * 100 / max_score)) + local bar_length=50 + local filled_length=$((percentage * bar_length / 100)) + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo " SCORE LYNIS FINAL" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo -n "Score: [" + for ((i=0; i /dev/null 2>&1 && ufw status | grep -q "22/tcp"; then + ufw delete allow 22/tcp 2>/dev/null || true + fi + + # Redémarrer SSH + if sshd -t && systemctl restart sshd 2>/dev/null; then + print_success "Port SSH 22 supprimé - SSH disponible uniquement sur le port $ssh_port" + else + print_error "Erreur configuration - restauration..." + cp "${BACKUP_DIR}/sshd_config" /etc/ssh/sshd_config + systemctl restart sshd 2>/dev/null + return 1 + fi + else + print_warning "Nettoyage SSH non effectué (utilisez --cleanup-ssh ou AUTO_CLEANUP_SSH=yes)" + print_info "Ports SSH actifs: 22 (temporaire) et $ssh_port (permanent)" + fi +} + +# ============================================================================== +# FONCTIONS PRINCIPALES +# ============================================================================== + +check_requirements() { + print_info "Vérification des prérequis..." + + [[ $EUID -ne 0 ]] && { + print_error "Ce script doit être exécuté en tant que root" + exit 1 + } + + [[ ! -f /etc/debian_version ]] && { + print_warning "Système non Debian/Ubuntu - compatibilité limitée" + if ! auto_confirm; then + read -p "Continuer malgré tout ? (o/N): " -r confirm + [[ "$confirm" != "o" ]] && exit 1 + fi + } + + mkdir -p "$BACKUP_DIR" + touch "$LOG_FILE" "$STATUS_FILE" 2>/dev/null || { + print_error "Impossible de créer les fichiers de log" + exit 1 + } + + print_success "Prérequis vérifiés" +} + +print_header() { + clear + + echo -e "${CYAN}" + echo "╔══════════════════════════════════════════════════════════════════╗" + echo "║ SCRIPT DE DURCISSEMENT SYSTÈME OPTIMISÉ v8.2 ║" + echo "║ Sécurité Debian/Ubuntu ║" + echo "║ MODE AUTONOME ║" + echo "╚══════════════════════════════════════════════════════════════════╝" + echo -e "${NC}" + + echo -e "${BLUE}Informations système:${NC}" + echo " • Distribution: $(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | tr -d '\"')" + echo " • Noyau: $(uname -r)" + echo " • Hostname: $(hostname)" + echo " • Type: $(detect_container && echo "Conteneur/LXC" || echo "Hôte physique/VM")" + echo "" + + echo -e "${BLUE}Configuration automatique:${NC}" + echo " • Port SSH: $AUTO_SSH_PORT" + echo " • Fuseau horaire: $AUTO_TIMEZONE" + echo " • Umask: $AUTO_UMASK" + echo " • Durée max mot de passe: $AUTO_PASS_MAX_DAYS jours" + echo " • Mode autonome: $( [[ "$UNATTENDED" == true ]] && echo "Activé" || echo "Désactivé" )" + echo "" + + echo -e "${YELLOW}Configuration des composants:${NC}" + echo " • Fail2ban: $( [[ "$AUTO_ENABLE_FAIL2BAN" == "yes" ]] && echo "✓" || echo "✗" )" + echo " • UFW: $( [[ "$AUTO_ENABLE_UFW" == "yes" ]] && echo "✓" || echo "✗" )" + echo " • AIDE: $( [[ "$AUTO_ENABLE_AIDE" == "yes" ]] && echo "✓" || echo "✗" )" + echo " • ClamAV: $( [[ "$AUTO_ENABLE_CLAMAV" == "yes" ]] && echo "✓" || echo "✗" )" + echo "" + + if ! auto_confirm; then + echo -e "${YELLOW}⚠ Ce script va modifier profondément la configuration système ⚠${NC}" + echo "" + read -p "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..." + else + echo -e "${GREEN}Mode autonome activé - Démarrage automatique dans 3 secondes...${NC}" + sleep 3 + fi +} + print_summary() { echo -e "\n${GREEN}" echo "╔══════════════════════════════════════════════════════════════════╗" @@ -2034,6 +2278,7 @@ print_summary() { echo -e "\n${MAGENTA}════════════════════ RÉSUMÉ FINAL ════════════════════${NC}\n" echo -e "${YELLOW}🔐 CONFIGURATIONS APPLIQUÉES:${NC}" + echo " • Mot de passe root: $( [[ "$AUTO_CHANGE_ROOT_PWD" == "yes" ]] && echo "Changé aléatoirement" || echo "Non modifié" )" echo " • SSH: Port $ssh_port, authentification par clé uniquement" echo " • Pare-feu: $( [[ "$AUTO_ENABLE_UFW" == "yes" ]] && echo "UFW activé" || echo "UFW désactivé" )" echo " • Fail2ban: $( [[ "$AUTO_ENABLE_FAIL2BAN" == "yes" ]] && echo "Activé" || echo "Désactivé" )" @@ -2098,14 +2343,16 @@ main() { print_header log_message "==================================================" "START" - log_message "Démarrage durcissement système v8.1" "START" + log_message "Démarrage durcissement système v8.2" "START" log_message "Mode: $( [[ "$UNATTENDED" == true ]] && echo "Autonome" || echo "Interactif" )" "START" log_message "Port SSH: $AUTO_SSH_PORT" "START" log_message "Hostname: $(hostname)" "START" + log_message "Changement mdp root: $AUTO_CHANGE_ROOT_PWD" "START" log_message "==================================================" "START" # Exécution des étapes install_security_tools + change_root_password detect_open_ports configure_process_accounting configure_sysctl_security @@ -2155,4 +2402,4 @@ main() { trap 'print_error "Script interrompu"; exit 130' INT TERM -[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main "$@" +[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main "$@" \ No newline at end of file