Comment télécharger un fichier crypté à l'aide d'une voûte possible?

Est-ce que quelqu'un a 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 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
34
demandé sur Rico 2014-04-01 02:17:29

10 réponses

ça ne va pas marcher. Ce que vous obtiendrez est votre encrypted.crt (avec Ansible Voûte) téléchargé littéralement domain.crt

ce que vous devez faire est de faire votre playbook partie d'une "voûte" et ajouter une variable qui contient votre contenu de certificat. Quelque chose comme ceci:

---
- 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 choisir de mettre votre mycert variable dans un fichier de variables séparé en utilisant aussi une voûte possible.

le module de copie a été mis à jour dans la version 2.1. À partir de la changelog: "le module de copie peut maintenant utiliser de manière transparente un fichier voûté comme source, si les mots de passe de la chambre forte ont été fournis il va décrypter et copier à la volée." Notant ici, puisque certaines personnes ne peut pas voir au-delà de la accepté de répondre. - JK Laiho!--5-->

31
répondu Rico 2016-08-02 15:02:54

le module de copie fait maintenant cela de façon transparente à partir de la version 2.1.x. Il suffit de crypter votre fichier avec un coffre-fort possible et puis émettre la tâche de copie sur le fichier.

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

29
répondu jeffmaher 2016-05-27 15:35:01

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

Créer un secrets.yml fichier crypté avec un coffre-fort possible 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 playbook, inclure:

vars_files:
  - secrets.yml

alors vous pouvez utiliser les variables tâches:

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

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

cat your_secret_file | /usr/bin/base64

alors mettez la valeur codée base64 dans votre secrets.yml le fichier, 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 cert.b64 le fichier sur l'hôte distant. Mais de relancer la playbook va le recréer au lieu de sauter cette tâche. Donc, je préfère en rester là.

UPDATE: Cette fonctionnalité a été implémentée dans Ansible 2.1.

module de copie peut maintenant utiliser de manière transparente un fichier voûté comme source, si les mots de passe de la chambre forte ont été fournis il va décrypter et copier à la volée.

21
répondu Yasser 2016-07-01 15:40:05

j'ai utilisé un modèle et un vars_file pour le faire:

Dans votre top-niveau playbook:

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) tous vous avez besoin est la variable:

{{ private_ssl_key }}

chiffré secretvars.yml (crypter ce ansible-vault):

---

private_ssl_key: |
  -----BEGIN PRIVATE KEY-----
  abcabcabcabcabcabcabcabcabc
  -----END PRIVATE KEY-----
15
répondu dave1010 2014-04-08 14:57:18

mise à jour: à partir de avril 2016 mon GitHub PR a été fusionné et est disponible en version 2.1 et ultérieure. Ce qui suit était une solution provisoire jusqu'à la fusion du RP.

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 tel que livré avec ansible, mais avec support pour le décryptage de voûte.

Vous pouvez l'utiliser comme ceci:

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

si secret.txt est crypté (et le mot de passe de la chambre forte est fourni) alors il sera décrypté et copié.

13
répondu Cam 2017-01-21 10:51:26

je pense que vous avez une façon plus simple de le faire.

si vous utilisez certificat + clé dans un fichier dans un certain format (comme pkcs12 ou tout simplement concaténé), vous pouvez utiliser openssl (ou gpg, ou quelque chose d'autre) chiffrement. Il ressemble à ceci:

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

Après cela, vous pouvez simplement copier chiffré.aes à l'hôte distant et de 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é séparé au format PEM ou der, vous pouvez utiliser

openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
11
répondu Konstantin Gribov 2016-08-11 13:44:15

Jusqu'à ce que le module' copier ' ait été étendu pour décrypter automatiquement les fichiers vault, voici une solution simple:

Quand stdout n'est pas un ats, ansible-vault view <file> imprime cleartext à stdout sans invoquer un pager.

en combinaison avec une recherche' pipe', ce comportement peut être utilisé avec un fichier de mots de passe de la chambre forte pour alimenter dans l'option 'content' du module de copie:

- name: "install host key"
  copy: content="{{ lookup('pipe', 'ansible-vault view ' + src_key_file) }}"
        dest={{ dest_key_file }}
3
répondu Michael Wildpaner 2015-08-28 22:10:01

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
répondu LogicalMethods 2016-04-07 20:41:46

Ansible 2.5 a ajouté le paramètre decryptcopy module.

par exemple, si vous avez crypté votre fichier en utilisant quelque chose comme:

$ ansible-vault encrypt vault/encrypted.crt

Maintenant vous pouvez utiliser copy + décrypter:

---
  - name: upload ssl crt
    copy:
      src: path/to/encrypted-with-vault.crt
      dest: /usr/local/etc/ssl/domain.crt
      decrypt: yes
      mode: 0600
0
répondu hgdeoro 2018-07-11 06:07:10

+1 pour le copy: content= {{ private_ssl_key }}" méthode suggérée par @utapyngo ci-dessus.

si vous faites votre distribution de clés comme un rôle, plutôt que simplement dans un playbook (et pourquoi pas, puisque la distribution de clés est quelque chose dont vous pourriez avoir besoin plus tard), gardez à l'esprit ce qui suit:

  • vous n'obtenez qu'un seul fichier pour vos vars, donc toutes les clés (par exemple, vous avez différents paquets basés sur des machines hôtes ou autre) doivent aller ensemble dans <role>/vars/main.yml
  • Variables dans ce <role>/vars/main.yml sont référencables sans aucun chemin (c'est bien!)
  • rappelez-vous que chaque fois que vous voulez le contenu de la variable, vous avez besoin de guillemets et de curlies, i.e., "{{ your_variable_name }}"
  • Si vous souhaitez copier plus d'un dossier par la tâche, vous avez besoin d'un with_items: boucle
  • si vous voulez garder vos données sensibles que vous avez eu tant de mal à chiffrer en premier lieu hors de l'écran, un tour soigné est de suivre vos variables clés à l'intérieur d'un dictionnaire; de cette façon, dans votre with_items boucle vous lui donnez la clé du dictionnaire plutôt que le contenu de la variable elle-même.
-1
répondu user3528000 2015-02-13 18:18:58