Let's Encrypt

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche
Ligne 47 : Ligne 47 :
  
 
<code>
 
<code>
#!/bin/sh
+
\#!/bin/sh
  
 
# Définition des variables
 
# Définition des variables
Ligne 54 : Ligne 54 :
 
LOG_FILE=$LOG_DIR/$SCRIPT_NAME$(date +"_%Y-%d-%m_%H-%M").log
 
LOG_FILE=$LOG_DIR/$SCRIPT_NAME$(date +"_%Y-%d-%m_%H-%M").log
 
TEMP_DIR=/tmp
 
TEMP_DIR=/tmp
REMOTE_HOST=pfs.jordan-lenuff.com
+
REMOTE_HOST=xxxxxxxx
REMOTE_USER=root
+
REMOTE_USER=xxxxxxx
REMOTE_DIR=/tmp/acme/sysesx/sysesx.jordan-lenuff.com
+
REMOTE_DIR=xxxxxxxxxxxxxxxxxxxxxxxxxx
REMOTE_CERT=sysesx.jordan-lenuff.com.cer
+
REMOTE_CERT=xxxxxxxxxxxxxxxxxxxx.cer
 
LOCAL_DIR=/etc/vmware/ssl
 
LOCAL_DIR=/etc/vmware/ssl
 
LOCAL_CERT=rui.crt
 
LOCAL_CERT=rui.crt

Version du 18 juin 2018 à 14:02

Installation de Cerbot

yum install python2-certbot-apache

Installation sur un ESXi

Au regard de la complexité d'installation de cerbot et de ses dépendances sur un ESXi, il a été décidé de s'appuyer sur le package Acme du routeur/pare-feu pfSense pour générer le certificat et sur un script shell pour rapatrier ledit certificat sur l'ESXi.

Créer les clés SSH

ssh-keygen n'étant pas présent sur le serveur ESXi, nous allons lancer la commande suivante sur un autre serveur Linux :

ssh-keygen -t rsa

Cela génère une clé privée .ssh/id_rsa et une clé publique .ssh/id_rsa.pub.

Editer la clé publique .ssh/id_rsa.pub, modifier le nom d'utilisateur et le nom d'hôte afin que cela corresponde avec l'utilisateur et le nom de l'ESXi.

Sur le serveur Linux, copier les clés SSH précédemment générées et les déposer sur le serveur ESXi dans un dossier .ssh créé à la racine du dossier home de l'utilisateur de l'ESXi.

Sur le serveur ESXi, sécuriser l'accès au dossier .ssh :

chmod 700 .ssh
chmod 600 .ssh/*

Au niveau du routeur/pare-feu pfSense, mettre en place les règles nécessaires afin de n'ajouter l'autorisation de connexion SSH qu'au serveur ESXi seulement.

Sur le routeur/pare-feu pfSense, se connecter en SSH en tant que root et créer un dossier .ssh à la racine du dossier home :

mkdir ~/.ssh

Editer un fichier ~/.ssh/authorized_keys et ajouter le contenu de la clé publique id_rsa.pub précédemment créée.

Sécuriser l'accès au dossier .ssh du routeur/pare-feu pfSense :

chmod 700 .ssh
chmod 600 .ssh/*

Depuis le serveur ESXi, faire un test de connexion SSH vers le routeur/pare-feu pfSense, la connexion devrait être fonctionnelle et ne pas demander de mot de passe.

Sauvegarde des certificats par défaut

Sur le serveur ESXi, sauvegarder la clé privée et le certificat existants :

mv /etc/vmware/ssl/rui.crt /etc/vmware/ssl/rui.crt_sav20180618
mv /etc/vmware/ssl/rui.key /etc/vmware/ssl/rui.key_sav20180618

Automatisation de la récupération du certificat SSL

Grâce à l'authentification par clé SSH précédemment réalisée, le script suivant permet la récupération automatique du certificat SSL d'une part, et la mise à jour de ce dernier sur le serveur ESXi si nécessaire d'autre part.

\#!/bin/sh

  1. Définition des variables

LOG_DIR=/var/log/ssl_cert SCRIPT_NAME=$(echo $0|awk -F"/" '{print $NF}'|awk -F"." '{print $1}') LOG_FILE=$LOG_DIR/$SCRIPT_NAME$(date +"_%Y-%d-%m_%H-%M").log TEMP_DIR=/tmp REMOTE_HOST=xxxxxxxx REMOTE_USER=xxxxxxx REMOTE_DIR=xxxxxxxxxxxxxxxxxxxxxxxxxx REMOTE_CERT=xxxxxxxxxxxxxxxxxxxx.cer LOCAL_DIR=/etc/vmware/ssl LOCAL_CERT=rui.crt

  1. Récupération du certificat

scp $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$REMOTE_CERT $TEMP_DIR/ >> $LOG_FILE 2>&1

ERROR_CODE_SCP=$?

if [ $ERROR_CODE_SCP -eq 0 ] # Le SCP s'est bien déroulé then echo $(date "+%F %T ")"Le code erreur scp est "$ERROR_CODE_SCP". Suite du script." >> $LOG_FILE 2>&1 # Comparaison des certificats diff $TEMP_DIR/$REMOTE_CERT $LOCAL_DIR/$LOCAL_CERT >> $LOG_FILE 2>&1

ERROR_CODE_DIFF=$?

if [ $ERROR_CODE_DIFF -eq 0 ] # Le diff ne remonte aucune différence then echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Le diff ne remonte aucune différence. Arrêt normal du script." >> $LOG_FILE 2>&1 exit 0 elif [ $ERROR_CODE_DIFF -eq 1 ] # Le diff remonte une différence then echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1 # Sauvegarde de l'ancien certificat mv $LOCAL_DIR/$LOCAL_CERT $LOCAL_DIR/$LOCAL_CERT$(date +"_sav%Y%d%m") >> $LOG_FILE 2>&1

ERROR_CODE_MV1=$?

if [ $ERROR_CODE_MV1 -eq 0 ] # Le mv1 s'est bien déroulé then echo $(date "+%F %T ")"Le code erreur mv1 est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1 # Mise en place du nouveau certificat mv $TEMP_DIR/$REMOTE_CERT $LOCAL_DIR/$LOCAL_CERT >> $LOG_FILE 2>&1

ERROR_CODE_MV2=$?

if [ $ERROR_CODE_MV2 -eq 0 ] # Le mv2 s'est bien déroulé then echo $(date "+%F %T ")"Le code erreur mv2 est "$ERROR_CODE_DIFF". Suite du script." >> $LOG_FILE 2>&1 # Relance des services de l'ESXi pour prise en compte du nouveau certificat /bin/services.sh >> $LOG_FILE 2>&1 exit 0 else # Le mv2 rencontre une erreur echo $(date "+%F %T ")"Le code erreur mv2 est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1 exit 1 fi else # Le mv1 rencontre une erreur echo $(date "+%F %T ")"Le code erreur mv1 est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1 exit 1 fi else # Le diff rencontre une erreur echo $(date "+%F %T ")"Le code erreur diff est "$ERROR_CODE_DIFF". Arrêt prématuré du script." >> $LOG_FILE 2>&1 exit 1 fi

else # Le SCP a rencontré une erreur echo $(date "+%F %T ")"Le code erreur scp est "$ERROR_CODE_SCP". Arrêt prématuré du script." >> $LOG_FILE 2>&1 exit 1 fi