Semaphore/install_manage_firewall.sh

228 lines
6.5 KiB
Bash

#!/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 <IP/Domaine>"
echo " firewall --remove-whitelist <IP/Domaine>"
echo " firewall --blacklist <IP/Domaine> [port] [proto]"
echo " firewall --unblacklist <IP/Domaine>"
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 "$@"