Contexte
- Nous utilisons Ansible pour provisionner et gérer l'infrastructure Azure. Pour le moment, nous exécutons Ansible "manuellement", c'est-à-dire que nous exécutons manuellement des playbooks pour diverses tâches automatisées. Pas d'infrastructure CI.
- Probablement pas pertinent mais nous gérons notre inventaire à l'aide d'un script dynamique
azure_rm.py
. - Nous sommes encouragés à être aussi sûrs que possible
- Ne stockez pas les mots de passe Vault dans
~/.vault_pass
ou dans un fichier local - Ne stockez pas de secrets Azure dans
~/.azure/credentials
- Ne stockez rien de sécurisé
.bashrc
.
- Ne stockez pas les mots de passe Vault dans
Dans un tel scénario, j'ai du mal à trouver une stratégie cohérente pour garantir que mes playbooks peuvent accéder aux secrets Azure, tout en suivant les instructions ci-dessus.
Question
Comment éviter de stocker des informations d'identification Ansible Vault et Azure sur des fichiers, tout en garantissant que mes playbooks peuvent y accéder?
Ce que j'ai essayé
Jusqu'à présent, je suis venu avec un script wrapper qui
- demande à l'utilisateur le mot de passe du coffre-fort
- Utilise cela pour décrypter un script Vaulted Shell
- Évalue le script, qui charge les variables d'environnement Azure dans l'environnement;
- Exécute le playbook sur l'environnement ainsi défini.
Y a-t-il de meilleures solutions (plus élégantes, moins compliquées, plus "Ansible")?
Réponses:
Mot de passe du coffre-fort
Tout d'abord, vous devez vous familiariser avec le fait que le fichier de mot de passe du coffre-fort peut être un script exécutable. Dans ce cas, Ansible l'exécute et s'attend à recevoir le mot de passe comme sortie.
Par exemple, vous pouvez utiliser
gpg-agent
oukeychain
pour stocker votre mot de passe réel et le déverrouiller si nécessaire. En savoir plus dans cet article de blog: https://benincosa.com/?p=3235Si vous êtes un peu paranoïaque, vous pouvez ajouter une notification lorsque votre script de mot de passe est appelé, comme ceci:
Ce script de mot de passe de coffre-fort utilise
key.gpg
comme clé de coffre-fort réelle et affiche également une notification contextuelle (pour MacOS) avec le nom du processus parent lorsque le script est utilisé. L'agent Gpg met en cache le mot de passe pendant un certain temps, il n'est donc pas nécessaire de saisir le mot de passe à chaque fois que vous lancez le playbook.Installez simplement
vault_password_file = ./vault_pass.sh
votreansible.cfg
.Environnement
Vous avez dit que vous l'utilisiez
azure_rm.py
comme script d'inventaire dynamique. Cela signifie que vous devez définir des informations d'identification dans vos variables d'environnement avant de démarrer ansible-playbook pour qu'il puisse les utiliser.Vous pouvez créer deux fichiers:
secure_env
(chiffré avec le coffre-fort):set_env
(texte brut):Lorsque vous ouvrez un nouveau terminal pour exécuter vos tâches d'automatisation, vous devez exécuter:
À ce moment, bash évalue
set_env
etsecure_env
(déchiffré via ansible-vault). Après cette commande, vous avez défini les informations d'identification Azure pour le shell actuel, vous pouvez donc exécuter les playbooks comme d'habitude:Donc, en utilisant ces deux approches, vous pouvez stocker
key.gpg
etsecure_env
dans votre référentiel; puis dans le nouveau terminal, appelezsource set_env
une fois le mot de passe gpg (pour déverrouiller l'utilisation future de key.gpg); puis appelezansible-playbook
autant de fois que vous le souhaitez sans mot de passe.la source
source
approche, vous définissez l'environnement une fois par session de terminal et pouvez utiliser séparément toute la gamme d'outils: ansible-playbooks, scripts d'inventaire, azure cli, sans aucun emballage.Veuillez lire https://docs.ansible.com/ansible/2.4/vault.html Depuis Ansible 2.4, on pourrait utiliser
--vault-id @prompt
.Crypter un fichier en utilisant ansible-vault:
Exécutez le playbook et il en résultera:
Il existe plusieurs options pour décrypter les fichiers, notamment
@prompt
:demandera:
Une fois le mot de passe du coffre-fort entré, le playbook devrait réussir.
la source
--ask-vault-pass
option. Et je n'arrive pas à comprendre comment le remplacer par--vault-id
répondrait à la plus grande question d'un meilleur flux de travail.ansible-playbook --vault-id my-vault-password.py
. Je pensais que vous aviez peut-être une solution autour de l'utilisation d'un script python :) Je réfléchis également à celui-ci.