Install_rsyslog/install_rsyslog.sh

185 lines
6.4 KiB
Bash

#!/bin/bash
#
# Script d'Installation et de Configuration Professionnelle de rsyslog Client Multi-Profils
# Objectif: Installer rsyslog et configurer des règles d'envoi de logs vers un serveur central.
# Auteur: Gemini
# Date: 2025-12-06
# Version: 1.1
# --- Variables de Configuration Globales (À ADAPTER) ---
# Adresse IP ou Nom d'hôte du serveur de journaux central
LOG_SERVER_HOST="graylog.h3campus.fr"
LOG_SERVER_PORT="514"
PROTOCOL="UDP" # Peut être UDP ou TCP
CONFIG_FILE="/etc/rsyslog.d/50-remote-custom.conf"
RSYSLOG_PACKAGE="rsyslog"
# --- Fonctions de Gestion ---
# Fonction pour afficher les messages d'erreur et quitter
function die() {
local message="$1"
echo -e "\n🚨 ERREUR: $message" >&2
exit 1
}
# Fonction pour vérifier les prérequis (privilèges)
function check_prerequisites() {
if [[ $EUID -ne 0 ]]; then
die "Ce script doit être exécuté avec les privilèges root (sudo)."
fi
echo "✅ Vérification des privilèges passée."
}
# Fonction pour installer rsyslog si absent
function install_rsyslog() {
echo -e "\n--- 📦 Étape 1: Installation de rsyslog ---"
if ! dpkg -l | grep -q "^ii.*$RSYSLOG_PACKAGE"; then
echo "🔍 rsyslog n'est pas installé. Installation en cours..."
if ! apt update &> /dev/null; then
die "Échec de la mise à jour des listes de paquets APT."
fi
if ! apt install -y $RSYSLOG_PACKAGE; then
die "Échec de l'installation du paquet $RSYSLOG_PACKAGE."
fi
echo "✅ rsyslog installé avec succès."
else
echo "$RSYSLOG_PACKAGE est déjà installé."
fi
}
# Fonction pour redémarrer le service rsyslog
function restart_rsyslog() {
echo -e "\n--- 🔄 Étape 3: Redémarrage du service rsyslog ---"
if systemctl restart rsyslog; then
echo "✅ Service rsyslog redémarré avec succès."
echo "🔍 Vérification du statut du service (extrait)..."
systemctl status rsyslog | head -n 5
else
die "Échec du redémarrage du service rsyslog. Vérifiez les logs (journalctl -xe | grep rsyslog)."
fi
}
# --- Fonction de Configuration des Règles par Profil ---
# Fonction pour définir et appliquer les règles spécifiques à un profil
# Arg1: Le profil à configurer (ex: web, db, security, default)
function generate_profile_rules() {
local profile="$1"
local rules=""
local target="@" # Symbole par défaut pour UDP
# Définition du symbole de destination en fonction du protocole
if [[ "$PROTOCOL" == "TCP" ]]; then
target="@@" # Pour une transmission fiable
fi
echo -e "\n--- 📜 Étape 2: Configuration des règles pour le profil '$profile' ---"
# Définition des règles spécifiques au profil
case "$profile" in
web)
echo "⚙️ Profil: Serveur Web (Apache/Nginx)"
# Logs des services d'arrière-plan (daemon), erreurs, et logs locaux
rules=$(cat <<RULE
# Logs des services Web (daemon) et des erreurs generales
daemon.info;daemon.err $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
local2.* $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
RULE
)
;;
db)
echo "⚙️ Profil: Serveur de Base de Données (PostgreSQL/MariaDB)"
# Erreurs critiques du systeme et logs specifiques a la DB (local0)
rules=$(cat <<RULE
# Logs des services DB (local0) et messages systeme critiques
mail.none;news.none;daemon.none;auth.none $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
*.err;kern.warning $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
local0.* $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
RULE
)
;;
security)
echo "⚙️ Profil: Serveur de Sécurité (Firewall, VPN, Bastion)"
# Logs d'authentification (auth, authpriv), noyau (kernel) et cron pour la maintenance
rules=$(cat <<RULE
# Logs de securite critiques
auth.*;authpriv.* $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
kern.warning $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
cron.* $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
RULE
)
;;
default)
echo "⚙️ Profil: Défaut (Système Général/Infrastructure)"
# Logs système essentiels (info, warning), en excluant les plus volumineux (mail, news)
rules=$(cat <<RULE
# Logs systeme generaux importants
*.info;mail.none;news.none;authpriv.none;cron.none $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
kern.* $target$LOG_SERVER_HOST:$LOG_SERVER_PORT
RULE
)
;;
*)
die "Profil non reconnu. Veuillez choisir parmi: web, db, security, default."
;;
esac
# Création du fichier de configuration final
cat <<EOF > "$CONFIG_FILE"
#
# Configuration rsyslog personnalisee par PROFIL ($profile)
# Fichier cree par configure_rsyslog_profiles.sh
# Destination: $PROTOCOL://$LOG_SERVER_HOST:$LOG_SERVER_PORT
#
# --- Regles du Profil $profile ---
$rules
# NOTE: Les logs envoyes a distance sont toujours stockes localement,
# a moins d'ajouter un tilde (~) a la fin de la ligne.
EOF
if [ $? -eq 0 ]; then
echo "✅ Fichier de configuration créé: $CONFIG_FILE"
echo " Destination: **$target$LOG_SERVER_HOST:$LOG_SERVER_PORT**"
else
die "Échec de la création du fichier de configuration $CONFIG_FILE."
fi
}
# --- Exécution Principale du Script ---
# Vérification de l'argument du profil
if [ -z "$1" ]; then
echo "Usage: sudo $0 <profil>"
echo "Profils disponibles: **web**, **db**, **security**, **default**"
die "Le profil du serveur est requis en argument."
fi
PROFILE_TO_USE="$1"
echo "=========================================================="
echo "🚀 Démarrage de la configuration rsyslog Client"
echo "Serveur de Log Cible: $LOG_SERVER_HOST:$LOG_SERVER_PORT ($PROTOCOL)"
echo "=========================================================="
# 1. Vérification des prérequis et Installation
check_prerequisites
install_rsyslog
# 2. Configuration basée sur le profil
generate_profile_rules "$PROFILE_TO_USE"
# 3. Application de la configuration
restart_rsyslog
echo -e "\n=========================================================="
echo "🎉 Configuration rsyslog Client terminee pour le profil **$PROFILE_TO_USE** !"
echo "Les logs specifiques sont maintenant diriges vers le serveur central."
echo "=========================================================="