linux_ejbca

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
linux_ejbca [2024/03/21 12:35] nekanlinux_ejbca [2024/03/26 16:53] (Version actuelle) – [L'état des différents containers] nekan
Ligne 1: Ligne 1:
 ====== EJBCA - Installation d'une infrastructure à clés publiques (PKI) ====== ====== EJBCA - Installation d'une infrastructure à clés publiques (PKI) ======
  
-<label type="success">Création</label>  --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2024/03/19 10:29// +<label type="success">Création</label>  --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2024/03/19 10:29// \\ 
-<label type="info">Modification</label>  --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2024/03/21 11:28//+<label type="info">Modification</label>  --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2024/03/26 16:26//
  
 Une infrastructure à clés publiques ou PKI (//**P**ublic **K**ey **I**nfrastructure//) est un ensemble de services permettant de gérer des clés publiques et se faisant, permettant l'authentification d'un service, système ou utilisateur. Une infrastructure à clés publiques ou PKI (//**P**ublic **K**ey **I**nfrastructure//) est un ensemble de services permettant de gérer des clés publiques et se faisant, permettant l'authentification d'un service, système ou utilisateur.
Ligne 135: Ligne 135:
         echo "Script de gestion du service EJBCA"         echo "Script de gestion du service EJBCA"
         echo ""         echo ""
-        echo "Usage : ./manage-ejbca-daemon.sh [start|stop|restart|status|help]"+        echo "Usage : ./manage-ejbca-daemon.sh [backup|help|restart|start|status|stop|upgrade]"
         echo ""         echo ""
-        echo "start                     Démarre l'instance." +        echo "backup                    Sauvegarde la base de données." 
-        echo "stop                      Arrête l'instance."+        echo "help                      Affiche cette aide."
         echo "restart                   Redémarre l'instance."         echo "restart                   Redémarre l'instance."
 +        echo "start                     Démarre l'instance."
         echo "status                    Affiche l'état de l'instance."         echo "status                    Affiche l'état de l'instance."
-        echo "help                      Affiche cette aide."+        echo "stop                      Arrête l'instance." 
 +        echo "upgrade                   Met à jour l'instance."
 } }
  
Ligne 149: Ligne 151:
  
 case $1 in case $1 in
-        "start"|"restart"|"stop"|"status")+        "start"|"restart"|"stop"|"status"|"upgrade"|"backup")
                 ACTION="$1"                 ACTION="$1"
                 ;;                 ;;
Ligne 287: Ligne 289:
                                 ;;                                 ;;
                 esac                 esac
 +                ;;
 +        "backup")
 +                # Vérification de l'état et action
 +                case $STATUS in
 +                        0)
 +                                # Démarré
 +                                echo "Sauvegarde en cours..."
 +                                Version=$(curl -k -s https://localhost/ejbca/ejbca-rest-api/v1/certificate/status | jq .revision | awk '{print $2}')
 +                                UserName=$(grep 'MYSQL_USER' $WRKDIR/docker-compose.yml | cut -d'=' -f2)
 +                                PassWord=$(grep 'MYSQL_PASSWORD' $WRKDIR/docker-compose.yml | cut -d'=' -f2)
 +                                cd $WRKDIR && docker compose exec $EJBDB mysqldump ejbca -u${UserName} -p${PassWord} > ejbca-${Version}-backup-$(date +%Y%m%d_%H%M_%Z).sql
 +                                if [[ $? -eq 0 ]]; then
 +                                        # Sauvegarde réussie
 +                                        echo "Sauvegarde réussie"
 +                                        CODE=0
 +                                else
 +                                        # Sauvegarde raté
 +                                        echo "Sauvegarde en échec"
 +                                        CODE=2
 +                                fi
 +                                ;;
 +                        *)
 +                                # Autres
 +                                echo "L'instance n'est pas correctement démarrée. Sauvegarde impossible."
 +                                CODE=2
 +                                ;;
 +                esac
 +                ;;
 +        "upgrade")
 +                # On arrête l'instance
 +                echo "Arrêt de l'instance"
 +                cd $WRKDIR && docker compose down
 +
 +                # Mise à jour
 +                echo "Téléchargement de la dernière version"
 +                cd $WRKDIR && docker image pull keyfactor/ejbca-ce:latest
 +
 +                # Redémarrage de l'instance
 +                echo "Redémarrage et mise à jour"
 +                cd $WRKDIR && docker compose up -d
                 ;;                 ;;
         *)         *)
Ligne 401: Ligne 443:
 ==== Utilisateur ==== ==== Utilisateur ====
  
-<callout type="info" title="Automatisation" icon="true">A ce niveau, le service API est disponible sur notre infrastructure. Les administrateurs peuvent l'utiliser avec leur certificat. Cependant, dans le cadre d'une automatisation, il est dangereux d'utiliser un compte avec trop de droits et notamment celui d'un admin. Il faut donc créer un utilisateur avec des droits se limitant au strict nécessaire. On va donc créer un profil pour créer, interroger et revoquer des certificats TLS uniquement.</callout>+<callout type="info" title="Automatisation" icon="true">A ce niveau, le service API est disponible sur notre infrastructure. Les administrateurs peuvent l'utiliser avec leur certificat. Cependant, dans le cadre d'une automatisation, il est dangereux d'utiliser un compte avec trop de droits et notamment celui d'un admin. Il faut donc créer un utilisateur avec des droits se limitant au strict nécessaire. On va donc créer un profil pour créer, interroger et révoquer des certificats TLS uniquement.</callout>
  
   * On va commencer par créer un certificat utilisateur, qu'on appellera ''script'', comme on l'a fait pour l'administrateur.   * On va commencer par créer un certificat utilisateur, qu'on appellera ''script'', comme on l'a fait pour l'administrateur.
