web-dev-qa-db-fra.com

Comment télécharger un fichier crypté à l'aide du coffre-fort ansible?

Quelqu'un at-il un exemple de décryptage et de téléchargement d'un fichier en utilisant ansible-vault .

Je pense à garder mes certificats SSL cryptés dans le contrôle de code source.

Il semble que quelque chose comme ce qui suit devrait fonctionner.

---
  - name: upload ssl crt
    copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
36
Aaron Renoir

Ça ne va pas marcher. Vous obtiendrez votre encrypted.crt (avec Ansible Vault) téléchargé littéralement en tant que domain.crt

Ce que vous devez faire, c'est intégrer votre playbook à un "coffre-fort" et ajouter une variable qui contient le contenu de votre certificat. Quelque chose comme ça:

---
- name: My cool playbook
  hosts: all

  vars:
    mycert: |
       aasfasdfasfas
       sdafasdfasdfasdfsa
       asfasfasfddasfasdfa


  tasks:
    # Apparently this causes new lines on newer ansible versions
    # - name: Put uncrypted cert in a file
    #   Shell: echo '{{ mycert }}' > mydecrypted.pem

    # You can try this as per
    # https://github.com/ansible/ansible/issues/9172
    - copy:
      content: "{{ mycert }}"
      dest: /mydecrypted.pem

    - name: Upload Cert
      copy: src=/home/ubuntu/mydecrypted.pem dest=/home/ubuntu/mydecrypteddest.pem

    - name: Delete decrypted cert
      file: path=/home/ubuntu/mydecrypted.pem state=absent

Vous pouvez également choisir de placer votre variable mycert dans un fichier de variables distinct à l'aide d'Ansible Vault.

Le module de copie a été mis à jour dans Ansible 2.1. Depuis le journal des modifications: "le module de copie peut désormais utiliser de manière transparente un fichier stocké comme source, si les mots de passe du coffre-fort ont été fournis, il sera décrypté et copié à la volée." En le notant ici, car certaines personnes ne regarderont pas forcément au-delà de la réponse acceptée. - JK Laiho

34
Rico

Le module de copie le fait maintenant de manière transparente à partir d'Ansible 2.1.x. Cryptez simplement votre fichier avec Ansible Vault, puis lancez la tâche de copie sur le fichier.

