Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| linux_ejbca [2024/03/19 15:22] – nekan | linux_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=" | + | <label type=" |
| + | <label type=" | ||
| Une infrastructure à clés publiques ou PKI (// | Une infrastructure à clés publiques ou PKI (// | ||
| Ligne 97: | Ligne 98: | ||
| </ | </ | ||
| - | ===== Configuration ===== | + | ==== Gestion du service |
| - | ==== Création du compte administrateur ==== | + | Pour gérer plus facilement l' |
| + | |||
| + | <sxh bash> | ||
| + | chmod +x / | ||
| + | nano / | ||
| + | |||
| + | <sxh bash># | ||
| + | |||
| + | ########################################## | ||
| + | # # | ||
| + | # | ||
| + | # # | ||
| + | ########################################## | ||
| + | |||
| + | # | ||
| + | # Variables # | ||
| + | # | ||
| + | |||
| + | # Dossier de travail | ||
| + | WRKDIR=/ | ||
| + | |||
| + | # Nom de l' | ||
| + | EJBCA=ejbca | ||
| + | |||
| + | # Nom de l' | ||
| + | EJBDB=ejbca-database | ||
| + | |||
| + | # | ||
| + | # Fonctions # | ||
| + | # | ||
| + | |||
| + | # Demande d' | ||
| + | get-help() { | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo "Usage : ./ | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # Gestion des arguments # | ||
| + | # | ||
| + | |||
| + | case $1 in | ||
| + | " | ||
| + | ACTION=" | ||
| + | ;; | ||
| + | " | ||
| + | get-help | ||
| + | exit 0 | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | echo "" | ||
| + | get-help | ||
| + | exit 2 | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # | ||
| + | # Traitement # | ||
| + | # | ||
| + | |||
| + | EJBCA_STATUS=$(docker container inspect -f ' | ||
| + | EJBDB_STATUS=$(docker container inspect -f ' | ||
| + | |||
| + | if [ " | ||
| + | STATUS=0 | ||
| + | elif [ " | ||
| + | STATUS=1 | ||
| + | elif [ " | ||
| + | STATUS=2 | ||
| + | else | ||
| + | STATUS=3 | ||
| + | fi | ||
| + | |||
| + | case $ACTION in | ||
| + | " | ||
| + | # Vérification de l' | ||
| + | case $STATUS in | ||
| + | 0) | ||
| + | # Démarré | ||
| + | echo " | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | 1|2) | ||
| + | # Partiel | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose restart | ||
| + | CODE=0 | ||
| + | ;; | ||
| + | 3) | ||
| + | # Arrêté | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose up -d | ||
| + | CODE=0 | ||
| + | ;; | ||
| + | *) | ||
| + | # Autre | ||
| + | echo " | ||
| + | CODE=3 | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | " | ||
| + | # Vérification de l' | ||
| + | case $STATUS in | ||
| + | 0|1|2) | ||
| + | # Démarré | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose down | ||
| + | CODE=0 | ||
| + | ;; | ||
| + | 3) | ||
| + | # Arrêté | ||
| + | echo " | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | *) | ||
| + | # Autre | ||
| + | echo " | ||
| + | CODE=3 | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | " | ||
| + | # Vérification de l' | ||
| + | case $STATUS in | ||
| + | 0) | ||
| + | # Démarré | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose restart | ||
| + | CODE=0 | ||
| + | ;; | ||
| + | 1|2) | ||
| + | # Partiel | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose down && docker compose up -d | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | 3) | ||
| + | # Arrêt | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose up -d | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | *) | ||
| + | # Autre | ||
| + | echo " | ||
| + | CODE=3 | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | " | ||
| + | # Vérification de l' | ||
| + | case $STATUS in | ||
| + | 0) | ||
| + | # Démarré | ||
| + | echo " | ||
| + | CODE=0 | ||
| + | ;; | ||
| + | 1) | ||
| + | # Base de données à l' | ||
| + | echo " | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | 2) | ||
| + | # Authorité à l' | ||
| + | echo "Base de données active mais l' | ||
| + | CODE=1 | ||
| + | ;; | ||
| + | 3) | ||
| + | # Arrêt | ||
| + | echo " | ||
| + | CODE=2 | ||
| + | ;; | ||
| + | *) | ||
| + | # Autre | ||
| + | echo " | ||
| + | CODE=3 | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | " | ||
| + | # Vérification de l' | ||
| + | case $STATUS in | ||
| + | 0) | ||
| + | # Démarré | ||
| + | echo " | ||
| + | Version=$(curl -k -s https:// | ||
| + | UserName=$(grep ' | ||
| + | PassWord=$(grep ' | ||
| + | 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 " | ||
| + | CODE=0 | ||
| + | else | ||
| + | # Sauvegarde raté | ||
| + | echo " | ||
| + | CODE=2 | ||
| + | fi | ||
| + | ;; | ||
| + | *) | ||
| + | # Autres | ||
| + | echo " | ||
| + | CODE=2 | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | " | ||
| + | # On arrête l' | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose down | ||
| + | |||
| + | # Mise à jour | ||
| + | echo " | ||
| + | cd $WRKDIR && docker image pull keyfactor/ | ||
| + | |||
| + | # Redémarrage de l' | ||
| + | echo " | ||
| + | cd $WRKDIR && docker compose up -d | ||
| + | ;; | ||
| + | *) | ||
| + | # Autre | ||
| + | echo " | ||
| + | CODE=3 | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # | ||
| + | # Sortie # | ||
| + | # | ||
| + | |||
| + | exit $CODE | ||
| + | </ | ||
| + | |||
| + | Pour que l' | ||
| + | <sxh bash> | ||
| + | |||
| + | Et on ajoute la ligne suivante : | ||
| + | < | ||
| + | |||
| + | ===== Création du compte administrateur | ||
| <callout type=" | <callout type=" | ||
| Ligne 105: | Ligne 356: | ||
| * Admin : Compte d' | * Admin : Compte d' | ||
| - | De mon côté, je pars toujours du fait qu'un administrateur a toujours tous les droits. Lorsque les droits sont limités, on est alors sur un profils d' | + | De mon côté, je pars toujours du fait qu'un administrateur a toujours tous les droits. Lorsque les droits sont limités, on est alors sur un profils d' |
| Du coup, dans la suite de cette procédure, j' | Du coup, dans la suite de cette procédure, j' | ||
| Ligne 112: | Ligne 363: | ||
| </ | </ | ||
| + | ==== Création du certificat ==== | ||
| + | |||
| + | * Lors de la 1< | ||
| + | <image shape=" | ||
| + | * Pour créer un compte admin, on ira dans '' | ||
| + | <image shape=" | ||
| + | * Dans la nouvelle fenêtre, on ira dans la section '' | ||
| + | <image shape=" | ||
| + | * Dans la section '' | ||
| + | * **Certificate subtype** : '' | ||
| + | * **Key-pair generation** : '' | ||
| + | <image shape=" | ||
| + | * Dans la section '' | ||
| + | * **Key algorithm** : '' | ||
| + | <image shape=" | ||
| + | * Dans la section '' | ||
| + | * **CN, Common Name** : on entre le nom du compte administrateur. | ||
| + | * **Key Recoverable** : on décoche le case. | ||
| + | <image shape=" | ||
| + | * Dans la section '' | ||
| + | * **Username** : Le nom de du compte administrateur. | ||
| + | * **Enrollment code** : Le mot de passe permettant d' | ||
| + | * **Confirm enrollment code** : On confirme le mot de passe précédent. | ||
| + | * **Email** : L' | ||
| + | <image shape=" | ||
| + | * Finalement, dans la section '' | ||
| + | <image shape=" | ||
| + | |||
| + | ==== Import du certificat dans le navigateur ==== | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | * Maintenant, il faut importer le certificat dans le navigateur. Pour '' | ||
| + | <image shape=" | ||
| + | * Dans le gestionnaire de certificats, | ||
| + | <image shape=" | ||
| + | * On choisit le certificat créé, on entre le mot de passe de l' | ||
| + | <image shape=" | ||
| + | * On peut vérifier la présence du nouveau certificat dans la liste et on sort du gestionnaire. | ||
| + | |||
| + | ==== Création du compte sur EJBCA ==== | ||
| + | |||
| + | * On retourne sur l' | ||
| + | <image shape=" | ||
| + | * On supprime '' | ||
| + | <image shape=" | ||
| + | * On paramètre : | ||
| + | * **Match with** : On sélectionne '' | ||
| + | * **CA** : On choisit '' | ||
| + | * **Match Value** : On entre le nom du compte administrateur tel qu'il a été entré dans le champs '' | ||
| + | * **Description** : Optionnel, cela permet d' | ||
| + | * Une fois les paramètres réglés, on valide en cliquant sur '' | ||
| + | <image shape=" | ||
| + | * On redémarre l' | ||
| + | <sxh bash>/ | ||
| + | cd / | ||
| + | |||
| + | ==== Test et validation ==== | ||
| + | |||
| + | * On ferme le navigateur pour vider le cache et on se reconnecte sur l' | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | * On retourne sur l' | ||
| + | * On supprime '' | ||
| + | <image shape=" | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | ===== Configuration pour les accès API ===== | ||
| + | |||
| + | Si on souhaite interagir avec les autorités de certifications via API (pour de l' | ||
| + | |||
| + | ==== Service ==== | ||
| + | |||
| + | * On va dans '' | ||
| + | <image shape=" | ||
| + | |||
| + | ==== Utilisateur ==== | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | * On va commencer par créer un certificat utilisateur, | ||
| + | * Une fois en possession du certificat, on va dans '' | ||
| + | <image shape=" | ||
| + | * On nomme notre rôle et on clique sur '' | ||
| + | <image shape=" | ||
| + | * On édite les droits pour ce nouveau rôle en cliquant sur '' | ||
| + | <image shape=" | ||
| + | * On va directement dans '' | ||
| + | <image shape=" | ||
| + | * On modifie les puces suivantes : | ||
| + | |||
| + | ^Catégorie | ||
| + | |Role Based Access Rules | ||
| + | |Regular Access Rules | ||
| + | |::: | ||
| + | |::: | ||
| + | |::: | ||
| + | |CA Access Rules | ||
| + | |End Entity Profile Access Rules | ||
| + | |::: | ||
| + | |::: | ||
| + | |::: | ||
| + | |::: | ||
| + | |||
| + | * On n' | ||
| + | * On retourne sur notre liste de rôle et on clique sur '' | ||
| + | <image shape=" | ||
| + | * Comme précédemment pour le compte administrateur, | ||
| + | * **Match with** : On sélectionne '' | ||
| + | * **CA** : On choisit '' | ||
| + | * **Match Value** : On entre le nom du compte utilisateur, | ||
| + | * **Description** : Optionnel, cela permet d' | ||
| + | * On ajoute le compte en cliquant sur '' | ||
| + | <image shape=" | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | ===== Supervision ===== | ||
| + | |||
| + | Pour la supervision dans '' | ||
| + | * L' | ||
| + | * L' | ||
| + | * L' | ||
| + | * La présence de mises à jour. | ||
| + | |||
| + | Ci-dessous, je dépose les scripts que j' | ||
| + | |||
| + | ==== L' | ||
| + | |||
| + | On se base sur les plugins de '' | ||
| + | <sxh bash>/ | ||
| + | |||
| + | ==== L' | ||
| + | |||
| + | J' | ||
| + | <sxh bash>/ | ||
| + | |||
| + | ==== L' | ||
| + | |||
| + | La PKI réalise une vérification automatique de son état de santé. Son rapport est affiché à l'URI ''/ | ||
| + | <sxh bash># | ||
| + | |||
| + | # Adresse du serveur | ||
| + | ServerAddress=" | ||
| + | |||
| + | # URI de l' | ||
| + | Uri="/ | ||
| + | |||
| + | # Requête | ||
| + | Request=$(curl -k -s https:// | ||
| + | |||
| + | # Traitement du résultat de la requête | ||
| + | if [ " | ||
| + | # Tout va bien | ||
| + | Status=" | ||
| + | ExitCode=0 | ||
| + | else | ||
| + | # PKI en erreur | ||
| + | Status=" | ||
| + | ExitCode=2 | ||
| + | fi | ||
| + | |||
| + | # Renvoi des informations | ||
| + | echo " | ||
| + | exit $ExitCode</ | ||
| + | |||
| + | ==== 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># | ||
| + | |||
| + | # Adresse du serveur | ||
| + | ServerAddress=" | ||
| + | |||
| + | # Uri du status | ||
| + | ServerUri="/ | ||
| + | |||
| + | # Nom du container | ||
| + | Container=" | ||
| + | |||
| + | # Récupération de la version actuelle | ||
| + | Actual=$(curl -k -s https:// | ||
| + | |||
| + | # Récupération du hash de la version actuelle | ||
| + | ActualHash=$(docker manifest inspect ${Container}: | ||
| + | |||
| + | # Récupération du hash de la dernière version | ||
| + | LatestHash=$(docker manifest inspect ${Container}: | ||
| + | |||
| + | # Test et retour | ||
| + | if [ " | ||
| + | # 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</ | ||
| + | |||
| + | ===== Conclusion ===== | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | On peut désormais créer des autorités de certifications : [[ejbca_createca|EJBCA - Création de certificats racine et intermédiaire]] | ||
| ~~DISCUSSION~~ | ~~DISCUSSION~~ | ||