Comment exécuter des playbooks Ansible Azure tout en évitant de stocker les informations d'identification dans des fichiers?


13

Contexte

  1. 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.
  2. Probablement pas pertinent mais nous gérons notre inventaire à l'aide d'un script dynamique azure_rm.py.
  3. Nous sommes encouragés à être aussi sûrs que possible
    1. Ne stockez pas les mots de passe Vault dans ~/.vault_passou dans un fichier local
    2. Ne stockez pas de secrets Azure dans ~/.azure/credentials
    3. Ne stockez rien de sécurisé .bashrc.

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

  1. demande à l'utilisateur le mot de passe du coffre-fort
  2. Utilise cela pour décrypter un script Vaulted Shell
  3. Évalue le script, qui charge les variables d'environnement Azure dans l'environnement;
  4. 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")?


Qu'est-ce qui vous dérange le plus dans ce flux de travail?
Konstantin Suvorov

1
@KonstantinSuvorov, c'est principalement le nombre de cerceaux que je dois sauter pour atteindre ce qui me semble (du moins) une exigence assez courante dans les entreprises exigeantes en matière de conformité.
Vish

Réponses:


8

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-agentou keychainpour 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=3235

Si vous êtes un peu paranoïaque, vous pouvez ajouter une notification lorsque votre script de mot de passe est appelé, comme ceci:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Ce script de mot de passe de coffre-fort utilise key.gpgcomme 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.shvotre ansible.cfg.

Environnement

Vous avez dit que vous l'utilisiez azure_rm.pycomme 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):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (texte brut):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Lorsque vous ouvrez un nouveau terminal pour exécuter vos tâches d'automatisation, vous devez exécuter:

source set_env

À ce moment, bash évalue set_envet secure_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:

ansible-playbook provision-my-azure-instances.yml

Donc, en utilisant ces deux approches, vous pouvez stocker key.gpget secure_envdans votre référentiel; puis dans le nouveau terminal, appelez source set_envune fois le mot de passe gpg (pour déverrouiller l'utilisation future de key.gpg); puis appelez ansible-playbookautant de fois que vous le souhaitez sans mot de passe.


Merci pour la réponse. Laissez-moi essayer cela au cours de la semaine.
Vish

Donc, le principal avantage par rapport à mon approche d'origine est qu'il utilise GPG - ce qui apporte des avantages de mise en cache --- non? L'approche environnementale est similaire à ce que j'ai proposé.
Vish

1
D'après votre OP, je comprends que vous utilisez le wrapper à chaque fois que vous exécutez Playbook. Avec l' sourceapproche, 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.
Konstantin Suvorov

Ah, compris. Je vais lancer ça à mon équipe. Accepter votre réponse comme une solution plus pratique. Merci pour la recherche et l'explication! Aussi, j'ai aimé votre blog :)
Vish

Le principal avantage de l'utilisation de GPG (ou d'un trousseau sur macOS ou Linux) est que chaque membre de l'équipe a sa propre authentification pour déverrouiller une clé privée qui lui est propre. Cette clé est ensuite utilisée pour déverrouiller le mot de passe Ansible Vault, qui est un secret partagé. Vous devez faire pivoter tous vos secrets si quelqu'un quitte l'équipe de toute façon, y compris le mot de passe Ansible Vault, mais au moins les mots de passe GPG / trousseau n'ont pas à changer.
RichVel

2

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:

ansible-vault encrypt /path/to/encrypted/file

Exécutez le playbook et il en résultera:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Il existe plusieurs options pour décrypter les fichiers, notamment @prompt:

ansible-playbook some-playbook --vault-id @prompt

demandera:

Vault password (default):

Une fois le mot de passe du coffre-fort entré, le playbook devrait réussir.


1
En lisant la page, il semble y avoir une solution, mais impossible de comprendre en utilisant uniquement le lien. Pourriez-vous s'il vous plaît développer?
Vish

Merci d'avoir élaboré. J'exige en effet de demander à l'utilisateur un mot de passe de coffre-fort - en utilisant l'ancienne --ask-vault-passoption. Et je n'arrive pas à comprendre comment le remplacer par --vault-idrépondrait à la plus grande question d'un meilleur flux de travail.
Vish

Quand vous me parlez du lien que je ne vois une option intéressante: 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.
Vish
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.