(Pour référence, voici la fonctionnalité qui a ajouté ceci: https://github.com/ansible/ansible/pull/15417 )

40
jeffmaher

Il y a ne demande de fonctionnalité pour supporter cela nativement dans le module de copie. Mais jusqu'à ce que cela soit implémenté, voici la solution de contournement (similaire à la réponse de @ dave1010, mais en répétant les parties communes pour être complet):

Créez un fichier secrets.yml Chiffré avec un coffre-fort ansible qui contient vos secrets, par exemple:

---
private_ssl_key: |
  -----BEGIN PRIVATE KEY-----
  abcabcabcabcabcabcabcabcabc
  -----END PRIVATE KEY-----

private_crt: |
  -----BEGIN CERTIFICATE-----
  abcabcabcabcabcabcabcabcabc
  -----END CERTIFICATE-----

Dans votre livre de jeu, incluez-le:

vars_files:
  - secrets.yml

Ensuite, vous pouvez utiliser les variables dans les tâches:

- name: Copy private kay
  copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key

Cependant, cela ne fonctionne pas si le fichier que vous essayez de copier est un fichier binaire. Dans ce cas, vous devez d'abord encoder le contenu avec base64:

cat your_secret_file | /usr/bin/base64

Mettez ensuite la valeur encodée en base64 dans votre fichier secrets.yml, Par exemple:


crt_b64: |
  ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...

Vous pouvez ensuite créer le fichier distant en deux étapes:

- name: Copy certificate (base64 encoded)
  copy: content="{{ crt_b64 }}" dest=/some/path/cert.b64

- name: Decode certificate
  Shell: "base64 -d /some/path/cert.b64 > /some/path/cert.txt"
  args:
    creates: /some/path/cert.txt

Notez que vous pouvez supprimer le fichier temporaire cert.b64 Sur l'hôte distant. Mais en réexécutant le playbook, vous le recréez au lieu de sauter cette tâche. Je préfère donc le laisser là.

[~ # ~] mise à jour [~ # ~] : Cette fonctionnalité a été implémentée dans Ansible 2.1 .

le module de copie peut désormais utiliser de manière transparente un fichier stocké comme source, si des mots de passe de coffre-fort ont été fournis, il sera décrypté et copié à la volée.

21
Yasser

J'ai utilisé un modèle et un vars_file Pour le faire:

Dans votre playbook de haut niveau:

vars_files:
  - secretvars.yml

Dans une tâche:

- name: Private ssl key
  template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key

Dans le modèle (etc-ssl-private-site.key) Tout ce dont vous avez besoin est la variable:

{{ private_ssl_key }}

Dans le secretvars.yml Chiffré (chiffrez-le avec ansible-vault):

---

private_ssl_key: |
  -----BEGIN PRIVATE KEY-----
  abcabcabcabcabcabcabcabcabc
  -----END PRIVATE KEY-----
15
dave1010

Mise à jour: En date du avril 2016 mon Github PR a été fusionné et est disponible dans Ansible 2.1 et versions ultérieures. Ce qui suit était une solution provisoire jusqu'à la fusion du PR.

Voulant faire la même chose, j'ai créé un plugin d'action pour implémenter la fonctionnalité. Ceci est disponible via github . Le plugin est exactement le plugin d'action de copie fourni avec ansible, mais avec la prise en charge du décryptage du coffre-fort.

Vous pouvez l'utiliser comme ceci:

- name: Copy Some Secret File
  copyv: src="secret.txt" dest="/tmp/"

si secret.txt est chiffré (et que le mot de passe du coffre-fort est fourni), il sera déchiffré et copié.

13
Cam

Je pense que vous avez un moyen plus simple de le faire.

Si vous utilisez le certificat + la clé dans un fichier dans un certain format (comme pkcs12 ou simplement concaténé), vous pouvez utiliser le cryptage générique openssl (ou gpg, ou autre)). Il ressemblera à ceci:

openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>

Après cela, vous pouvez simplement copier encrypted.aes sur l'hôte distant et le décrypter en place:

- name: copy encrypted cert and key
  copy: src=encrypted.aes dest=/root/ansible-files/ mode=0600

- name: decrypt cert and key
  command: openssl enc -aes-256-ctr -d -in /root/ansible-files/encrypted.aes -out <dest> -k {{ pass-vault }}

Si vous avez un fichier clé distinct au format pem ou der, vous pouvez utiliser

openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
11
Konstantin Gribov

Ansible 2.5 a ajouté le paramètre decrypt au module copy.

Par exemple, si vous avez chiffré votre fichier en utilisant quelque chose comme:

$ ansible-vault encrypt vault/encrypted.crt

Vous pouvez maintenant utiliser copy + decrypt:

---
  - name: upload ssl crt
    copy:
      src: path/to/encrypted-with-vault.crt
      dest: /usr/local/etc/ssl/domain.crt
      decrypt: yes
      mode: 0600
4
hgdeoro

Jusqu'à ce que le module de "copie" ait été étendu pour décrypter automatiquement les fichiers du coffre-fort, voici une solution simple:

Lorsque stdout n'est pas un tty, ansible-vault view <file> imprime le texte clair sur stdout sans invoquer de pager.

En combinaison avec une recherche "pipe", ce comportement peut être utilisé avec un fichier de mot de passe du coffre-fort pour alimenter l'option "contenu" du module de copie:

- name: "install Host key"
  copy: content="{{ lookup('pipe', 'ansible-vault view ' + src_key_file) }}"
        dest={{ dest_key_file }}
3
Michael Wildpaner

Vous pouvez également utiliser local_action pour décrypter temporairement votre fichier dans le cadre du playbook:

- name: "temporairly decrypt the twpol.enc"
  Sudo: False
  local_action: Shell ansible-vault view --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASS_FILE') }} ./roles/copykey/files/key.enc > ./roles/copykey/files/key.txt 

- name: "copy the key to the target machine."
  copy: src=key.txt dest=/tmp

- name: "remove decrypted key.txt file"
  Sudo: False
  local_action: rm ./roles/copykey/files/key.txt
1
LogicalMethods