check_deb_status() { local type="$1" params="$2" case "$type" in "pkg") dpkg -s "$params" >/dev/null 2>&1 ;; "sys") func="check_deb_${type}_${params}" if declare -F "$func" >/dev/null; then "$func" else return 1 fi #case "$params" in # "apparmor")check_deb_sys_apparmor;; # "ipv6") [[ $(sysctl -n net.ipv6.conf.all.disable_ipv6 2>/dev/null) -eq 1 ]] ;; # "mail") grep -q "ADMIN_MAIL=" /etc/environment 2>/dev/null ;; # "zabbix") dpkg -s zabbix-agent >/dev/null 2>&1 ;; # "msmtp") [[ -f /etc/msmtprc ]] ;; # *) return 1 ;; #esac ;; esac } do_deb_install_action() { local type="$1" params="$2" func case "$type" in "pkg") $SUDO apt-get install -y "$params" ;; "sys") func="do_deb_${type}_${params}" if declare -F "$func" >/dev/null; then "$func" else msg_error "la fonction do_deb_${type}_${params} n'est pas définie...(skip)" fi esac } check_deb_sys_ipv6(){ if [[ $(sysctl -n net.ipv6.conf.all.disable_ipv6 2>/dev/null) -eq 1 ]]; then return 0 else return 1 fi } check_deb_sys_zabbix(){ if dpkg -s zabbix-agent >/dev/null 2>&1; then return 0 else return 1 fi } check_deb_sys_msmtp(){ if [[ -f /etc/msmtprc ]]; then return 1 else return 0 fi } check_deb_sys_mail(){ if grep -q "ADMIN_MAIL=" /etc/environment 2>/dev/null; then return 0 else return 1 fi } check_deb_sys_fail2ban() { # Si le paquet n'est PAS installé, on ne propose pas la config if ! dpkg -s fail2ban >/dev/null 2>&1; then return 0 # Masquer (on attend l'étape 1) fi # Si le paquet est là, on affiche la config tant que jail.local n'existe pas if [[ ! -f /etc/fail2ban/jail.local ]]; then return 1 # AFFICHER else return 0 # MASQUER (Déjà configuré) fi } check_deb_sys_apparmor(){ if is_sys_lxc; then ! systemctl is-enabled apparmor >/dev/null 2>&1 #Container else [[ $($SUDO cat /sys/module/apparmor/parameters/enabled 2>/dev/null) == "Y" ]] #VM fi } check_deb_sys_ufw() { # 1. Si le paquet n'est pas là, on ne propose rien if ! dpkg -s ufw >/dev/null 2>&1; then return 0 fi # 2. On vérifie l'état réel du firewall # Si 'Status: active' est trouvé, on cache (0), sinon on affiche (1) if $SUDO ufw status | grep -q "Status: active"; then return 0 # Masquer else return 1 # AFFICHER fi } do_deb_sys_ufw() { local ports_to_allow=() input_port="" current_ssh_port msg_info "Configuration interactive du Firewall UFW" # 1. On commence par les bases $SUDO ufw default deny incoming $SUDO ufw default allow outgoing # 2. Boucle de saisie des ports while true; do read -p "Entrez un port à ouvrir (ou 'f' pour terminer) : " input_port [[ "$input_port" == "f" ]] && break # Validation : est-ce un nombre ? if [[ ! "$input_port" =~ ^[0-9]+$ ]]; then msg_error "Veuillez entrer un numéro de port valide (chiffres uniquement)." continue fi # Gestion des DOUBLONS if [[ " ${ports_to_allow[@]} " =~ " ${input_port} " ]]; then msg_warning "Le port $input_port est déjà dans votre liste de saisie." else ports_to_allow+=("$input_port") msg_success "Port $input_port ajouté à la file d'attente." fi done # 3. Sécurité SSH (vérification si le port 22 ou le port courant est là) # On récupère le port SSH actuel pour éviter de se lock current_ssh_port=$(ss -tlnp | grep sshd | awk '{print $4}' | awk -F':' '{print $NF}' | head -n1) current_ssh_port=${current_ssh_port:-22} if [[ ! " ${ports_to_allow[@]} " =~ " ${current_ssh_port} " ]]; then msg_warning "ATTENTION : Votre port SSH ($current_ssh_port) n'est pas dans la liste !" read -p "Voulez-vous l'ajouter par sécurité ? (O/n) : " add_ssh [[ "$add_ssh" != "n" ]] && ports_to_allow+=("$current_ssh_port") fi # 4. Application des règles sans doublons dans UFW msg_info "Application des règles..." for port in "${ports_to_allow[@]}"; do # On utilise /tcp par défaut pour être strict comme on l'a dit $SUDO ufw allow "$port"/tcp >/dev/null done # 5. Désactiver l'IPv6 dans UFW msg_info "Desactivation de l IP v6..." $SUDO sed -i 's/IPV6=yes/IPV6=no/' /etc/default/ufw # 6. Activation finale if $SUDO ufw --force enable; then msg_success "Firewall activé avec les ports : ${ports_to_allow[*]}" fi } do_deb_sys_fail2ban() { msg_info "Configuration de Fail2Ban..." # On crée la configuration personnalisée $SUDO tee /etc/fail2ban/jail.local </dev/null) != "Y" ]]; then if [ -f /etc/default/grub ]; then $SUDO sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="apparmor=1 security=apparmor /' /etc/default/grub $SUDO update-grub msg_warning "Activation GRUB faite. Reboot nécessaire." fi else msg_success "AppArmor est déjà actif dans le Kernel." fi fi } do_deb_sys_zabbix(){ read -rp "IP Zabbix : " ip; $SUDO apt-get install -y zabbix-agent; $SUDO sed -i "s/^Server=127.0.0.1/Server=$ip/" /etc/zabbix/zabbix_agentd.conf; $SUDO systemctl restart zabbix-agent } do_deb_sys_ipv6(){ echo "net.ipv6.conf.all.disable_ipv6 = 1" | $SUDO tee -a /etc/sysctl.conf > /dev/null && $SUDO sysctl -p } do_deb_sys_env_mail(){ read -rp "Mail admin : " m; echo "ADMIN_MAIL=\"$m\"" | $SUDO tee -a /etc/environment > /dev/null # shellcheck disable=SC2034 ADMIN_MAIL=$m } do_deb_sys_static_ip() { local interface interface=$(ip -o link show | awk -F': ' '{print $2}' | grep -v 'lo' | head -n1) echo -e "${COLOR_WHITE}Configuration de l'interface : ${COLOR_CYAN}$interface${NONE}" read -rp "Entrez l'IP (ex: 192.168.1.50) : " new_ip read -rp "Entrez la Passerelle (Gateway) : " new_gw read -rp "Entrez le DNS Primaire (ex: 1.1.1.1) : " dns1 read -rp "Entrez le DNS Secondaire (ex: 8.8.8.8) : " dns2 # Validation minimale if [[ -z "$new_ip" || -z "$new_gw" || -z "$dns1" ]]; then msg_error "IP, Gateway ou DNS Primaire manquant. Annulation." return 1 fi # Si le DNS2 est vide, on peut mettre une valeur par défaut ou laisser vide [[ -z "$dns2" ]] && dns2="8.8.4.4" # --- CAS 1 : NETPLAN (Ubuntu / Debian récentes) --- if [ -d "/etc/netplan" ]; then msg_info "Configuration via Netplan..." $SUDO bash -c "cat < /etc/netplan/99-frogg-static.yaml network: version: 2 renderer: networkd ethernets: $interface: addresses: [$new_ip/24] routes: [{to: default, via: $new_gw}] nameservers: addresses: [$dns1, $dns2] EOF" $SUDO netplan apply # --- CAS 2 : INTERFACES (Debian classique) --- elif [ -f "/etc/network/interfaces" ]; then msg_info "Configuration via /etc/network/interfaces..." $SUDO bash -c "cat < /etc/network/interfaces.d/$interface auto $interface iface $interface inet static address $new_ip netmask 255.255.255.0 gateway $new_gw dns-nameservers $dns1 $dns2 EOF" $SUDO systemctl restart networking else msg_error "Aucun gestionnaire réseau trouvé." return 1 fi msg_success "$interface > IP [$new_ip] Gateway[$new_gw] DNS[$dns1, $dns2]" } do_deb_sys_hostname() { local old_h current_ip old_h=$(hostname) echo -e "${COLOR_WHITE}Nom actuel : ${COLOR_CYAN}$old_h${NONE}" read -rp "Nouveau Hostname (FQDN recommandé, ex: machine.domaine.com) : " new_h if [[ -n "$new_h" ]]; then # 1. On définit le hostname dans le système $SUDO hostnamectl set-hostname "$new_h" # 2. On extrait le nom court local short_h="${new_h%%.*}" # 3. Mise à jour de /etc/hosts # STRATÉGIE : On identifie la ligne qui contient l'ancien hostname # et on la remplace intégralement par "IP FQDN NOM_COURT" # On récupère l'IP associée à l'ancien hostname dans /etc/hosts current_ip=$(grep -w "$old_h" /etc/hosts | awk '{print $1}' | head -n1) if [[ -n "$current_ip" ]]; then msg_info "Mise à jour de la ligne pour l'IP $current_ip..." # On remplace toute la ligne qui commence par cette IP $SUDO sed -i "s/^$current_ip.*/$current_ip\t$new_h $short_h/" /etc/hosts else # Si on ne trouve pas l'IP, on ajoute une ligne propre sur la loopback locale msg_warning "IP non trouvée dans /etc/hosts, ajout sur 127.0.1.1" echo -e "127.0.1.1\t$new_h $short_h" | $SUDO tee -a /etc/hosts > /dev/null fi msg_success "Hostname configuré : $new_h ($short_h)" fi } do_deb_sys_msmtp() { msg_info "Installation et configuration de MSMTP..." # Installation du paquet $SUDO apt-get update -qq && $SUDO apt-get install -y msmtp msmtp-mta ca-certificates -qq # Saisie des informations read -rp "Serveur SMTP (host) : " m_host read -rp "Port (ex: 587 ou 465) : " m_port read -rp "Email expéditeur (from) : " m_from read -rp "Utilisateur (user/login) : " m_user read -s -rp "Mot de passe : " m_pass echo "" # Pour revenir à la ligne après le mot de passe masqué # Construction du fichier msmtprc $SUDO bash -c "cat < /etc/msmtprc # Configuration générée par Frogg Deploy defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt syslog LOG_MAIL #logfile /var/log/msmtp.log account default host $m_host port $m_port from $m_from user $m_user password $m_pass EOF" # Sécurisation du fichier (Indispensable car contient un mot de passe) $SUDO chmod 600 /etc/msmtprc $SUDO chown root:root /etc/msmtprc msg_success "MSMTP configuré. Test d'envoi recommandé : echo 'Test' | mail -s 'Test sujet' ton@mail.com" }