Table des matières
Script de Configuration et Sécurisation d’un Serveur Linux
Ce script Bash permet d’automatiser plusieurs tâches essentielles pour la configuration et la sécurisation d’un serveur Linux. Il s'assure que l'utilisateur exécutant le script est root, met en place une configuration réseau statique, régénère les certificats SSH, modifie les mots de passe des utilisateurs spécifiés et effectue un nettoyage du système avant de le redémarrer.
Fonctionnalités
- Vérification des privilèges root
- Régénération des certificats SSH
- Configuration réseau statique
- Sélection de l'interface réseau
- Définition de l’adresse IP, du masque de sous-réseau, de la passerelle et des serveurs DNS
- Mise à jour des fichiers
/etc/network/interfaceset/etc/resolv.conf
- Changement du nom de la machine (hostname)
- Modification des mots de passe pour les utilisateurs root et npoirier
- Suppression optionnelle du script après exécution
- Nettoyage des journaux et de l’historique système
- Redémarrage du serveur
Pré-requis
- Un accès root
- Une distribution Linux basée sur Debian
- Une connexion stable au serveur
Installation et Utilisation
Téléchargez et exécutez le script avec les commandes suivantes :
chmod +x confserv.sh sudo ./confserv.sh
Suivez les instructions fournies par le script pour entrer les informations réseau et autres configurations requises. À la fin, le système redémarrera automatiquement.
Explication du Code
Vérification des droits root
Le script s'assure qu'il est exécuté en tant que root avant de poursuivre.
if [ "$EUID" -ne 0 ]; then echo "Ce script doit être exécuté en tant que root." exit 1 fi
Validation des adresses IP
Une fonction validate_ip() permet de s’assurer que les entrées de l’utilisateur sont bien des adresses IP valides.
validate_ip() { local ip=$1 local IFS=. local -a octets=($ip) if [[ ${#octets[@]} -ne 4 ]]; then return 1 fi for octet in "${octets[@]}"; do if ! [[ "$octet" =~ ^[0-9]+$ ]]; then return 1 fi if ((octet < 0 || octet > 255)); then return 1 fi done return 0 }
Régénération des certificats SSH
Le script supprime et recrée les certificats SSH pour renforcer la sécurité.
systemctl stop ssh rm -f /etc/ssh/ssh_host_* ssh-keygen -A systemctl restart ssh
Configuration réseau
L'utilisateur doit fournir une adresse IP, un masque de sous-réseau, une passerelle et des serveurs DNS.
Le fichier /etc/network/interfaces est mis à jour en conséquence.
cat > /etc/network/interfaces <<EOF auto $NET_INTERFACE iface $NET_INTERFACE inet static address $IP_ADDR netmask $NETMASK gateway $GATEWAY dns-nameservers $DNS1 $DNS2 $DNS3 dns-search $DOMAIN EOF
Changement du nom de la machine
Le nouveau nom de la machine est défini dans /etc/hostname.
echo "$NEW_HOSTNAME" > /etc/hostname hostnamectl set-hostname "$NEW_HOSTNAME"
Modification des mots de passe
Le script demande un nouveau mot de passe pour les utilisateurs root et npoirier.
echo "$user:$PASS1" | chpasswd
Nettoyage et Redémarrage
Tous les logs et fichiers temporaires sont supprimés avant le redémarrage du serveur.
rm -rf /var/log/* rm -rf /var/cache/apt/* reboot
Sécurité et Bonnes Pratiques
- Sauvegarder les fichiers de configuration avant toute modification.
- S’assurer que l’adresse IP et les paramètres réseau sont corrects pour éviter toute perte de connexion.
Script
#!/bin/bash # Vérifier si le script est exécuté en tant que root if [ "$EUID" -ne 0 ]; then echo "Ce script doit être exécuté en tant que root." exit 1 fi # Fonction pour valider une adresse IP validate_ip() { local ip=$1 local IFS=. local -a octets=($ip) if [[ ${#octets[@]} -ne 4 ]]; then return 1 fi for octet in "${octets[@]}"; do if ! [[ "$octet" =~ ^[0-9]+$ ]]; then return 1 fi if ((octet < 0 || octet > 255)); then return 1 fi done return 0 } # Régénération des certificats SSH echo "Régénération des certificats SSH..." systemctl stop ssh rm -f /etc/ssh/ssh_host_* ssh-keygen -A systemctl restart ssh # Liste des interfaces réseau echo "Liste des interfaces réseau disponibles:" ip -o link show | awk -F': ' '{print $2}' read -p "Choisissez une interface réseau: " NET_INTERFACE # Configuration réseau echo "Configuration des paramètres réseau en mode fixe" while true; do read -p "Adresse IP: " IP_ADDR if validate_ip "$IP_ADDR"; then break; fi echo "Adresse IP invalide, veuillez entrer une adresse valide (ex: 192.168.1.100)." done while true; do read -p "Masque de sous-réseau: " NETMASK if validate_ip "$NETMASK"; then break; fi echo "Masque de sous-réseau invalide, veuillez entrer une valeur correcte (ex: 255.255.255.0)." done while true; do read -p "Passerelle: " GATEWAY if validate_ip "$GATEWAY"; then break; fi echo "Passerelle invalide, veuillez entrer une adresse valide (ex: 192.168.1.1)." done read -p "Domaine: " DOMAIN while true; do read -p "Serveur DNS 1: " DNS1 if validate_ip "$DNS1"; then break; fi echo "Serveur DNS invalide, veuillez entrer une adresse valide (ex: 8.8.8.8)." done while true; do read -p "Serveur DNS 2: " DNS2 if validate_ip "$DNS2"; then break; fi echo "Serveur DNS invalide, veuillez entrer une adresse valide (ex: 8.8.4.4)." done while true; do read -p "Serveur DNS 3: " DNS3 if validate_ip "$DNS3"; then break; fi echo "Serveur DNS invalide, veuillez entrer une adresse valide (ex: 1.1.1.1)." done cat > /etc/network/interfaces <<EOF auto $NET_INTERFACE iface $NET_INTERFACE inet static address $IP_ADDR netmask $NETMASK gateway $GATEWAY dns-nameservers $DNS1 $DNS2 $DNS3 dns-search $DOMAIN EOF echo -e "nameserver $DNS1\nnameserver $DNS2\nnameserver $DNS3" > /etc/resolv.conf # Demande du nouveau nom d'hôte read -p "Nouveau nom de la machine: " NEW_HOSTNAME echo "$NEW_HOSTNAME" > /etc/hostname hostnamectl set-hostname "$NEW_HOSTNAME" # Modification des mots de passe echo "Modification des mots de passe" for user in root npoirier; do while true; do read -s -p "Nouveau mot de passe pour $user: " PASS1 echo read -s -p "Confirmez le mot de passe pour $user: " PASS2 echo if [ "$PASS1" == "$PASS2" ]; then echo "$user:$PASS1" | chpasswd break else echo "Les mots de passe ne correspondent pas. Veuillez réessayer." fi done done # Proposition de suppression du script read -p "Voulez-vous supprimer ce script après exécution ? (o/n): " DELETE_SCRIPT if [[ "$DELETE_SCRIPT" =~ ^[Oo]$ ]]; then rm -- "$0" fi # Nettoyage du système echo "Nettoyage du système..." history -c find /home -name .bash_history -type f -exec rm -f {} \; rm -f /root/.bash_history rm -rf /tmp/* rm -rf /var/tmp/* rm -rf /var/log/* rm -rf /var/cache/apt/* # Redémarrage du système echo "Redémarrage du système en cours..." sleep 3 reboot
