web-dev-qa-db-ja.com

Ansible Vaultを使用して暗号化されたファイルをアップロードする方法は?

ansible-vault を使用してファイルを復号化してアップロードする例はありますか?.

SSL証明書をソース管理で暗号化しておくことを考えています。

次のように動作するはずです。

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

それはうまくいきません。取得できるのはencrypted.crt(Ansible Vaultを使用)文字通りdomain.crt

必要なのは、プレイブックを「Vault」の一部にし、証明書の内容を含む変数を追加することです。このようなもの:

---
- 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

Ansible Vaultを使用して、mycert変数を別の変数ファイルに配置することもできます。

コピーモジュールは、Ansible 2.1で更新されました。変更ログから:「コピーモジュールは、ボールトされたファイルをソースとして透過的に使用できるようになりました。ボールトパスワードが提供された場合、暗号化されたファイルは即座に復号化およびコピーされます。」一部の人々は必然的に受け入れられた答えを過ぎて見ていないので、ここでそれに注意してください。 – JKライホ

34
Rico

Ansible 2.1.x以降、コピーモジュールはこれをシームレスに行います。 Ansible Vaultでファイルを暗号化してから、ファイルに対してコピータスクを発行するだけです。

(参照用に、これを追加した機能を次に示します。 https://github.com/ansible/ansible/pull/15417

40
jeffmaher

コピーモジュールでこれをネイティブにサポートするための 機能要求 があります。しかし、それが実装されるまで、回避策があります(@ dave1010の答えに似ていますが、完全性のために共通部分を繰り返します):

secrets.ymlあなたの秘密を含むansible vaultで暗号化されたファイル、例えば:

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

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

あなたのプレイブックにそれを含めてください:

vars_files:
  - secrets.yml

次に、タスクで変数を使用できます。

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

ただし、コピーしようとしているファイルがバイナリファイルの場合、これは機能しません。その場合、まずbase64でコンテンツをエンコードする必要があります。

cat your_secret_file | /usr/bin/base64

次に、base64でエンコードされた値をsecrets.ymlファイル、例:


crt_b64: |
  ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...

次に、2つの手順でリモートファイルを作成できます。

- 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

一時的なcert.b64リモートホスト上のファイル。ただし、その後、プレイブックを再実行すると、このタスクをスキップする代わりに、プレイブックが再作成されます。だから、そこに置いておきたい。

[〜#〜] update [〜#〜]:この機能は Ansible 2.1 で実装されました。

コピーモジュールは、ボールトされたファイルをソースとして透過的に使用できるようになりました。ボールトパスワードが提供された場合、暗号化されたファイルは即座に復号化およびコピーされます。

21
Yasser

テンプレートとvars_fileを使用して実行しました。

トップレベルのプレイブックで:

vars_files:
  - secretvars.yml

タスク内:

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

テンプレート(etc-ssl-private-site.key)で必要なのは変数のみです:

{{ private_ssl_key }}

暗号化されたsecretvars.ymlansible-vaultで暗号化):

---

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

更新:April 2016my Github PR がマージされ、Ansible 2.1以降で利用可能になりました。以下は、PRが統合されるまでの暫定的な解決策でした。

同じことをしたいので、この機能を実装するアクションプラグインを作成しました。これは github で利用できます。プラグインは、ansibleに同梱されているコピーアクションプラグインとまったく同じですが、ボールトの復号化をサポートしています。

次のように使用できます。

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

secret.txtが暗号化されている(およびボールトパスワードが提供されている)場合、復号化されてコピーされます。

13
Cam

これを行うにはもっと簡単な方法があると思います。

1つのファイルで証明書+キーを何らかの形式(pkcs12または単に連結)で使用する場合、汎用のopenssl(またはgpg、またはその他)暗号化を使用できます。次のようになります。

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

その後、encrypted.aesをリモートホストにコピーして、その場で復号化することができます。

- 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 }}

Pemまたはder形式の個別のキーファイルがある場合は、次を使用できます。

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

Ansible 2.5では、パラメーターdecryptcopyモジュールに追加されました。

たとえば、次のようなものを使用してファイルを暗号化した場合:

$ ansible-vault encrypt vault/encrypted.crt

これで、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

「コピー」モジュールが拡張され、ボールトファイルが自動的に復号化されるまで、簡単な回避策があります。

Stdoutがttyではない場合、ansible-vault view <file>は、ポケットベルを呼び出さずにクリアテキストを標準出力に出力します。

「パイプ」ルックアップと組み合わせて、この動作をボールトパスワードファイルとともに使用して、コピーモジュールの「コンテンツ」オプションにフィードすることができます。

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

Local_actionを使用して、プレイブックの一部としてファイルを一時的に復号化することもできます。

- 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