#!/bin/bash # Script d'installation automatisée du gestionnaire de firewall # Auteur: Florent Tainturier # Version: 1.3 set -euo pipefail # Couleurs pour les messages RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Fonction de logging log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" } error() { echo -e "${RED}[ERREUR] $1${NC}" >&2 } warning() { echo -e "${YELLOW}[ATTENTION] $1${NC}" } # Vérification des privilèges root if [ "$(id -u)" != "0" ]; then error "Ce script doit être exécuté en tant que root" exit 1 fi # Vérification et installation des dépendances check_dependencies() { log "Vérification des dépendances..." # Liste des paquets requis local packages=( "sudo" "iptables" "ipset" "dnsutils" # pour dig ) # Mise à jour des dépôts log "Mise à jour des dépôts..." apt-get update # Installation des paquets manquants for pkg in "${packages[@]}"; do if ! dpkg -l | grep -q "^ii $pkg "; then log "Installation de $pkg..." apt-get install -y "$pkg" else log "$pkg est déjà installé" fi done } # Fonction de vérification et création de répertoire create_directory() { local dir="$1" local perms="$2" if [ ! -d "$dir" ]; then log "Création du répertoire $dir" mkdir -p "$dir" fi chmod "$perms" "$dir" chown root:root "$dir" } # Fonction de création de fichier create_file() { local file="$1" local perms="$2" if [ ! -f "$file" ]; then log "Création du fichier $file" touch "$file" fi chmod "$perms" "$file" chown root:root "$file" } # 1. Préparation de l'environnement install_environment() { log "Préparation de l'environnement..." create_directory "/root/log" "755" create_file "/root/log/blacklistipv4.txt" "644" create_file "/root/log/blacklistipv6.txt" "644" create_file "/root/log/whitelist.txt" "644" create_file "/root/log/firewall.log" "644" } # 2. Installation du script principal install_main_script() { log "Installation du script principal..." if [ ! -f "manage_firewall.sh" ]; then error "Le fichier manage_firewall.sh doit être présent dans le répertoire courant" exit 1 fi cp manage_firewall.sh /usr/local/sbin/manage_firewall.sh chmod 755 /usr/local/sbin/manage_firewall.sh chown root:root /usr/local/sbin/manage_firewall.sh } # 3. Création de l'utilisateur create_firewall_user() { log "Création de l'utilisateur firewall_manager..." if ! id -u firewall_manager >/dev/null 2>&1; then adduser --disabled-password --gecos "" firewall_manager # Définir un mot de passe echo "Définition du mot de passe pour firewall_manager" passwd firewall_manager else warning "L'utilisateur firewall_manager existe déjà" fi } # 4. Création du script wrapper create_wrapper_script() { log "Création du script wrapper..." cat > /usr/local/bin/firewall << 'EOF' #!/bin/bash # Script wrapper pour la gestion du firewall # Vérification des arguments if [ $# -eq 0 ]; then echo "Usage:" echo " firewall --add-whitelist " echo " firewall --remove-whitelist " echo " firewall --blacklist [port] [proto]" echo " firewall --unblacklist " echo " firewall --show" echo " firewall --save-rules" exit 1 fi # Exécution du script principal sudo /usr/local/sbin/manage_firewall.sh "$@" EOF chmod 755 /usr/local/bin/firewall chown root:root /usr/local/bin/firewall } # 5. Configuration sudo configure_sudo() { log "Configuration des permissions sudo..." create_directory "/etc/sudoers.d" "750" # Vérifier l'inclusion du répertoire sudoers.d if ! grep -q "#includedir /etc/sudoers.d" /etc/sudoers; then echo "#includedir /etc/sudoers.d" >> /etc/sudoers fi cat > /etc/sudoers.d/firewall_manager << 'EOF' # Permissions pour l'exécution du script principal firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --add-whitelist * firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --remove-whitelist * firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --blacklist * firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --unblacklist * firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --show firewall_manager ALL=(root) NOPASSWD: /usr/local/sbin/manage_firewall.sh --save-rules # Permissions pour la lecture des fichiers firewall_manager ALL=(root) NOPASSWD: /usr/bin/cat /root/log/blacklistipv4.txt firewall_manager ALL=(root) NOPASSWD: /usr/bin/cat /root/log/blacklistipv6.txt firewall_manager ALL=(root) NOPASSWD: /usr/bin/cat /root/log/whitelist.txt firewall_manager ALL=(root) NOPASSWD: /usr/bin/cat /root/log/firewall.log # Permissions pour voir les règles iptables firewall_manager ALL=(root) NOPASSWD: /usr/sbin/iptables -L INPUT -n firewall_manager ALL=(root) NOPASSWD: /usr/sbin/ip6tables -L INPUT -n EOF chmod 440 /etc/sudoers.d/firewall_manager chown root:root /etc/sudoers.d/firewall_manager } # 6. Vérification de l'installation verify_installation() { log "Vérification de l'installation..." # Vérifier les fichiers for file in "/usr/local/sbin/manage_firewall.sh" "/usr/local/bin/firewall" "/etc/sudoers.d/firewall_manager"; do if [ ! -f "$file" ]; then error "Fichier manquant : $file" return 1 fi done # Vérifier la syntaxe sudoers sans visudo if ! grep -q "^firewall_manager" /etc/sudoers.d/firewall_manager; then error "Erreur dans la configuration sudo : fichier firewall_manager non trouvé ou vide" return 1 fi log "Tests des permissions..." sudo -u firewall_manager firewall --show log "Installation terminée avec succès !" log "L'utilisateur firewall_manager peut maintenant utiliser les commandes firewall" } # Exécution principale main() { log "Début de l'installation..." check_dependencies install_environment install_main_script create_firewall_user create_wrapper_script configure_sudo verify_installation log "Installation terminée !" log "Testez l'installation en vous connectant avec : su - firewall_manager" } # Lancement du script main "$@"