Comment utiliser Ansible Vault pour stocker des clés secrètes
Avec la plupart des automatisations, les informations d'identification sont nécessaires pour authentifier et utiliser des ressources sécurisées. Ce qui a toujours été un défi, c'est de savoir comment stocker ces informations d'identification en toute sécurité. Ansible est un système d'automatisation qui fournit l'approvisionnement logiciel, la gestion de la configuration et les déploiements d'applications.
Comme pour tout système d'automatisation, Ansible a besoin d'un moyen sécurisé de stocker des secrets. Dans le cas d'Ansible, ce système est appelé Ansible Vault. Ansible Vault fournit une solution multiplateforme pour stocker en toute sécurité les informations d'identification.
Sommaire
Présentation d'Ansible Vault
Ansible Vault peut être utilisé pour crypter n'importe quel fichier, ou variables elles-mêmes, à partir d'un playbook. Par défaut, AES est utilisé, qui est un cryptage basé sur un secret partagé. Les méthodes de chiffrement de fichiers et de variables ont leurs avantages et leurs inconvénients.
Cryptage de fichiers
Pour créer un nouveau fichier chiffré nommé secrets.yml
, utilisez simplement ce qui suit ansible-vault
commander.
ansible-vault create secrets.yml
Après avoir demandé un mot de passe, le ansible-vault
La commande lancera l'éditeur de fichiers système par défaut, ce qui entraînera un fichier chiffré lors de l'enregistrement.
De même, pour crypter un fichier précédemment non crypté, utilisez ce qui suit ansible-vault
commander. Notez que cela utilise le encrypt
paramètre plutôt que create
paramètre.
ansible-vault encrypt secrets.yml
L'inconvénient de l'utilisation du chiffrement de fichiers est la lisibilité. Si vous ouvrez le fichier, vous constaterez que sans déchiffrement, il est impossible de déchiffrer le contenu.
Cryptage variable
Dans un playbook, il est possible d'utiliser une variable chiffrée en faisant précéder les données chiffrées du !vault
étiquette. Exécution du encrypt_string
argument de la ansible_vault
entraînera une chaîne chiffrée que vous pourrez utiliser dans vos playbooks.
ansible-vault encrypt_string 'secret_data' --name 'my_secret'
Après vous avoir demandé un mot de passe, vous obtiendrez la chaîne cryptée suivante.
my_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
37636561366636643464376336303466613062633537323632306566653533383833366462366662
6565353063303065303831323539656138653863353230620a653638643639333133306331336365
62373737623337616130386137373461306535383538373162316263386165376131623631323434
3866363862363335620a376466656164383032633338306162326639643635663936623939666238
3161
Le chiffrement variable est idéal pour la lisibilité, mais la possibilité d'utiliser la recomposition de ligne de commande est sacrifiée lors de l'utilisation de cette méthode.
Utilisation d'Ansible Vault en pratique
Vous vous rendez peut-être compte que l'utilisation d'Ansible Vault en production est un défi. Pour utiliser efficacement Ansible Vault, les techniques suivantes facilitent ce processus.
- Décryptage non sollicité
- Voûtes multiples
- Rekeying
Décryptage non sollicité
Une option pour décrypter de manière transparente un fichier ou une variable lors de l'utilisation d'Ansible consiste à stocker le mot de passe dans un fichier de mot de passe protégé et sans version. Pour référencer ce mot de passe stocké, passez simplement l'emplacement du fichier à l'aide du vault-password-file
paramètre.
ansible-playbook --vault-password-file /path/vault-password-file secrets.yml
Cela déchiffrera tous les fichiers ou variables chiffrés inclus à l'aide du mot de passe inclus.
Il est très important de ne pas valider votre fichier de mots de passe en texte brut dans votre système de contrôle de version. De même, protégez ce fichier uniquement pour l'utilisateur ou le groupe qui a besoin d'accéder au mot de passe stocké sur le système de fichiers à l'aide de listes de contrôle d'accès (ACL).
Voûtes multiples
Bien qu'il soit pratique d'avoir un coffre-fort unique avec tous les secrets chiffrés, une meilleure pratique de sécurité consiste à séparer les informations d'identification sécurisées dans des coffres-forts pertinents distincts. Un exemple de ceci serait la séparation d'un environnement de production et de développement. Heureusement, Ansible Vault nous permet de créer plusieurs coffres-forts et références qui mettent en sécurité les données chiffrées en utilisant une étiquette.
ansible-vault create --vault-id prod@prompt prod-secrets.yml
Le code ci-dessus créera un prod
vault et demander votre mot de passe lors de l'exécution (comme indiqué par le @prompt
chaîne). Si vous avez déjà un fichier de mots de passe que vous souhaitez utiliser, il vous suffit de passer le chemin d'accès au fichier.
ansible-vault create --vault-id prod@/path/prod-vault-password-file prod-secrets.yml
Disons que nous voulons chiffrer le même my_secret
variable, mais cette fois stocker que dans notre prod
voûte. Comme auparavant, en utilisant encrypt_string
mais avec le vault-id
permet de stocker le secret à l'emplacement spécifié.
ansible-vault encrypt_string --vault-id prod@/path/prod-vault-password-file 'secret_data' --name 'my_secret'
Vous remarquerez qu'après AES256
chaîne, un nouveau morceau de texte, prod
est montré. Cela indique le coffre-fort dans lequel se trouve le texte chiffré.
my_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256;prod
37636561366636643464376336303466613062633537323632306566653533383833366462366662
6565353063303065303831323539656138653863353230620a653638643639333133306331336365
62373737623337616130386137373461306535383538373162316263386165376131623631323434
3866363862363335620a376466656164383032633338306162326639643635663936623939666238
3161
Que faire si vous souhaitez inclure plusieurs coffres dans un seul playbook? Vous pouvez facilement passer plusieurs vault-id
déclarations sur une ansible-playbook
ligne de commande.
ansible-playbook --vault-id dev@/path/dev-vault-password-file --vault-id prod@/path/prod-vault-password-file site.yml
Rekeying
Enfin, il est important de parcourir régulièrement vos mots de passe. Pour les fichiers chiffrés, vous pouvez utiliser la ligne de commande ci-dessous. Passer dans le new-vault-id
Le paramètre facilite le changement du mot de passe avec lequel les secrets sont chiffrés.
ansible-vault rekey --vault-id prod@/path/prod-vault-password-file-old --new-vault-id prod@/path/prod-vault-password-file-new site.yml
Comme indiqué ci-dessus, la recomposition de la ligne de commande ne fonctionne pas pour les variables chiffrées. Dans ce cas, vous devrez rechiffrer individuellement les chaînes et les remplacer dans un playbook donné.
Les meilleures pratiques
La sécurité est difficile, surtout quand il s'agit d'utiliser des secrets dans les systèmes d'automatisation. Dans cet esprit, voici quelques bonnes pratiques à utiliser lors de l'utilisation d'Ansible Vault. Bien que nous en ayons déjà couvert certains, il est prudent de réitérer ces pratiques.
- Fichiers de mots de passe protégés et non versionnés par ACLLes fichiers de mots de passe ne doivent pas être stockés dans des systèmes de contrôle de version, tels que GIT. En outre, assurez-vous que seuls les utilisateurs appropriés peuvent accéder au fichier de mots de passe.
- Voûtes séparéesNormalement, de nombreux environnements différents sont utilisés. Par conséquent, il est préférable de séparer les informations d'identification requises dans les coffres-forts appropriés.
- Révision régulière des fichiers et des mots de passe variablesEn cas de réutilisation ou de fuite de mot de passe, il est préférable de ressaisir régulièrement les mots de passe utilisés pour limiter l'exposition.
Conclusion
Comme pour tout système d'automatisation, il est extrêmement important que les secrets soient correctement protégés et contrôlés. Avec Ansible Vault, ce processus est rendu facile et flexible. En utilisant les meilleures pratiques décrites ci-dessus, le stockage et l'utilisation de secrets dans Ansible sont sûrs et sécurisés.
Pour étendre encore plus Ansible Vault et faire passer ce processus au niveau supérieur, vous pouvez utiliser des scripts qui s'intègrent dans les solutions de gestion des mots de passe. Comme vous pouvez le voir, Ansible Vault est un excellent moyen d'utiliser les secrets dans les playbooks Ansible.