5.5. Changer le secret du coffre d'un service IdM en cas de compromission en utilisant Ansible
Cette section montre comment un administrateur de gestion des identités (IdM) peut réutiliser un playbook Ansible pour modifier le secret stocké dans un coffre-fort de service lorsqu'une instance de service a été compromise. Le scénario de l'exemple suivant suppose que sur webserver3.idm.example.com, le secret récupéré a été compromis, mais pas la clé du coffre-fort asymétrique stockant le secret. Dans cet exemple, l'administrateur réutilise les playbooks Ansible utilisés pour stocker un secret dans un coffre-fort as ymétrique et pour récupérer un secret du coffre-fort asymétrique sur les hôtes IdM. Au début de la procédure, l'administrateur IdM stocke un nouveau fichier PEM
avec un nouveau secret dans le coffre-fort asymétrique, adapte le fichier d'inventaire de manière à ne pas récupérer le nouveau secret sur le serveur web compromis, webserver3.idm.example.com, puis réexécute les deux procédures.
Conditions préalables
Vous avez configuré votre nœud de contrôle Ansible pour qu'il réponde aux exigences suivantes :
- Vous utilisez la version 2.8 ou ultérieure d'Ansible.
-
Vous avez installé le paquetage
ansible-freeipa
sur le contrôleur Ansible. - L'exemple suppose que dans le répertoire ~/MyPlaybooks/ vous avez créé un fichier d'inventaire Ansible avec le nom de domaine complet (FQDN) du serveur IdM.
-
L'exemple suppose que le coffre-fort secret.yml Ansible stocke votre
ipaadmin_password
.
- Vous connaissez le mot de passe de IdM administrator.
- Vous avez créé un coffre-fort asymétrique pour stocker le secret de service.
-
Vous avez généré une nouvelle clé
httpd
pour les services web fonctionnant sur les hôtes IdM afin de remplacer l'ancienne clé compromise. -
La nouvelle clé
httpd
est stockée localement sur le contrôleur Ansible, par exemple dans le fichier /usr/share/doc/ansible-freeipa/playbooks/vault/private-key-to-an-externally-signed-certificate.pem.
Procédure
Naviguez jusqu'au répertoire
/usr/share/doc/ansible-freeipa/playbooks/vault
:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
Ouvrez votre fichier d'inventaire et assurez-vous que les hôtes suivants sont définis correctement :
-
Le serveur IdM dans la section
[ipaserver]
. Les hôtes sur lesquels vous souhaitez récupérer le secret dans la section
[webservers]
. Par exemple, pour demander à Ansible de récupérer le secret sur webserver1.idm.example.com et webserver2.idm.example.com, entrez :[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com
ImportantAssurez-vous que la liste ne contient pas le serveur web compromis, dans l'exemple actuel webserver3.idm.example.com.
-
Le serveur IdM dans la section
- Ouvrez le fichier data-archive-in-asymmetric-vault-copy.yml pour le modifier.
Modifiez le fichier en définissant les variables suivantes dans la section
ipavault
task :-
Fixer la variable
ipaadmin_password
au mot de passe de l'administrateur de l'IdM. -
Attribuez à la variable
name
le nom de la chambre forte, par exemple secret_vault. -
Définissez la variable
service
comme étant le propriétaire du service de la chambre forte, par exemple HTTP/webserver.idm.example.com. -
Définissez la variable
in
à "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}", ce qui garantit qu'Ansible récupère le fichier contenant la clé privée dans le répertoire de travail du contrôleur Ansible plutôt que sur le serveur IdM. Fixer la variable
action
àmember
.Il s'agit du fichier playbook Ansible modifié pour l'exemple actuel :
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver.idm.example.com in: "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
-
Fixer la variable
- Enregistrer le fichier.
Exécutez le manuel de jeu :
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
- Ouvrez le fichier retrieve-data-asymmetric-vault-copy.yml pour le modifier.
Modifiez le fichier en définissant les variables suivantes dans la section
ipavault
task :-
Définissez la variable
ipaadmin_password
avec votre mot de passe d'administrateur IdM. -
Attribuez à la variable
name
le nom de la chambre forte, par exemple secret_vault. -
Définissez la variable
service
comme étant le propriétaire du service de la chambre forte, par exemple HTTP/webserver1.idm.example.com. -
Définissez la variable
private_key_file
à l'emplacement de la clé privée utilisée pour récupérer le secret du coffre-fort de service. -
Définissez la variable
out
à l'emplacement du serveur IdM où vous souhaitez récupérer le secret new-private-key-to-an-externally-signed-certificate.pem, par exemple le répertoire de travail actuel. Fixer la variable
action
àmember
.Il s'agit du fichier playbook Ansible modifié pour l'exemple actuel :
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: new-private-key-to-an-externally-signed-certificate.pem state: retrieved
-
Définissez la variable
Ajouter une section au playbook qui récupère le fichier de données du serveur IdM vers le contrôleur Ansible :
--- - name: Retrieve data from vault hosts: ipaserver become: yes gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: new-private-key-to-an-externally-signed-certificate.pem dest: ./ flat: yes mode: 0600
Ajoutez une section au playbook qui transfère le fichier new-private-key-to-an-externally-signed-certificate.pem récupéré depuis le contrôleur Ansible vers les serveurs web répertoriés dans la section
webservers
du fichier d'inventaire :--- - name: Send data file to webservers become: yes gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: new-private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
- Enregistrer le fichier.
Exécutez le manuel de jeu :
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml