diff --git a/Scripting_V6.zip b/Scripting_V6.zip new file mode 100644 index 0000000..8ef0a6e Binary files /dev/null and b/Scripting_V6.zip differ diff --git a/Scripting_V6/config/CONFIG_FILE.sh b/Scripting_V6/config/CONFIG_FILE.sh new file mode 100644 index 0000000..2370593 --- /dev/null +++ b/Scripting_V6/config/CONFIG_FILE.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +CONFIG_FILE(){ + + + + + #Variables de SSH_config_hardenning + + #Tant que le format IP est faux renvoyer une demande de saisie + echo "" + read -p " Entrez les adresses IPs autorisee pour la connection SSH ( xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx ... ) : " ALLOWED_IPS + while [[ ! "$ALLOWED_IPS" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; do + echo " Erreur : Adresse IP non valide " + read -p " Veuillez entrer une adresse IP valide : " ALLOWED_IPS + done + echo " Les IP en White List : $ALLOWED_IPS " + # while done Boucle conditionnelle itérative Tant que + # [[ ... ]] Permet les operateur logique interne et les espaces et metacaractere + # ! Invers la condition + # =~ Faire correspondre a une chaine de caractere + # ^ Debut de la chaine + # [0-9] Un chiffre entre 0 et 9 + # + Lindiquation precedente peut se repeter plusieur fois + # $ Fin de la chaine + # \. Represente un point litteral + # do Precede les commandes a executer si la condition est fausse + + + + #Variables de SSH_keys_registration + + #Choix du chemin du fichier de configuration SSH + echo "" + read -p " Entrez le chemin du fichier de configuration SSH ( par defaut /etc/ssh/sshd_config ) :" SSH_CONFIG + SSH_CONFIG=${SSH_CONFIG:-/etc/ssh/sshd_config} + echo " Le chemin configure du fichier de configuration SSH : $SSH_CONFIG " + # Chemin absolu et non pas relatif + + #Choix des utilisateurs autorises + echo "" + read -p " Entrez les utilisateur autorise ( "user1" "user2" ...) : " ALLOWED_USERS + ALLOWED_USERS=${ALLOWED_USERS:-User1} + echo " Les utlisateurs autorises : $ALLOWED_USERS " + + + + #Variables de MAJ.sh + + #Demander la mise a jour ou non de lhote + echo "" + while [[ "$MAJ_ANS" != "o" && "$MAJ_ANS" != "n" ]]; do + read -p " Souhaitez-vous mettre à jour la machine Debian ? ( Par defaut o ; Sinon : o/n) : " MAJ_ANS + MAJ_ANS=${MAJ_ANS:-o} + done + echo " Etat de la demande de mise a jour de lhote : $MAJ_ANS " + # != Different de + # && Opérateur ET logique les deux conditions doivent etre vraie + + + + +} diff --git a/Scripting_V6/fonctions/BONUS.sh b/Scripting_V6/fonctions/BONUS.sh new file mode 100644 index 0000000..4e26653 --- /dev/null +++ b/Scripting_V6/fonctions/BONUS.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +bonus(){ + + # Si fail2ban est deja installe, sinon ... + if dpkg -l | grep -qw fail2ban; then + echo "Fail2ban est déjà installé." + else + echo "Installation de Fail2ban..." + apt install -y fail2ban + fi + # dpkg Gere les paquets du systeme + # -l Cherche tous les paquets du systeme + # q Mode Silencieux + # w Fait correspondre le mot entier + + + + # Création de son répertoire de configuration sil nexiste pas + #if [ ! -d /etc/fail2ban/jail.d ]; then + # mkdir -p /etc/fail2ban/jail.d + #fi + # + #echo "" > /etc/fail2ban/jail.d/ssh.conf + + # Se renseigner sur les parametres + + + + +} \ No newline at end of file diff --git a/Scripting_V6/fonctions/MAJ.sh b/Scripting_V6/fonctions/MAJ.sh new file mode 100644 index 0000000..480b3b0 --- /dev/null +++ b/Scripting_V6/fonctions/MAJ.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +update_upgrade(){ + + #Mise a jour de lhote + echo "" + if [[ "$MAJ_ANS" == "o" ]]; then + apt update && apt upgrade -y + fi + # apt Gestionnaire de paquets de Debian + # update Met a jour la liste des paquets disponibles a partir des depots existant + # upgrade Met a jour tous les paquets installes + # -y Repond automatiquement oui a toutes les invitations interactives de la commande + +} diff --git a/Scripting_V6/fonctions/PERSONNALISATION.sh b/Scripting_V6/fonctions/PERSONNALISATION.sh new file mode 100644 index 0000000..d57a3a5 --- /dev/null +++ b/Scripting_V6/fonctions/PERSONNALISATION.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +PERSONNALISATION() { + + + + # Alias pour la mise à jour + if ! grep -q "alias upd=" ~/.bashrc; then + echo "Création de l'alias 'upd' " + echo "alias upd='sudo apt update && sudo apt upgrade -y'" >> ~/.bashrc + else + echo "L'alias 'upd' existe déjà. " + fi + + # Personnalisation du prompt + PROMPT='PS1="\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\] \$(if [ \$? -eq 0 ]; then echo -e \":)\"; else echo -e \":(\"; fi) \[\033[0m\]\$ "' + + # Verifie si elle existe deja + if grep -Fxq "$PROMPT" ~/.bashrc; then + echo "Le prompt est déjà personnalisé de la sorte." + else + echo "$PROMPT" >> ~/.bashrc + echo "Le prompt personnalisé a été ajouté dans ~/.bashrc" + fi + + # Appliquer les changements + source ~/.bashrc + + + +} \ No newline at end of file diff --git a/Scripting_V6/fonctions/SSH_config_hardenning.sh b/Scripting_V6/fonctions/SSH_config_hardenning.sh new file mode 100644 index 0000000..d9e8447 --- /dev/null +++ b/Scripting_V6/fonctions/SSH_config_hardenning.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +SSH_config_hardenning(){ + + #Desactivation de lauthentification par MDP + #Si PasswordAuthentication existe dans $SSH_CONFIG la modifier par PasswordAuthentication no + echo "" + if grep -q "^PasswordAuthentication" $SSH_CONFIG; then + sed -i 's/^PasswordAuthentication.*/PasswordAuthentication no/' $SSH_CONFIG + fi + echo "L'authentification par mot de passe a ete desactivee." + # Grep Cherche une chaine de caractere dans la variable + # -q Retourne un code 0 si la chaine de caractere est trouvee sinon code erreur 1 + # ^ Pour chercher une ligne qui commence par PasswordAuthentication + # sed Permet a la boucle de modifier le contenu du fichier automatiquement + # -i Modification dans le fichier existant + # S/.../... Remplace les premiers ... par les deuxiemes ... dans la variable designee + # .* Quelques soit la suite + + #Definition des utilisateurs autorises + #Si ^AllowUsers.* existe dans $SSH_CONFIG la modifier par AllowUsers suivi du contenu de $ALLOWED_USERS + #Sinon ajouter une ligne AllowUsers $ALLOWED_USERS dans $SSH_CONFIG + echo "" + if grep -q "^AllowUsers" $SSH_CONFIG; then + sed -i "s/^AllowUsers.*/AllowUsers $ALLOWED_USERS/" $SSH_CONFIG + else + echo "AllowUsers $ALLOWED_USERS" >> $SSH_CONFIG + fi + echo "L'acces en ssh a ete accorde aux utilisateurs : $ALLOWED_USERS. Profitez bien ;)" + # AllowUsers $ALLOWED_USERS Ajoute le contenu de $ALLOWED_USERS après AllowUsers le tout dans la varibale designee + # else Permet lajout de reponses au test de la condition a la boucle + # >> Ajout de caractere dans la variable en concervant ceux deja existant + + #Desactivation de lauthentification SSH root + #Si ^PermitRootLogin.* existe dans $SSH_CONFIG la modifier par PermitRootLogin no + #Sinon ajouter une ligne PermitRootLogin no dans $SSH_CONFIG + echo "" + if grep -q "^PermitRootLogin" $SSH_CONFIG; then + sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' $SSH_CONFIG + else + echo "PermitRootLogin no" >> $SSH_CONFIG + fi + echo "L'acces de l'utilisateur root en ssh a ete desactive" + + #Definition des IP autorisees + #Pour toute les IP dans ALLOWED_IPS les ajouter dans $SSH_CONFIG + echo "" + for ip in "${ALLOWED_IPS[@]}"; do + echo "Match Address $ip" >> $SSH_CONFIG + done + # for done Boucle d'itération for + # ip Variable allant stocker les valeur de ALLOWED_IPS + # in Literation aura lieu dans ALLOWED_IPS + # [@] Donne lacces aux valeurs de ALLOWED_IPS + # do Precede les commandes a executer apres avoir parcouru les valeurs + + #Redemarrer le service SSH afin dappliquer les changements effectues + echo "" + systemctl restart sshd + systemctl restart ssh + echo "Liste blanche des IP et utilisateur configuree avec succes." + echo "Service SSH redemarre avec succes." + # systemctl Etilisé pour démarrer arrêter redémarrer vérifier le statut ou activer et désactiver les services système + # restart Defini sur redémarrer + # sshd & ssh Pour des soucis de compatibilite entre les differentes distributions linux + +} diff --git a/Scripting_V6/fonctions/SSH_keys_registration.sh b/Scripting_V6/fonctions/SSH_keys_registration.sh new file mode 100644 index 0000000..e108ac4 --- /dev/null +++ b/Scripting_V6/fonctions/SSH_keys_registration.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +SSH_keys_registration(){ + + + # PEUT ETRE SUPPR EVAL ET &>/dev/null + + #Verifier lexistance de lutilisateur sinon le creer generee sa clee et ses repertoir associe si necessaire + #Parcourir les valeurs de $ALLOWED_USERS et les mettre dans la variable temporaire de boucle user + for user in $ALLOWED_USERS; do + + #Si lutilisateur dans $user existe id renvera son identifiant sinon rien + echo "" + if ! id "$user" &>/dev/null; then + echo "Si l'utilisateur $user n'existe pas, pensez à le créer et déplacer les clées généré ultérieurement. Elles sont à la racine du script." + # &>/dev/null Desencombre le shell en mettant les sortie dans le fichier /dev/null + fi + #Definion du repertoire home de lutilisateur + USER_HOME=$(eval echo ~$user) + # eval Obtient dabord le contenu de la commande avant de lexecuter + # ~$user Renvoi le repertoir de lutilisateur + # On genere ou nouvelle variable interne a cet boucle + + #Definion du repertoire SSH de lutilisateur + SSH_DIR="$USER_HOME/.ssh" + # /.ssh Ajouter ce repertoire dans le home + + #Si le repertoire .ssh nexiste pas le creer + echo "" + if [ ! -d "$SSH_DIR" ]; then + echo "Creation du repertoire SSH de $user" + mkdir -p "$SSH_DIR" + chown $user:$user "$SSH_DIR" + chmod 700 "$SSH_DIR" + fi + # -d Vraie si le repertoir existe + # chmod Gere les permission repertoir et fichier + # 7 Tous pour le proprietaire du repertoire + # 0 Rien pour les membres du groupe de lutilisaeur + # 0 Rien pour les autres utilisateurs + + #Definition du repertoir des clee RSA + KEY_FILE="$SSH_DIR/id_rsa" + + #Generer une paire de cles SSH ( privee et public ) + echo "" + echo "Generation des clee rsa de $user" + ssh-keygen -t rsa -b 2048 -f "$KEY_FILE" -q -N "" + # ssh-keygen Outil de generation de clee SSH + # -t Choisir le type de clee genere ici type rsa + # -b Specifie la taille de la clee ici 2048 bits + # -f Specifi le chemin et nom du fichier ici dans la variable KEY_PATH + # -N Specifie une phrase de pass qui protege la clee privee ( ici null car pas de valeur apres N ) + + #Deplacer la cle publique dans authorized_keys + echo "" + echo "Ajout de la cle publique dans authorized_keys pour $user" + cat "$KEY_FILE.pub" >> "$SSH_DIR/authorized_keys" + chown $user:$user "$SSH_DIR/authorized_keys" + chmod 600 "$SSH_DIR/authorized_keys" + # cat Renvoi le contenu dun fichier + # chown Gere lappartenance des repertoire et fichier + # $user:$user Utilisateur:Groupe:Autres + # 6 Lecture et ecriture + + #Gestion privileges sur les clees rsa + chown $user:$user "$KEY_FILE" + chmod 600 "$KEY_FILE" + # Les utilisateurs ne sont pas admin pas besoin des plein droits sur les clees + + echo "Clees RSA generee pour $user" + + done + + echo "Gestion des clees RSA pour lacces SSH termine ." + + + + +} diff --git a/Scripting_V6/fonctions/UFW_config_hardenning.sh b/Scripting_V6/fonctions/UFW_config_hardenning.sh new file mode 100644 index 0000000..ca36b72 --- /dev/null +++ b/Scripting_V6/fonctions/UFW_config_hardenning.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +UFW_config_hardenning(){ + + #Si ufw n'est pas installer, l'installer + if ! command -v ufw > /dev/null; then + sudo apt install -y ufw; + fi + # command Execute la commande. + # v Vérifie si la commande existe + + # Activation du pare feu + ufw default deny incoming + ufw default allow outgoing + + ufw allow ssh + ufw enable + +} + diff --git a/Scripting_V6/main_script.sh b/Scripting_V6/main_script.sh new file mode 100644 index 0000000..fbe8ea2 --- /dev/null +++ b/Scripting_V6/main_script.sh @@ -0,0 +1,72 @@ +#!/bin/bash +#Definit au systeme quon utilise Bash + +#La gestion des erreurs du script se fait ici et pas dans les fonctions pour ameliorer leur portabilite +trace(){ + echo "# $*" + "$@" +} + # Non_de_la_fonction(){ Contenu de la fonction } Les parenthese indique que cest une fonction + # echo Affiche des chaines de caracteres + # ; Peut remplacer lindentation pour tout mettre sur une linge + # # Applique un aspect visuel aux commandes renvoyees dans le shell + # $* Permer de retourner les argument utilise par les fonctions du script + # s@ Represente les arguments des fonctions ( ici valeur des variables ) + # Les guillementspPreserve les espace dans les arguments + # La derniere ligne definit donc le format de renvoi des arguments utilises par la fonction + +set -e + # set Active ou desactive les otpions du shell + # - Activation ( + desactivation ) + # x Enonciation des commandes avant execution + # e Arret du script en cas de code erreur + + +#Sourcage du fichier des variables +source ./config/CONFIG_FILE.sh || { echo "Erreur : Impossible de sourcer CONFIG_FILE.sh."; exit 1; } + # source Execute au prealable les fonctions du fichier pour les rendre accessible a posteriorie + # Chemin relatif et pas absolue + # Double pie est un oOperateur logique Si lexecution reussi passer a la commande suivante sinon renvoyer le code erreur + # { ... ; ... } Groupage de commandes qui permet dexecuter plusieurs commandes pour une meme sortie booleenne + # exit 1 est un code de sortie qui indique une erreur ( en opposition à 0 ) + +#Sourcage des fichiers de fonctions +source ./fonctions/PERSONNALISATION.sh || { echo "Erreur : Impossible de sourcer PERSONNALISATION.sh "; exit 1; } +source ./fonctions/MAJ.sh || { echo "Erreur : Impossible de sourcer MAJ.sh"; exit 1; } +source ./fonctions/SSH_keys_registration.sh || { echo " Erreur : Impossible de sourcer SSH_keys_registration.sh "; exit 1; } +source ./fonctions/SSH_config_hardenning.sh || { echo " Erreur : Impossible de sourcer SSH_config_hardenning.sh "; exit 1; } +source ./fonctions/UFW_config_hardenning.sh || { echo " Erreur : Impossible de sourcer UFW_config_hardenning.sh "; exit 1; } +source ./fonctions/BONUS.sh || { echo " Erreur : Impossible de sourcer BOnUS.sh "; exit 1; } + +#Definition de la fonction dexecution du script +main(){ + + echo "Demarrage du script..." + + #Organisation de lexecution des fonctions presentent dans les fichiers sources + CONFIG_FILE || { echo " Erreur : echec de l'execution de CONFIG_FILE. "; exit 1; } + PERSONNALISATION || { echo " Erreur : echec de l'execution de PERSONNALISATION. "; exit 1; } + update_upgrade || { echo " Erreur : echec de l'execution de update_upgrade. "; exit 1; } + SSH_keys_registration || { echo " Erreur : echec de l'execution de SSH_keys_registration. "; exit 1; } + SSH_config_hardenning || { echo " Erreur : echec de l'execution de SSH_config_hardenning. "; exit 1; } + UFW_config_hardenning || { echo " Erreur : echec de l'execution de UFW_config_hardenning. "; exit 1; } + bonus || { echo " Erreur : echec de l'execution de bonus. "; exit 1; } + + echo "Script termine." +} + +#Si il est vraie que lutilisateur na pas les privileges root retourner une erreur +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 + # if fi Boucle conditionnelle if + # [ ... ] La condition a tester + # $( ... ) Execute la commande interne au parenthese puis la remplace par le resultat de cette derniere + # id -u Retourne lidentifiant de lutilisateur + # -ne Different de + # 0 Droit root + # then Precede les commandes a executer si la condition est vraie + +#Execution du script +main