Tutoriel sur Ansible Vault
Dans les tutoriels précédents, nous avons parlé d’Ansible, un excellent outil que nous pouvons utiliser pour l’automatisation et le provisionnement. Nous avons parlé des concepts de base d’Ansible, nous avons vu certains des modules Ansible les plus utilisés, comment gérer les variables et comment effectuer des boucles de base dans les playbooks ; Il est maintenant temps de voir comment protéger les informations sensibles qui peuvent parfois être nécessaires pour accomplir certaines tâches. Afin de protéger les informations sensibles lors de l’utilisation d’Ansible, nous les chiffrons avec Ansible Vault.
Dans cet article, nous abordons les bases d’Ansible Vault et nous voyons comment nous pouvons l’utiliser pour chiffrer des variables ou des playbooks entiers.
Dans ce tutoriel, vous allez apprendre :
- Qu’est-ce qu’Ansible Vault ?
- Comment chiffrer et déchiffrer des variables uniques
- Comment chiffrer et déchiffrer des playbooks entiers
Introduction
Ansible Vault est un outil que nous pouvons utiliser pour chiffrer et déchiffrer des valeurs de variables uniques ou des playbooks entiers afin de protéger des informations sensibles, qui seraient autrement visibles en texte brut. L’application de l’espace utilisateur avec laquelle nous travaillons pour effectuer ces opérations s’appelle ansible-vault et est incluse dans chaque installation standard d’Ansible.
Chiffrement des variables
Pourquoi pouvons-nous vouloir chiffrer la valeur de variables uniques alors que nous pouvons chiffrer des playbooks entiers ? Le chiffrement des variables présente un grand avantage : comme le fichier dans lequel elles sont utilisées reste au format texte brut, il est toujours facile de le lire et de le modifier. Pour chiffrer la valeur d’une variable, nous appelons l’utilitaire ansible-vault et utilisons la commande « encrypt_string ». Voici un exemple : supposons que dans un playbook, nous voulions utiliser une variable appelée « password », mais que nous voulions, pour des raisons évidentes, éviter de stocker sa valeur en texte brut. Pour le chiffrer à l’aide d’Ansible Vault, nous pouvons exécuter la commande suivante :
ansible-vault encrypt_string "secret_value_to_encrypt" --name passwordNous avons utilisé la commande « encrypt_string » d’ansible-vault : cette commande chiffre la chaîne fournie (le contenu sensible que nous voulons protéger - « secret_value_to_encrypt », dans cet exemple), et la protège à l’aide d’un mot de passe. Le nom de la variable est spécifié via l’option --name. Dès que nous lançons la commande, nous sommes invités à fournir et à confirmer le mot de passe de cryptage. Le même mot de passe sera demandé pour déchiffrer le contenu :
New Vault password:
Confirm New Vault password:Dès que nous fournissons le mot de passe, le contenu sera crypté. Le résultat de la commande sera imprimé à l’écran :
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
64313761333061643861656539643036396538363063343736316362333736313035386636396536
6564356435343135643161363033626535393832343733320a323633393637643462643866393536
38363435336539353532356530373033663862363234343035643632306665343165656634303563
6636613562396531360a333861356337346536323063653964373833633739346664363664396537
35346537353930316535613638626233343433323039386262363232376230353131
Si nous ne voulons pas fournir le mot de passe de chiffrement de manière interactive, nous pouvons l’écrire dans un fichier et référencer le fichier à la place. Supposons que nous écrivions notre mot de passe dans un fichier appelé « password.txt », par exemple, nous exécuterions :
ansible-vault encrypt_string --vault-password-file password.txt "secret_value_to_encrypt" --name passwordLe mot de passe doit être écrit sur une seule ligne. Comme vous pouvez le voir dans l’exemple ci-dessus, le fichier contenant le mot de passe est référencé via l’option --vault-password-file. Le reste de la commande reste le même.
Une autre option, potentiellement plus sécurisée, consiste à créer un script qui interagit avec notre application de gestion de mots de passe préférée. L’id à récupérer dans le gestionnaire de mots de passe peut être spécifié via l’option --vault-id, de sorte que le script doit accepter cette option. Si un mot de passe est requis pour accéder au gestionnaire de mots de passe, le script doit le demander dans le terminal, et une fois que le mot de passe nécessaire pour chiffrer/déchiffrer la variable ou le fichier avec ansible-vault est récupéré, il doit l’imprimer sur la sortie standard. Le nom du script doit se terminer par « -client » ou « -client.extension » (par exemple « -client.py »). Voyons un exemple.
Dans un précédent article, nous avons vu comment organiser notre mot de passe à l’aide du gestionnaire de mots de passe « pass ». Un tel gestionnaire est basé sur l’utilisation de clés GPG, et peut être utilisé directement à partir de la ligne de commande, via l’utilitaire pass. Voici un exemple de script Python qui interagit avec ce gestionnaire de mots de passe, et peut être utilisé avec ansible-vault :
#!/usr/bin/env python3
import argparse
import sys
from subprocess import run, CalledProcessError
def parse_args():
parser = argparse.ArgumentParser(description="Get password from pass password manager")
parser.add_argument('--vault-id', help='The password to retrieve', default='vault')
return parser.parse_args()
def main(args):
try:
completed_process = run(['pass', args.vault_id], capture_output=True, check=True)
except CalledProcessError:
sys.stderr.write('There was an error retrieving the password')
return 1
sys.stdout.write(completed_process.stdout.decode('utf8'))
return 0
if __name__ == '__main__':
sys.exit(main(parse_args()))
Le script ci-dessus, comme demandé, accepte l’option --vault-id, qui est utilisée pour communiquer le « nom » de l’id à récupérer à l’aide du gestionnaire de mots de passe. Dans ce cas, nous définissons la valeur par défaut de « vault » pour l’option : elle sera utilisée lorsque l’utilisateur ne fournit pas explicitement une identité. L’appel à « pass » se fait en utilisant le module Python subprocess (jetez un coup d’œil à notre tutoriel sur le sous-processus si vous ne le connaissez pas). Ici, nous avons utilisé la méthode run et défini les paramètres capture_output et check à True, de sorte que la sortie standard de la commande soit capturée (elle peut être accessible ultérieurement dans l’attribut « stdout » de l’objet CompletedProcess renvoyé par la méthode), et qu’une exception CalledProcessError soit levée si le statut de sortie de la commande n’est pas 0.
Dans ce cas, le script n’a pas besoin de demander à l’utilisateur le mot de passe par lui-même, car l’utilitaire pass le fera. D’ailleurs, pour être sûr que le mot de passe est demandé dans la ligne de commande, nous devons installer le paquet pinentry-tty, et écrire la ligne suivante dans le fichier ~/.gnupg/gpg-agent.conf :
pinentry-program /usr/bin/pinentry-ttyVoici comment nous pouvons récupérer le mot de passe de cryptage à l’aide du script :
ansible-vault encrypt_string --vault-id vault@vault-client.py 'secret_value_to_encrypt' --name passwordNotez que nous utilisons l’option --vault-id pour spécifier l’identité à utiliser, qui dans ce cas est celle à gauche du @ ; À droite du symbole, à la place, se trouve le chemin du script à appeler. Comme dit précédemment, si nous omettons de fournir une identité, celle par défaut que nous avons utilisée dans le script sera utilisée :
ansible-vault encrypt_string --vault-id vault-client.py 'secret_value_to_encrypt' --name passwordSi nous fournissons explicitement l’identité, à la place, elle sera signalée dans la sortie générée, par exemple :
password: !vault |
$ANSIBLE_VAULT;1.2;AES256;vault
39393237653832393365366436353734343736366263366232656265313763623739346565653837
3065656639616432646435393466633463336262353231330a633739633336633939333731643538
63386462323561346334376633366134623862366462333066333563656464373633303533323439
3038643639373966350a303065663830643635386630616263666636386537356233656330666239
66393939633833643066643931326435633631626138373363303430626539356564
Déchiffrement d’une variable
Pour effectuer l’opération inverse, donc pour vérifier la valeur d’origine d’une variable, nous pouvons utiliser le module de débogage Ansible. Imaginons que nous stockions la variable dans le fichier variable.yml. Pour lire son contenu original, en récupérant le mot de passe à l’aide du script que nous avons utilisé ci-dessus, nous exécuterions :
ansible localhost -m debug -a var="password" -e @variable.yml --vault-id vault@vault-client.pyDans l’exemple ci-dessus, nous avons spécifié « localhost » comme la machine sur laquelle la tâche doit être exécutée, et, comme argument de l’option -m, nous avons passé le nom du module que nous voulons utiliser. L’option -a, est utilisée pour passer des arguments au module, dans le format de paire « clé=valeur » (var="mot de passe »), et -e est utilisée pour passer des variables supplémentaires (c’est l’abréviation de -extra-vars) : des variables supplémentaires doivent également être fournies dans les paires clé/valeur ; Dans ce cas, cependant, puisque nous passons le chemin d’un fichier (celui dans lequel nous avons stocké la variable), nous le préfixons simplement d’un @ (jetez un coup d’œil au manuel Ansible pour plus d’instructions). Enfin, comme vous pouvez le voir, tout comme dans l’exemple précédent, nous avons utilisé le script vault-client.py pour récupérer le mot de passe de chiffrement/déchiffrement. La commande renvoie le résultat suivant :
localhost | SUCCESS => {
"password": "secret_value_to_encrypt"
}Chiffrement des fichiers
Ansible-Vault peut également être utilisé pour chiffrer des playbooks entiers ou d’autres types de fichiers. Supposons que nous voulions chiffrer un playbook appelé play.yml. Pour accomplir notre mission, nous utiliserions la commande « encrypt » :
ansible-vault encrypt play.ymlDans ce cas, le mot de passe sera demandé de manière interactive. Tout comme nous l’avons fait dans les exemples précédents, cependant, nous pouvons le stocker dans un fichier, ou utiliser un script pour le récupérer :
ansible-vault encrypt --vault-password-file=password.txt play.ymlAvec la commande ci-dessus, nous avons crypté un fichier existant, « play.yml ». Si nous voulons créer un fichier crypté à partir de zéro, nous pouvons simplement utiliser la commande « create ». Lorsque nous le faisons, l’éditeur de texte par défaut s’ouvre afin de nous permettre d’écrire le contenu du fichier. Dès que nous l’enregistrerons, le fichier sera crypté avec le mot de passe fourni. À titre d’exemple, pour créer un fichier chiffré appelé playbook.yml, nous exécuterions :
ansible-vault create playbook.yml --vault-password-file=password.txtNotez que le fichier est chiffré sur place. Si nous voulons le modifier, nous n’avons pas besoin de le décrypter manuellement ; Nous pouvons facilement utiliser la commande « edit », qui fait le travail pour nous, et l’ouvre dans notre éditeur de texte préféré :
ansible-vault edit playbook.yml --vault-password-file=password.txtPour simplement déchiffrer le fichier, nous utilisons la commande « decrypt », à la place :
ansible-vault decrypt playbook.yml --vault-password-file=password.txtFournir le mot de passe de chiffrement lors de l’exécution d’un playbook
Lorsque nous voulons exécuter un playbook chiffré, ou un playbook qui contient une ou plusieurs variables chiffrées, nous pouvons utiliser l’une des méthodes que nous avons vues ci-dessus, ou même laisser Ansible demander le mot de passe de manière interactive à l’aide de l’option --ask-vault-password. Supposons que nous voulions exécuter les tâches contenues dans le playbook de playbook.yml chiffré. Nous pourrions exécuter :
ansible-playbook --ask-vault-password playbook.ymlPour que le mot de passe soit lu à partir d’un fichier, procédez comme suit :
ansible-playbook --vault-password-file=password.txt playbook.ymlPour récupérer le mot de passe à l’aide d’un script, comme précédemment :
ansible-playbook --vault-id vault@vault-client.py playbook.ymlConclusions
Dans cet article, nous avons appris à utiliser Ansible-Vault pour protéger le contenu sensible dans les playbooks. Nous avons vu comment chiffrer et déchiffrer la valeur de variables uniques et de fichiers entiers. Si vous souhaitez en savoir plus sur Ansible-Vault, veuillez consulter la documentation officielle.
