Let's Encrypt
Sommaire
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
- 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=pfs.jordan-lenuff.com
REMOTE_USER=root
REMOTE_DIR=/tmp/acme/sysesx/sysesx.jordan-lenuff.com
REMOTE_CERT=sysesx.jordan-lenuff.com.cer
LOCAL_DIR=/etc/vmware/ssl
LOCAL_CERT=rui.crt
- 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