Ligne 413: Ligne 455:
 <image shape="thumbnail">{{ :linux:ejbca:ejbca-064.png |}}</image> <image shape="thumbnail">{{ :linux:ejbca:ejbca-064.png |}}</image>
   * On modifie les puces suivantes :   * On modifie les puces suivantes :
-^Catégorie   ^Droits   ^Autorisation   ^+ 
 +^Catégorie   ^Droits     Autorisation   ^
 |Role Based Access Rules   |/administrator/     Allow   | |Role Based Access Rules   |/administrator/     Allow   |
 |Regular Access Rules   |/ca_functionality/create_certificate/     Allow   | |Regular Access Rules   |/ca_functionality/create_certificate/     Allow   |
Ligne 425: Ligne 468:
 |:::|/endentityprofilesrules/<votre profil de certificat TLS>/view_end_entity/     Deny   | |:::|/endentityprofilesrules/<votre profil de certificat TLS>/view_end_entity/     Deny   |
 |:::|/endentityprofilesrules/<votre profil de certificat TLS>/view_end_entity_history/     Deny   | |:::|/endentityprofilesrules/<votre profil de certificat TLS>/view_end_entity_history/     Deny   |
-  * On n'oublie pas de sauvegarder les droits en cliquant sur ''Save'' en bas de page''+ 
 +  * On n'oublie pas de sauvegarder les droits en cliquant sur ''Save'' en bas de page.
   * On retourne sur notre liste de rôle et on clique sur ''Members'' :   * On retourne sur notre liste de rôle et on clique sur ''Members'' :
 <image shape="thumbnail">{{ :linux:ejbca:ejbca-065.png |}}</image> <image shape="thumbnail">{{ :linux:ejbca:ejbca-065.png |}}</image>
Ligne 437: Ligne 481:
  
 <callout type="info" title="Bot" icon="true">Voilà, on dispose désormais d'un utilisateur authentifié avec un certificat et un mot de passe et disposant de droits limités.</callout> <callout type="info" title="Bot" icon="true">Voilà, on dispose désormais d'un utilisateur authentifié avec un certificat et un mot de passe et disposant de droits limités.</callout>
 +
 +===== Supervision =====
 +
 +Pour la supervision dans ''Nagios'', nous allons contrôler 4 éléments :
 +  * L'état du service ''docker''.
 +  * L'état des différents containers.
 +  * L'état de santé de la PKI.
 +  * La présence de mises à jour.
 +
 +Ci-dessous, je dépose les scripts que j'utilise pour les différents contrôles
 +
 +==== L'état du service docker ====
 +
 +On se base sur les plugins de ''nagios'' avec la commande :
 +<sxh bash>/usr/lib/nagios/plugins/check_procs -w 1:1 -c 0: -C dockerd</sxh>
 +
 +==== L'état des différents containers ====
 +
 +J'utilise le script de Tim Laurence (Source : [[https://github.com/timdaman/check_docker/blob/master/check_docker/check_docker.py|GitHub]]) pour contrôler l'état des containers. Une fois le script installé, il suffit de lancer la commande suivante :
 +<sxh bash>/usr/lib/nagios/plugins/check_docker.py --no-ok --status running --containers ejbca ejbca-database</sxh>
 +
 +==== L'état de santé de la PKI ====
 +
 +La PKI réalise une vérification automatique de son état de santé. Son rapport est affiché à l'URI ''/ejbca/publicweb/healthcheck/ejbcahealth''. Le script suivant interroge cette adresse et renvoie l'information au format ''NRPE'' :
 +<sxh bash>#!/bin/bash
 +
 +# Adresse du serveur
 +ServerAddress="localhost"
 +
 +# URI de l'état de santé
 +Uri="/ejbca/publicweb/healthcheck/ejbcahealth"
 +
 +# Requête
 +Request=$(curl -k -s https://${ServerAddress}${Uri})
 +
 +# Traitement du résultat de la requête
 +if [ "$Request" == "ALLOK" ]; then
 +        # Tout va bien
 +        Status="GOOD"
 +        ExitCode=0
 +else
 +        # PKI en erreur
 +        Status="CRIT"
 +        ExitCode=2
 +fi
 +
 +# Renvoi des informations
 +echo "$Status - Health status : $Request"
 +exit $ExitCode</sxh>
 +
 +==== La présence de mises à jour ====
 +
 +On vérifie la présence de mise à jour en comparant le hash de la version actuelle de notre PKI avec le hash de la dernière version.
 +<sxh bash>#!/bin/bash
 +
 +# Adresse du serveur
 +ServerAddress="localhost"
 +
 +# Uri du status
 +ServerUri="/ejbca/ejbca-rest-api/v1/certificate/status"
 +
 +# Nom du container
 +Container="keyfactor/ejbca-ce"
 +
 +# Récupération de la version actuelle
 +Actual=$(curl -k -s https://${ServerAddress}${ServerUri} | jq .revision | awk '{print $2}')
 +
 +# Récupération du hash de la version actuelle
 +ActualHash=$(docker manifest inspect ${Container}:${Actual} | jq .config.digest)
 +
 +# Récupération du hash de la dernière version
 +LatestHash=$(docker manifest inspect ${Container}:latest | jq .config.digest)
 +
 +# Test et retour
 +if [ "$ActualHash" == "$LatestHash" ]; then
 +        # Les hash sont les mêmes, on est à jour
 +        echo "GOOD - up-to-date"
 +        exit 0
 +else
 +        # Une mise à jour est disponible
 +        echo "WARN - update available"
 +        exit 1
 +fi</sxh>
  
 ===== Conclusion ===== ===== Conclusion =====
  • linux_ejbca.1711020951.txt.gz
  • Dernière modification : 2024/03/21 12:35
  • de nekan