Ajouter install_security_tools.sh
This commit is contained in:
parent
d71e56eda4
commit
35c6fb79a6
|
|
@ -0,0 +1,485 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Script d'installation et configuration de rkhunter et ClamAV
|
||||
# pour la détection de rootkits et malwares sur Debian 12
|
||||
#
|
||||
# Idempotent et professionnel
|
||||
# Usage: sudo ./install_security_tools.sh
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Couleurs pour l'output
|
||||
readonly RED='\033[0;31m'
|
||||
readonly GREEN='\033[0;32m'
|
||||
readonly YELLOW='\033[1;33m'
|
||||
readonly NC='\033[0m'
|
||||
|
||||
# Constantes
|
||||
readonly LOG_FILE="/var/log/security_tools_install.log"
|
||||
readonly RKHUNTER_CONF="/etc/rkhunter.conf"
|
||||
readonly RKHUNTER_LOCAL_CONF="/etc/rkhunter.conf.local"
|
||||
readonly CLAMAV_CONF="/etc/clamav/clamd.conf"
|
||||
readonly AIDE_CONF="/etc/aide/aide.conf"
|
||||
|
||||
#################################################################
|
||||
# CONFIGURATION DES EXCEPTIONS - FAUX POSITIFS CONNUS
|
||||
#################################################################
|
||||
# Ajoutez ici les fichiers/commandes qui génèrent des faux positifs
|
||||
# Format: un chemin complet par ligne
|
||||
readonly RKHUNTER_EXCEPTIONS=(
|
||||
"/usr/bin/lwp-request"
|
||||
"/usr/bin/GET"
|
||||
"/usr/bin/HEAD"
|
||||
"/usr/bin/POST"
|
||||
"/usr/sbin/unhide"
|
||||
# Ajoutez vos propres exceptions ici
|
||||
# "/chemin/vers/votre/fichier"
|
||||
)
|
||||
|
||||
# Vérifier les privilèges root en premier
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo -e "${RED}ERREUR: Ce script doit être exécuté avec les privilèges root${NC}"
|
||||
echo -e "${YELLOW}Utilisation: sudo $0${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Fonction de logging
|
||||
log() {
|
||||
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR:${NC} $*" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING:${NC} $*" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Vérifier les privilèges root
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "Ce script doit être exécuté en tant que root"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Vérifier la distribution
|
||||
check_distribution() {
|
||||
if [[ ! -f /etc/debian_version ]]; then
|
||||
log_error "Ce script est conçu pour Debian 12"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local version
|
||||
version=$(cat /etc/debian_version | cut -d. -f1)
|
||||
if [[ "$version" != "12" ]]; then
|
||||
log_warning "Version Debian détectée: $version (recommandé: 12)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Mise à jour du système
|
||||
update_system() {
|
||||
log "Mise à jour de la liste des paquets..."
|
||||
if ! apt-get update -qq; then
|
||||
log_error "Échec de la mise à jour des paquets"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation de rkhunter
|
||||
install_rkhunter() {
|
||||
log "Vérification de l'installation de rkhunter..."
|
||||
|
||||
if command -v rkhunter &> /dev/null; then
|
||||
log "rkhunter est déjà installé ($(rkhunter --version | head -n1))"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "Installation de rkhunter..."
|
||||
if ! apt-get install -y rkhunter; then
|
||||
log_error "Échec de l'installation de rkhunter"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "rkhunter installé avec succès"
|
||||
}
|
||||
|
||||
# Configuration de rkhunter
|
||||
configure_rkhunter() {
|
||||
log "Configuration de rkhunter..."
|
||||
|
||||
# Backup du fichier de configuration original
|
||||
if [[ -f "$RKHUNTER_CONF" && ! -f "${RKHUNTER_CONF}.backup" ]]; then
|
||||
cp "$RKHUNTER_CONF" "${RKHUNTER_CONF}.backup"
|
||||
log "Backup de la configuration: ${RKHUNTER_CONF}.backup"
|
||||
fi
|
||||
|
||||
# Configuration recommandée
|
||||
sed -i 's/^UPDATE_MIRRORS=.*/UPDATE_MIRRORS=1/' "$RKHUNTER_CONF"
|
||||
sed -i 's/^MIRRORS_MODE=.*/MIRRORS_MODE=0/' "$RKHUNTER_CONF"
|
||||
sed -i 's/^WEB_CMD=.*/WEB_CMD=""/' "$RKHUNTER_CONF"
|
||||
|
||||
# Activer les mises à jour automatiques de la base de données
|
||||
if ! grep -q "^CRON_DAILY_RUN=" "$RKHUNTER_CONF"; then
|
||||
echo "CRON_DAILY_RUN=true" >> "$RKHUNTER_CONF"
|
||||
else
|
||||
sed -i 's/^CRON_DAILY_RUN=.*/CRON_DAILY_RUN=true/' "$RKHUNTER_CONF"
|
||||
fi
|
||||
|
||||
if ! grep -q "^CRON_DB_UPDATE=" "$RKHUNTER_CONF"; then
|
||||
echo "CRON_DB_UPDATE=true" >> "$RKHUNTER_CONF"
|
||||
else
|
||||
sed -i 's/^CRON_DB_UPDATE=.*/CRON_DB_UPDATE=true/' "$RKHUNTER_CONF"
|
||||
fi
|
||||
|
||||
log "Configuration de rkhunter terminée"
|
||||
}
|
||||
|
||||
# Configurer les exceptions rkhunter (faux positifs)
|
||||
configure_rkhunter_exceptions() {
|
||||
log "Configuration des exceptions rkhunter (faux positifs)..."
|
||||
|
||||
# Créer ou vider le fichier local
|
||||
: > "$RKHUNTER_LOCAL_CONF"
|
||||
|
||||
cat >> "$RKHUNTER_LOCAL_CONF" << 'EOF'
|
||||
# Configuration locale rkhunter
|
||||
# Fichier généré automatiquement - Exceptions pour faux positifs
|
||||
# Date: $(date)
|
||||
|
||||
EOF
|
||||
|
||||
local count=0
|
||||
for exception in "${RKHUNTER_EXCEPTIONS[@]}"; do
|
||||
# Vérifier si le fichier existe avant de l'ajouter
|
||||
if [[ -f "$exception" ]]; then
|
||||
echo "SCRIPTWHITELIST=\"$exception\"" >> "$RKHUNTER_LOCAL_CONF"
|
||||
log "Exception ajoutée: $exception"
|
||||
((count++))
|
||||
else
|
||||
log_warning "Fichier non trouvé (exception ignorée): $exception"
|
||||
fi
|
||||
done
|
||||
|
||||
log "$count exception(s) configurée(s) dans $RKHUNTER_LOCAL_CONF"
|
||||
}
|
||||
|
||||
# Initialisation de rkhunter
|
||||
initialize_rkhunter() {
|
||||
log "Mise à jour de la base de données rkhunter..."
|
||||
|
||||
if ! rkhunter --update; then
|
||||
log_warning "Mise à jour de la base de données rkhunter échouée (peut nécessiter une connexion Internet)"
|
||||
fi
|
||||
|
||||
log "Initialisation de la base de données des fichiers système..."
|
||||
if ! rkhunter --propupd; then
|
||||
log_error "Échec de l'initialisation de rkhunter"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "rkhunter initialisé avec succès"
|
||||
}
|
||||
|
||||
# Installation de ClamAV
|
||||
install_clamav() {
|
||||
log "Vérification de l'installation de ClamAV..."
|
||||
|
||||
if command -v clamscan &> /dev/null; then
|
||||
log "ClamAV est déjà installé ($(clamscan --version))"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "Installation de ClamAV et ClamAV Daemon..."
|
||||
if ! apt-get install -y clamav clamav-daemon clamav-freshclam; then
|
||||
log_error "Échec de l'installation de ClamAV"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "ClamAV installé avec succès"
|
||||
}
|
||||
|
||||
# Configuration de ClamAV
|
||||
configure_clamav() {
|
||||
log "Configuration de ClamAV..."
|
||||
|
||||
# Arrêter les services pour la configuration
|
||||
systemctl stop clamav-freshclam 2>/dev/null || true
|
||||
|
||||
# Mise à jour de la base de données virale
|
||||
log "Mise à jour de la base de données antivirale (cela peut prendre plusieurs minutes)..."
|
||||
if ! freshclam; then
|
||||
log_warning "Première mise à jour freshclam échouée, nouvelle tentative..."
|
||||
sleep 5
|
||||
freshclam || log_warning "Mise à jour freshclam échouée"
|
||||
fi
|
||||
|
||||
# Activer et démarrer les services
|
||||
systemctl enable clamav-freshclam
|
||||
systemctl start clamav-freshclam
|
||||
|
||||
log "Configuration de ClamAV terminée"
|
||||
}
|
||||
|
||||
# Installation de AIDE
|
||||
install_aide() {
|
||||
log "Vérification de l'installation de AIDE..."
|
||||
|
||||
if command -v aide &> /dev/null; then
|
||||
log "AIDE est déjà installé ($(aide --version 2>&1 | head -n1))"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "Installation de AIDE (Advanced Intrusion Detection Environment)..."
|
||||
if ! apt-get install -y aide aide-common; then
|
||||
log_error "Échec de l'installation de AIDE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "AIDE installé avec succès"
|
||||
}
|
||||
|
||||
# Configuration de AIDE
|
||||
configure_aide() {
|
||||
log "Configuration de AIDE..."
|
||||
|
||||
# Backup de la configuration originale
|
||||
if [[ -f "$AIDE_CONF" && ! -f "${AIDE_CONF}.backup" ]]; then
|
||||
cp "$AIDE_CONF" "${AIDE_CONF}.backup"
|
||||
log "Backup de la configuration AIDE: ${AIDE_CONF}.backup"
|
||||
fi
|
||||
|
||||
# Vérifier si la base de données existe
|
||||
if [[ ! -f /var/lib/aide/aide.db ]]; then
|
||||
log "Initialisation de la base de données AIDE (cela peut prendre 10-30 minutes)..."
|
||||
log_warning "Cette opération est longue lors de la première exécution..."
|
||||
|
||||
if ! aideinit; then
|
||||
log_error "Échec de l'initialisation de AIDE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Copier la nouvelle base en tant que base active
|
||||
if [[ -f /var/lib/aide/aide.db.new ]]; then
|
||||
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
|
||||
log "Base de données AIDE initialisée avec succès"
|
||||
fi
|
||||
else
|
||||
log "Base de données AIDE déjà existante"
|
||||
fi
|
||||
|
||||
log "Configuration de AIDE terminée"
|
||||
}
|
||||
|
||||
# Créer un script de vérification AIDE
|
||||
create_aide_check_script() {
|
||||
log "Création du script de vérification AIDE..."
|
||||
|
||||
local aide_script="/usr/local/bin/aide-check.sh"
|
||||
|
||||
cat > "$aide_script" << 'EOF'
|
||||
#!/bin/bash
|
||||
# Script de vérification AIDE
|
||||
# Généré automatiquement
|
||||
|
||||
LOGFILE="/var/log/aide-check-$(date +%Y%m%d).log"
|
||||
MAILTO="root"
|
||||
|
||||
echo "=== Vérification AIDE du $(date) ===" > "$LOGFILE"
|
||||
|
||||
# Vérifier l'intégrité du système
|
||||
aide --check >> "$LOGFILE" 2>&1
|
||||
|
||||
# Envoyer un email si des changements sont détectés
|
||||
if grep -qE "changed|added|removed" "$LOGFILE"; then
|
||||
echo "Des changements de fichiers ont été détectés. Consultez $LOGFILE" | \
|
||||
mail -s "Alerte AIDE: $(hostname)" "$MAILTO"
|
||||
fi
|
||||
|
||||
echo -e "\n=== Vérification terminée ===" >> "$LOGFILE"
|
||||
|
||||
# Mettre à jour la base de données après vérification (optionnel)
|
||||
# Décommenter la ligne suivante pour mettre à jour automatiquement
|
||||
# aide --update && cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
|
||||
EOF
|
||||
|
||||
chmod +x "$aide_script"
|
||||
log "Script de vérification AIDE créé: $aide_script"
|
||||
}
|
||||
|
||||
# Créer un script de scan quotidien
|
||||
create_daily_scan_script() {
|
||||
log "Création du script de scan quotidien..."
|
||||
|
||||
local scan_script="/usr/local/bin/daily-security-scan.sh"
|
||||
|
||||
cat > "$scan_script" << 'EOF'
|
||||
#!/bin/bash
|
||||
# Script de scan quotidien de sécurité
|
||||
# Généré automatiquement
|
||||
|
||||
LOGFILE="/var/log/security-scan-$(date +%Y%m%d).log"
|
||||
MAILTO="root"
|
||||
|
||||
echo "=== Scan de sécurité du $(date) ===" > "$LOGFILE"
|
||||
|
||||
# Scan rkhunter
|
||||
echo -e "\n--- Scan rkhunter ---" >> "$LOGFILE"
|
||||
rkhunter --check --skip-keypress --report-warnings-only >> "$LOGFILE" 2>&1
|
||||
|
||||
# Scan ClamAV des répertoires critiques
|
||||
echo -e "\n--- Scan ClamAV ---" >> "$LOGFILE"
|
||||
clamscan -r -i --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" \
|
||||
/home /root /tmp /var/www 2>&1 | tee -a "$LOGFILE"
|
||||
|
||||
# Envoyer un email si des problèmes sont détectés
|
||||
if grep -qiE "warning|infected|rootkit" "$LOGFILE"; then
|
||||
echo "Des problèmes de sécurité ont été détectés. Consultez $LOGFILE" | \
|
||||
mail -s "Alerte sécurité: $(hostname)" "$MAILTO"
|
||||
fi
|
||||
|
||||
echo -e "\n=== Scan terminé ===" >> "$LOGFILE"
|
||||
EOF
|
||||
|
||||
chmod +x "$scan_script"
|
||||
log "Script de scan créé: $scan_script"
|
||||
}
|
||||
|
||||
# Configurer le cron pour les scans quotidiens
|
||||
setup_cron() {
|
||||
log "Configuration des tâches cron..."
|
||||
|
||||
local cron_file="/etc/cron.d/security-scan"
|
||||
|
||||
cat > "$cron_file" << EOF
|
||||
# Scan de sécurité quotidien
|
||||
SHELL=/bin/bash
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
# Scan quotidien à 2h du matin
|
||||
0 2 * * * root /usr/local/bin/daily-security-scan.sh
|
||||
|
||||
# Scan quotidien à 13h (milieu de journée)
|
||||
0 13 * * * root /usr/local/bin/daily-security-scan.sh
|
||||
|
||||
# Vérification AIDE hebdomadaire (dimanche à 3h)
|
||||
0 3 * * 0 root /usr/local/bin/aide-check.sh
|
||||
|
||||
# Mise à jour rkhunter hebdomadaire
|
||||
30 3 * * 0 root /usr/bin/rkhunter --update --quiet && /usr/bin/rkhunter --propupd
|
||||
|
||||
# Mise à jour base de données AIDE mensuelle (1er du mois à 4h)
|
||||
0 4 1 * * root /usr/bin/aide --update && cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
|
||||
|
||||
# Mise à jour ClamAV (freshclam gère déjà cela via systemd)
|
||||
EOF
|
||||
|
||||
chmod 644 "$cron_file"
|
||||
log "Tâches cron configurées: $cron_file"
|
||||
}
|
||||
|
||||
# Exécuter un premier scan
|
||||
run_initial_scan() {
|
||||
log "Exécution d'un scan initial (cela peut prendre du temps)..."
|
||||
|
||||
log "Scan rkhunter..."
|
||||
if rkhunter --check --skip-keypress --report-warnings-only; then
|
||||
log "Scan rkhunter terminé avec succès"
|
||||
else
|
||||
log_warning "Scan rkhunter terminé avec des avertissements (consultez /var/log/rkhunter.log)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Afficher les informations finales
|
||||
print_summary() {
|
||||
cat << EOF
|
||||
|
||||
${GREEN}╔═══════════════════════════════════════════════════════════════╗
|
||||
║ Installation terminée avec succès! ║
|
||||
╚═══════════════════════════════════════════════════════════════╝${NC}
|
||||
|
||||
${YELLOW}Outils installés:${NC}
|
||||
• rkhunter: $(rkhunter --version | head -n1)
|
||||
• ClamAV: $(clamscan --version)
|
||||
• AIDE: $(aide --version 2>&1 | head -n1)
|
||||
|
||||
${YELLOW}Commandes utiles:${NC}
|
||||
${GREEN}rkhunter:${NC}
|
||||
• Scan manuel: sudo rkhunter --check
|
||||
• Mise à jour DB: sudo rkhunter --update
|
||||
• Mise à jour proplist: sudo rkhunter --propupd
|
||||
|
||||
${GREEN}ClamAV:${NC}
|
||||
• Scan manuel: sudo clamscan -r /chemin
|
||||
• Mise à jour: sudo freshclam
|
||||
|
||||
${GREEN}AIDE:${NC}
|
||||
• Vérifier intégrité: sudo aide --check
|
||||
• Mettre à jour DB: sudo aide --update
|
||||
• Initialiser DB: sudo aideinit
|
||||
|
||||
${YELLOW}Fichiers de configuration:${NC}
|
||||
• rkhunter principal: $RKHUNTER_CONF
|
||||
• rkhunter exceptions: $RKHUNTER_LOCAL_CONF
|
||||
• AIDE config: $AIDE_CONF
|
||||
|
||||
${YELLOW}Logs:${NC}
|
||||
• Installation: $LOG_FILE
|
||||
• rkhunter: /var/log/rkhunter.log
|
||||
• AIDE checks: /var/log/aide-check-*.log
|
||||
• Scans quotidiens: /var/log/security-scan-*.log
|
||||
|
||||
${YELLOW}Automatisation:${NC}
|
||||
• Scan quotidien: 2h00 et 13h00
|
||||
• Vérif AIDE: Dimanche 3h00
|
||||
• MAJ rkhunter: Dimanche 3h30
|
||||
• MAJ AIDE DB: 1er du mois 4h00
|
||||
|
||||
${YELLOW}Scripts créés:${NC}
|
||||
• /usr/local/bin/daily-security-scan.sh
|
||||
• /usr/local/bin/aide-check.sh
|
||||
|
||||
${GREEN}Le système est maintenant protégé avec une détection multicouche:${NC}
|
||||
✓ Rootkits et backdoors (rkhunter)
|
||||
✓ Malwares et virus (ClamAV)
|
||||
✓ Intégrité des fichiers (AIDE)
|
||||
|
||||
${YELLOW}Note:${NC} Pour ajouter des exceptions rkhunter, éditez le script
|
||||
et ajoutez les chemins dans le tableau RKHUNTER_EXCEPTIONS,
|
||||
puis relancez le script.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# Fonction principale
|
||||
main() {
|
||||
log "=== Démarrage de l'installation des outils de sécurité ==="
|
||||
|
||||
check_root
|
||||
check_distribution
|
||||
update_system
|
||||
|
||||
install_rkhunter
|
||||
configure_rkhunter
|
||||
configure_rkhunter_exceptions
|
||||
initialize_rkhunter
|
||||
|
||||
install_clamav
|
||||
configure_clamav
|
||||
|
||||
install_aide
|
||||
configure_aide
|
||||
|
||||
create_daily_scan_script
|
||||
create_aide_check_script
|
||||
setup_cron
|
||||
|
||||
run_initial_scan
|
||||
|
||||
log "=== Installation terminée ==="
|
||||
print_summary
|
||||
}
|
||||
|
||||
# Exécution
|
||||
main "$@"
|
||||
Loading…
Reference in New Issue