228 lines
6.5 KiB
Bash
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 "$@" |