diff --git a/customization/customization.sh b/customization/customization.sh new file mode 100644 index 0000000..2da6674 --- /dev/null +++ b/customization/customization.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +conf_banniere(){ + # Pour exécuter la fonction, il suffit d'appeler: + echo "Mise à jour /etc/motd avec le message de bienvenue" + read -p "Veuillez entrer le message souhaite : " MESSAGE + echo $MESSAGE >> /etc/motd +} + +# Fonction pour ajouter des alias au fichier .bashrc +add_alias() { + local alias_command="$1" + if ! grep -q "alias $alias_command" "$BASHRC"; then + echo "alias $alias_command" >> "$BASHRC" + echo "Ajout de l'alias : $alias_command" + else + echo "L'alias $alias_command existe déjà." + fi +} + +alias_conf(){ + # Configuration d'alias de commande sur la machine + local BASHRC="$HOME/.bashrc" + while true; do + read -p "Entrez l'alias de commande que vous souhaitez ajouter (ou 'exit' pour quitter) sous la forme "alias='commande'" : " USER_ALIAS + if [[ "$USER_ALIAS" == "exit" ]]; then + break + fi + add_alias "$USER_ALIAS" + done + + # Recharger le fichier .bashrc pour appliquer les changements + echo "Rechargement de .bashrc..." + source "$BASHRC" + +} \ No newline at end of file diff --git a/main.sh b/main.sh new file mode 100644 index 0000000..8dc8521 --- /dev/null +++ b/main.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +# Script pour durcir Debian en trois etapes : +# 1. Script de configuration et durcissement SSH +# 2. Script de configuration firewall +# 3. Script de gestion des paquets +# 4. Script de configuration de fail2ban +# 5. Script de durcissement Debian + +set -e # Exit le script immediatement si l'une des commandes retourne un code qui n'est pas zero + +# Gestion des erreurs externes aux fonctions pour ameliorer la portabilite des fonctions +trace(){ echo "# $*";"$@"; } + +echo "Lancement du script de durcissement de Debian." # Indique le debut du processus de durcissement + +#Sourcage des fichiers de configuration des services +source ./services_config/sshconf.sh || { echo "Erreur : Impossible de sourcer sshconf.sh "; exit 1; } +source ./services_config/ufwconf.sh || { echo "Erreur : Impossible de sourcer ufwconf.sh "; exit 1; } +source ./services_config/fail2banconf.sh || { echo "Erreur : Impossible de sourcer fail2banconf.sh "; exit 1; } + +#Sourcage des fichiers de configuration de l'OS +source ./os_config/update_upgrade.sh || { echo "Erreur : Impossible de sourcer managepackage.sh "; exit 1; } +source ./os_config/managepackage.sh || { echo "Erreur : Impossible de sourcer managepackage.sh "; exit 1; } +source ./os_config/hardeningdebian.sh || { echo "Erreur : Impossible de sourcer hardeningdebian.sh "; exit 1; } + +#Sourcage des fichiers de customisation de l'OS +source ./customization/customization.sh || { echo "Erreur : Impossible de sourcer customization.sh "; exit 1; } + +main(){ + # Exécution des fonctions présentes dans les différents fichiers sources + + # Mise a jour du systeme + update_upgrade || { echo " Erreur : echec de l'execution de update_upgrade "; exit 1; } + + # SSH + sshkeyconf || { echo " Erreur : echec de l'execution de sshkeyconf "; exit 1; } + sshdconf || { echo " Erreur : echec de l'execution de sshdconf "; exit 1; } + sshaccess || { echo " Erreur : echec de l'execution de sshaccess "; exit 1; } + sshrestart || { echo " Erreur : echec de l'execution de sshrestart "; exit 1; } + + # Package + disable_useless_package || { echo " Erreur : echec de l'execution de disable_useless_package "; exit 1; } + install_gpg || { echo " Erreur : echec de l'execution de install_gpg "; exit 1; } + install_unattended-upgrades || { echo " Erreur : echec de l'execution de install_unattended-upgrades "; exit 1; } + install_lynis || { echo " Erreur : echec de l'execution de install_lynis "; exit 1; } + + # Fail2ban + install_fail2ban || { echo " Erreur : echec de l'execution de install_fail2ban "; exit 1; } + cp_jailconf || { echo " Erreur : echec de l'execution de cp_jailconf "; exit 1; } + conf_jail_local || { echo " Erreur : echec de l'execution de conf_jail_local "; exit 1; } + jail_local_access || { echo " Erreur : echec de l'execution de jail_local_access "; exit 1; } + fail2ban_restart || { echo " Erreur : echec de l'execution de fail2ban_restart "; exit 1; } + fail2ban_enable || { echo " Erreur : echec de l'execution de fail2ban_enable "; exit 1; } + + # OS Hardening + auditd_conf || { echo " Erreur : echec de l'execution de auditd_conf "; exit 1; } + auditd_restart || { echo " Erreur : echec de l'execution de auditd_restart "; exit 1; } + auditd_check || { echo " Erreur : echec de l'execution de auditd_check "; exit 1; } + auditd_enable || { echo " Erreur : echec de l'execution de auditd_enable "; exit 1; } + auditd_access || { echo " Erreur : echec de l'execution de auditd_access "; exit 1; } + lynis_audit_system || { echo " Erreur : echec de l'execution de lynis_audit_system "; exit 1; } + + # Customization + conf_banniere + alias_conf + + # UFW + installufw || { echo " Erreur : echec de l'execution de installufw "; exit 1; } + ufwconf || { echo " Erreur : echec de l'execution de ufwconf "; exit 1; } + ufwreload || { echo " Erreur : echec de l'execution de ufwreload "; exit 1; } + ufwenable || { echo " Erreur : echec de l'execution de ufwenable "; exit 1; } + + echo "Durcissement termine avec succes." # Affiche un message de succes si toutes les etapes se sont bien deroulees +} + +# Verifie si l'utilisateur est root pour pouvoir executer le script +if [ "$(id -u)" -ne 0 ]; then + echo " Erreur : Vous n'avez pas les privileges necessaire ( Commande debian : su ) pour executer ce script. " + exit 1 +fi + +#Execution du script +main + + diff --git a/os_config/hardeningdebian.sh b/os_config/hardeningdebian.sh new file mode 100644 index 0000000..4653b0f --- /dev/null +++ b/os_config/hardeningdebian.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +auditd_conf(){ + # Ajout de regles d'audit de base sur les fichiers critiques + echo "# Surveille les modifications sur les fichiers critiques + -w /etc/passwd -p wa -k passwd_changes + -w /etc/shadow -p wa -k shadow_changes + -w /etc/group -p wa -k group_changes + + # Surveille les connexions SSH + -w /var/log/secure -p wa -k ssh_logins + + # Surveille les tentatives de connexion echouees + -w /var/log/faillog -p wa -k failed_logins + + # Surveille les modifications dans le repertoire /etc + -w /etc/ -p wa -k etc_changes" >> /etc/audit/rules.d/audit.rules + +} + + +auditd_restart(){ + # Redemarrer auditd pour appliquer les nouvelles regles + echo "Redemarrage de auditd pour appliquer les nouvelles regles" + systemctl restart auditd +} + +auditd_check(){ + # Verifie les regles d'audit + echo "Regles d'audit appliquees :" + auditctl -l +} + +auditd_enable(){ + # Active le demarrage automatique du service auditd + systemctl enable auditd +} + +auditd_access(){ + # Gestion des acces aux fichiers sensibles + chmod 400 /etc/passwd # Le fichier /etc/passwd contient les informations des utilisateurs, il est securise pour eviter tout acces non autorise + chmod 400 /etc/shadow # Le fichier /etc/shadow contient les mots de passe haches des utilisateurs, il doit etre tres protege +} + +lynis_audit_system(){ + # Lancement d'un audit du systeme avec lynis pour terminer le durcissement Debian + echo "Lancement d'un audit du systeme avec lynis pour terminer le durcissement Debian" + lynis audit system +} \ No newline at end of file diff --git a/os_config/managepackage.sh b/os_config/managepackage.sh new file mode 100644 index 0000000..7c6b585 --- /dev/null +++ b/os_config/managepackage.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +disable_useless_package(){ + # Desactivation des services inutiles et non securises + echo "Desactivation des services inutiles et non securises" + apt purge telnet sendmail nis talk iptables-persistent -y + apt autoremove -y +} + +install_gpg(){ + # Installation du paquet gpg pour le chiffrement des donnees sensibles + echo "Installation du paquet gpg pour le chiffrement des donnees sensibles" + apt-get install gpg -y + gpg --full-generate-key +} + +install_unattended-upgrades(){ + # Installation du paquet Unattended-upgrades pour les mises à jour automatique (par defaut 3h du matin) + echo "Installation du paquet Unattended-upgrades pour les mises à jour automatique (par defaut 3h du matin)" + apt-get install unattended-upgrades apt-listchanges -y + dpkg-reconfigure unattended-upgrades +} + +install_lynis(){ + # Installation du paquet lynis pour pouvoir ulterieurement auditer le systeme + echo "Installation du paquet lynis pour pouvoir ulterieurement auditer le systeme" + apt-get install lynis -y +} \ No newline at end of file diff --git a/os_config/update_upgrade.sh b/os_config/update_upgrade.sh new file mode 100644 index 0000000..3b2c22b --- /dev/null +++ b/os_config/update_upgrade.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +update_upgrade(){ + + # Mise a jour des paquets et du systeme avec le paramètre -y pour automatiquement accepter les + # propositions interactives de l'invite de commande + echo "Mise a jour du systeme" + apt-get update -y + apt-get upgrade -y + +} \ No newline at end of file diff --git a/services_config/fail2banconf.sh b/services_config/fail2banconf.sh new file mode 100644 index 0000000..21fbac4 --- /dev/null +++ b/services_config/fail2banconf.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +install_fail2ban(){ + # Installation de fail2ban + echo "Installation de fail2ban" + apt-get install fail2ban -y +} + +cp_jailconf(){ + # Copie du fichier de configuration jail.conf dans jail.local + echo "Copie du fichier de configuration jail.conf dans jail.local" + cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local +} + +conf_jail_local(){ + # Configuration de la jail DEFAUT + echo "Configuration de la jail DEFAUT" + bash -c 'cat << EOF >> /etc/fail2ban/jail.local +[DEFAULT] +ignoreip = 127.0.0.1/8 +bantime = 1h +findtime = 10m +maxretry = 3 +EOF' + + # Configuration de la jail SSH + echo "Configuration de la jail sshd" + bash -c 'cat << EOF >> /etc/fail2ban/jail.local +[sshd] +enabled = true +port = ssh +filter = sshd +logpath = /var/log/auth.log +maxretry = 2 +bantime = 1d +EOF' + + # Configuration de la jail recidive + echo "Configuration de la jail recidive" + bash -c 'cat << EOF >> /etc/fail2ban/jail.local +[recidive] +enabled = true +filter = recidive +logpath = /var/log/fail2ban.log +maxretry = 1 +bantime = 30d +findtime = 1d +EOF' + +} + +jail_local_access(){ + # Gestion des acces au fichier jail.local + echo "Gestion des acces au fichier jail.local" + chmod 600 /etc/fail2ban/jail.local +} + +fail2ban_restart(){ + # Demarrage du service fail2ban + systemctl start fail2ban + systemctl reload fail2ban +} + +fail2ban_enable(){ + # Configuration du demarrage automatique du service fail2ban + systemctl enable fail2ban +} \ No newline at end of file diff --git a/services_config/sshconf.sh b/services_config/sshconf.sh new file mode 100644 index 0000000..8217d91 --- /dev/null +++ b/services_config/sshconf.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +sshkeyconf(){ + # Generation d'une cle SSH chiffree en RSA et copie de cette cle dans le dossier des cles autorisees + echo 'Generation et copie de la cle SSH dans le fichier ~/.ssh/authorized_keys' + echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDhbYLpulxdE6C4p+CwV3mdhZu0eomnMUTCplDmZtXggrkvTUDTmJrCBtYvl9TkFAjSP5sYVaqSDpBrHiUJagdLKacvNMxtHoRCduO/b7aNBa7SMTxU69o9IpqgNhPoZyFuTaASdMbBO4ArxqoxaW106se5oGZIOcFUj9SWqcN+2JYIkjhT0A7GIbs2ntuEKIF4Sxkl0ZVoc8ksKVzRmGOm0UiCm9DG+Xk3b35h4Ids2pY/0dPJw5AXHRnitfQGD47DfUzEjEPKVSPTtgcR8RTi5NJdtWh3uY6r4kA058rAqrXduFsFOORF+jAj9YqyNlxjS2RWYSP4c9TPTDIwG3EuqQD2XeOf1m7CDcEIdzKhJYY5PoElqNP6yP4S77MAU/mBQ3et6Ol6fmEZylP4Eyj9Ke3TwWyrBri851kw+PYUZRm2vnhCj7dQd6KsI0r3HcDj34HjFOCkCcSNHzAfEfx/kkKiAxX5N0wUMPpHmeZFCDT6Vm+IFLuqYz4qal3KjGfp4ZdrhXQ8eRSij+emq+uGroSYCmD72DEfbrkCvTRCceVwY8z9EGcuimNizVvsv3ajhjOVrpBo/RIZ6NRDWQDHDo6+CeJa9NnXVJPDh2MJu5vmO3NnU19krhWv4oTbyEzG8zWclktZ4HSoaZe5Y57RVG+uP3EO/Qrw+jNz/KlI8w== sarah@Blackpearl" >> ~/.ssh/authorized_keys + chmod 600 ~/.ssh/authorized_keys +} + +sshdconf(){ + # Changement de la valeur du Protocol à 2 + echo "Changement de la valeur Protocol à 2 dans sshd_config" + # Verification de l'existence du parametre Protocol dans le fichier sshd_config + # Si le parametre n'existe pas, alors on ajoute la ligne Protocol 2 dans le fichier + # Sinon, on modifie la ligne deja existante + if [ $(cat /etc/ssh/sshd_config | grep Protocol | wc -l) -eq 0 ]; + then echo "Protocol 2" >> /etc/ssh/sshd_config + else sed -i -e '1,/#Protocol [a-zA-Z0-9]/s/#Protocol [a-zA-Z0-9]/Protocol 2/' /etc/ssh/sshd_config + sed -i -e '1,/Protocol [a-zA-Z0-9]/s/Protocol [a-zA-Z0-9]/Protocol 2/' /etc/ssh/sshd_config + fi + + echo "Changement de la valeur MaxAuthTries à 2 dans sshd_config" + # Verification de l'existence du parametre MaxAuthTries dans le fichier sshd_config + # Si le parametre n'existe pas, alors on ajoute la ligne MaxAuthTries 2 dans le fichier + # Sinon, on modifie la ligne deja existante + if [ $(cat /etc/ssh/sshd_config | grep MaxAuthTries | wc -l) -eq 0 ]; + then echo "MaxAuthTries 2" >> /etc/ssh/sshd_config + else sed -i -e '1,/#MaxAuthTries [a-zA-Z0-9]/s/#MaxAuthTries [a-zA-Z0-9]/MaxAuthTries 2/' /etc/ssh/sshd_config + sed -i -e '1,/MaxAuthTries [a-zA-Z0-9]/s/MaxAuthTries [a-zA-Z0-9]/MaxAuthTries 2/' /etc/ssh/sshd_config + fi + + # Interdire l'utilisation du login root pour SSH + echo "Interdire l'utilisation du login root pour SSH" + sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config + + # Empecher l'authentification SSH par mots de passe et forcer l'utilisation des cles + echo "Empecher l'authentification SSH par mots de passe" + sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config + + # Ajout des utilisateurs autorises à utiliser SSH + echo 'Ajout des utilisateurs autorises à utiliser SSH' + read -p "Choisir la liste des utilisateurs autorises a se connecter en SSH (a separer avec un espace) : " ALLOWED_USERS + echo "AllowUsers $ALLOWED_USERS" >> /etc/ssh/sshd_config + + # Refuser l'utilisateur root en SSH + echo "Refus de l'utilisateur root en SSH" + echo 'DenyUsers root' >> /etc/ssh/sshd_config + + # Refuser le groupe root en SSH + echo 'Refus du groupe root en SSH' + echo 'DenyGroups root' >> /etc/ssh/sshd_config + +} + +sshaccess(){ + # Gestion des autorisations d'acces au fichier sshd_config + echo "Modification des acces au fichier sshd_config" + chmod 600 /etc/ssh/sshd_config +} + +sshrestart(){ + # Redemarrage du service sshd pour que les modifications soient prises en compte + echo "Redemarrage du service sshd" + systemctl restart sshd +} \ No newline at end of file diff --git a/services_config/ufwconf.sh b/services_config/ufwconf.sh new file mode 100644 index 0000000..e8c98b9 --- /dev/null +++ b/services_config/ufwconf.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +installufw(){ + # Installation du Firewall UFW + echo 'Installation du paquet ufw' + apt-get install ufw -y +} + +ufwconf(){ + # Activer les logs de UFW + echo 'Mise en place des logs ufw' + ufw logging on + + # Refuser le traffic entrant par defaut + echo 'Refus du traffic entrant par defaut' + ufw default deny incoming + + # Autoriser le traffic sortant par defaut + echo 'Autorise le traffic sortant par defaut' + ufw default allow outgoing + + # Autoriser le port SSH en entree + echo 'IAutorise le port SSH en entree' + ufw allow in ssh + + # Autoriser le port HTTPS en entree + echo 'Autorise le port HTTPS en entree' + ufw allow in https + + # Autoriser le port HTTP en entree + echo 'Autorise le port HTTP en entree' + ufw allow in http + +} + +ufwreload(){ + # On reload le service pour pouvoir prendre en compte les modifications + echo 'Application des modifications ufw' + ufw reload +} + +ufwenable(){ + # On enable le service pour qu'il demarre au demarrage automatiquement + echo 'Configuration du demarrage automatique de ufw' + ufw enable +} \ No newline at end of file