Files
scripts-bash/servers/linux/config_adminSys.sh
2026-03-16 13:42:53 +01:00

301 lines
9.5 KiB
Bash
Executable File

#!/bin/bash
# --- 0. VÉRIFICATION DES DROITS ---
if [ "$EUID" -ne 0 ]; then
echo "❌ Erreur : Ce script doit être lancé avec sudo."
exit 1
fi
# --- 1. CONFIGURATION DYNAMIQUE ---
HOSTNAME=$(hostname)
MSMTP_CONF="/etc/msmtprc"
GLOBAL_CONF="/etc/sys_check.conf"
# Valeurs "Fallback" (anonymisées)
DEFAULT_SMTP_HOST="smtp.exemple.fr"
DEFAULT_SMTP_PORT="587"
DEFAULT_SMTP_USER="alerte@exemple.fr"
DEFAULT_DEST_EMAIL="admin+${HOSTNAME}@exemple.fr"
SUBJECT_PREFIX="[$HOSTNAME]"
# Valeurs "Fallback" NTFY
DEFAULT_NTFY_SERVER="https://ntfy.sh"
DEFAULT_NTFY_TOPIC=""
DEFAULT_NTFY_TOKEN=""
# Tentative d'extraction des valeurs actuelles si le fichier existe
if [ -f "$MSMTP_CONF" ]; then
CURRENT_HOST=$(grep -E "^host[[:space:]]+" "$MSMTP_CONF" | awk '{print $2}')
CURRENT_PORT=$(grep -E "^port[[:space:]]+" "$MSMTP_CONF" | awk '{print $2}')
CURRENT_USER=$(grep -E "^user[[:space:]]+" "$MSMTP_CONF" | awk '{print $2}')
# Si on a trouvé des infos, on les utilise comme nouvelles valeurs par défaut
[ -n "$CURRENT_HOST" ] && DEFAULT_SMTP_HOST="$CURRENT_HOST"
[ -n "$CURRENT_PORT" ] && DEFAULT_SMTP_PORT="$CURRENT_PORT"
[ -n "$CURRENT_USER" ] && DEFAULT_SMTP_USER="$CURRENT_USER"
fi
# Tentative d'extraction NTFY si le fichier global existe déjà
if [ -f "$GLOBAL_CONF" ]; then
source "$GLOBAL_CONF"
[ -n "$NTFY_SERVER" ] && DEFAULT_NTFY_SERVER="$NTFY_SERVER"
[ -n "$NTFY_TOPIC" ] && DEFAULT_NTFY_TOPIC="$NTFY_TOPIC"
[ -n "$NTFY_TOKEN" ] && DEFAULT_NTFY_TOKEN="$NTFY_TOKEN"
fi
echo "=========================================================="
echo " VÉRIFICATION SMTP & DÉPLOIEMENT - ${HOSTNAME}"
echo "=========================================================="
# Fonction pour demander une valeur avec une valeur par défaut
prompt_value() {
local var_name=$1
local prompt_text=$2
local default_value=$3
read -p "$prompt_text [$default_value] : " input
eval "$var_name=\"${input:-$default_value}\""
}
# Collecte interactive
echo "--- Configuration Mail ---"
prompt_value "SMTP_HOST" "Serveur SMTP" "$DEFAULT_SMTP_HOST"
prompt_value "SMTP_PORT" "Port SMTP" "$DEFAULT_SMTP_PORT"
prompt_value "SMTP_USER" "Utilisateur SMTP" "$DEFAULT_SMTP_USER"
prompt_value "DEST_EMAIL" "Email de destination" "$DEFAULT_DEST_EMAIL"
echo -e "\n--- Configuration ntfy.sh (Optionnel) ---"
prompt_value "NTFY_SERVER" "Serveur ntfy" "$DEFAULT_NTFY_SERVER"
prompt_value "NTFY_TOPIC" "Topic ntfy (laisser vide pour désactiver)" "$DEFAULT_NTFY_TOPIC"
prompt_value "NTFY_TOKEN" "Token ntfy (laisser vide si aucun)" "$DEFAULT_NTFY_TOKEN"
# --- 2. INSTALLATION INITIALE ---
DEBIAN_FRONTEND=noninteractive apt update
DEBIAN_FRONTEND=noninteractive apt install -y msmtp msmtp-mta bsd-mailx
DEBIAN_FRONTEND=noninteractive apt install -y ufw fail2ban unattended-upgrades curl
DEBIAN_FRONTEND=noninteractive apt install -y curl bc
# --- 3. RÉCUPÉRATION ET TEST DU MOT DE PASSE SMTP ---
AUTH_OK=false
while [ "$AUTH_OK" = false ]; do
# 1. Tentative d'extraction depuis le fichier de config existant
if [ -f "$MSMTP_CONF" ] && [ "$SMTP_USER" = "$CURRENT_USER" ]; then
SMTP_PASS=$(grep -E "^password[[:space:]]+" "$MSMTP_CONF" | awk '{print $2}')
fi
if [ -n "$SMTP_PASS" ]; then
echo "📄 Mot de passe existant récupéré pour $SMTP_USER."
else
echo -n "🔑 Mot de passe SMTP non trouvé. Entrez le pour ${SMTP_USER} : "
read -s SMTP_PASS
echo ""
fi
echo "⏳ Vérification de la connexion SMTP..."
# Création config temporaire pour le test
TMP_TEST=$(mktemp)
cacat > "$TMP_TEST" <<EOF
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
account test
host $SMTP_HOST
port $SMTP_PORT
from $SMTP_USER
user $SMTP_USER
password $SMTP_PASS
account default : test
EOF
chmod 600 "$TMP_TEST"
# Test d'envoi réel
echo "Test de configuration" | msmtp --file="$TMP_TEST" -t "$DEST_EMAIL" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✅ Authentification SMTP réussie !"
AUTH_OK=true
rm -f "$TMP_TEST"
else
echo "❌ Échec de l'authentification SMTP."
# Si le password extrait était mauvais, on vide la variable pour forcer la saisie au prochain tour
if [ -f "$MSMTP_CONF" ]; then
echo "⚠️ Le mot de passe extrait de $MSMTP_CONF est incorrect."
SMTP_PASS=""
MSMTP_CONF="/dev/null" # On "désactive" la lecture fichier pour ce tour
fi
rm -f "$TMP_TEST"
fi
done
# --- 4. CONFIGURATION DES ALIASES ---
echo "--- 4. Vérification et configuration des redirections (Aliases) ---"
ALIAS_FILE="/etc/aliases"
# On s'assure que le fichier existe (certaines distros minimales ne l'ont pas)
[ ! -f "$ALIAS_FILE" ] && touch "$ALIAS_FILE"
# Vérification pour root
if grep -q "^root:" "$ALIAS_FILE"; then
# Si root existe mais pointe vers autre chose, on met à jour
sed -i "s|^root:.*|root: $DEST_EMAIL|" "$ALIAS_FILE"
echo "✅ Alias 'root' mis à jour vers $DEST_EMAIL."
else
# Sinon on l'ajoute
echo "root: $DEST_EMAIL" >> "$ALIAS_FILE"
echo "✅ Alias 'root' ajouté."
fi
# Vérification pour default
if grep -q "^default:" "$ALIAS_FILE"; then
sed -i "s|^default:.*|default: $DEST_EMAIL|" "$ALIAS_FILE"
echo "✅ Alias 'default' mis à jour."
else
echo "default: $DEST_EMAIL" >> "$ALIAS_FILE"
echo "✅ Alias 'default' ajouté."
fi
# --- 5. CONFIGURATION MSMTP ---
echo "--- 5. Vérification de la configuration MSMTP ---"
# 1. Génération de la configuration cible dans un fichier temporaire
TMP_MSMTP=$(mktemp)
cat > "$TMP_MSMTP" <<EOF
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
aliases /etc/aliases
account default
host $SMTP_HOST
port $SMTP_PORT
from $SMTP_USER
user $SMTP_USER
password $SMTP_PASS
EOF
# 2. Comparaison avec le fichier existant
MSMTP_CONF="/etc/msmtprc"
SHOULD_UPDATE=false
if [ ! -f "$MSMTP_CONF" ]; then
echo "📜 Le fichier $MSMTP_CONF n'existe pas. Création..."
SHOULD_UPDATE=true
else
# Comparaison du contenu
if ! diff -q "$TMP_MSMTP" "$MSMTP_CONF" > /dev/null; then
echo "🔄 La configuration a changé. Mise à jour de $MSMTP_CONF..."
SHOULD_UPDATE=true
else
echo "✅ La configuration MSMTP est déjà à jour et identique."
fi
fi
# 3. Application et sécurisation
if [ "$SHOULD_UPDATE" = true ]; then
cp "$TMP_MSMTP" "$MSMTP_CONF"
# --- CORRECTIONS DES DROITS ---
# On donne le fichier au groupe msmtp pour permettre l'accès au binaire
chown root:msmtp "$MSMTP_CONF"
# 640 : Root lit/écrit, le groupe msmtp lit, les autres rien (sécurité du mot de passe)
chmod 640 "$MSMTP_CONF"
# On s'assure que le binaire msmtp peut lire ce fichier quel que soit l'utilisateur
# Le bit 's' (setgid) permet à msmtp de prendre l'identité du groupe 'msmtp'
chmod g+s /usr/bin/msmtp
# On règle le problème du log une fois pour toutes (lecture/écriture pour tous)
touch /var/log/msmtp.log
chown root:msmtp /var/log/msmtp.log
chmod 666 /var/log/msmtp.log
fi
# Nettoyage du fichier temporaire
rm -f "$TMP_MSMTP"
# --- 5b. CONFIGURATION GLOBALE SCRIPTS ---
echo "--- Génération de la configuration globale /etc/scripts-config.conf ---"
cat > "$GLOBAL_CONF" <<EOF
# Configuration générée le $(date)
DEST="$DEST_EMAIL"
NTFY_SERVER="$NTFY_SERVER"
NTFY_TOPIC="$NTFY_TOPIC"
NTFY_TOKEN="$NTFY_TOKEN"
EOF
# Sécurisation du fichier (lecture seule pour root car peut contenir le token ntfy)
chown root:root "$GLOBAL_CONF"
chmod 600 "$GLOBAL_CONF"
# --- 6. INTERCEPTION GLOBALE (LE WRAPPER) ---
echo "--- 6. Création du wrapper sendmail pour préfixer les objets ---"
# On crée un script qui va modifier le sujet à la volée
cat > /usr/local/bin/msmtp-wrapper <<EOF
#!/bin/bash
# Ce script intercepte les mails pour ajouter le préfixe [$HOSTNAME]
# On utilise sed pour injecter le préfixe dans la ligne 'Subject:'
sed "s/^Subject: /Subject: $SUBJECT_PREFIX /" | /usr/bin/msmtp "\$@"
EOF
chmod +x /usr/local/bin/msmtp-wrapper
# On pointe le sendmail du système vers notre wrapper au lieu de msmtp directement
ln -sf /usr/local/bin/msmtp-wrapper /usr/sbin/sendmail
# --- 7. SCRIPT DE SURVEILLANCE ---
echo "--- 7. Récupération du script de surveillance depuis Git ---"
SCRIPT_URL="https://git.abonnel.fr/cedricAbonnel/scripts-bash/raw/branch/main/servers/linux/sys_check.sh"
DEST_PATH="/usr/local/bin/sys_check.sh"
# Téléchargement du script
curl -sSL "$SCRIPT_URL" -o "$DEST_PATH"
# Vérification du succès du téléchargement
if [ $? -eq 0 ]; then
chmod +x "$DEST_PATH"
echo "✅ sys_check.sh récupéré et installé."
else
echo "❌ Erreur lors de la récupération du script sur Git. Création d'une version de secours locale."
cat > "$DEST_PATH" <<EOF
#!/bin/bash
# Version de secours (fallback)
DISK_USAGE=\$(df / | awk 'NR==2 {print \$5}' | sed 's/%//')
if [ "\$DISK_USAGE" -gt 90 ]; then
echo "Alerte Disque: \$DISK_USAGE%" | mail -s "ALERTE" root
fi
EOF
chmod +x "$DEST_PATH"
fi
# --- 8. SÉCURITÉ & AUTOMATISATION ---
ufw allow 22/tcp
ufw --force enable
systemctl restart fail2ban
(crontab -l 2>/dev/null | grep -v "sys_check.sh" ; echo "04 * * * * /usr/local/bin/sys_check.sh") | crontab -
# --- 9. RAPPORT FINAL ---
echo "Déploiement terminé de ${0} sur ${HOSTNAME}" | mail -s "Setup OK" "$DEST_EMAIL"
echo "✅ Terminé ! Teste avec : echo 'test' | mail -s 'Sujet simple' root"
rm ${0}