web-dev-qa-db-ja.com

ソース管理におけるAnsible SSH秘密鍵?

私は数週間Ansibleプレイブックを開発してきました。そのため、そのような技術での私の経験は比較的短いです。私の戦略の一部には、カスタムansible_ssh_userただし、インベントリ全体でホストをプロビジョニングするには、そのようなユーザーは独自のSSHキーペアを必要とします。これには、対応する秘密キーを保持/保存するための何らかのプランが含まれます。実稼働環境では、このプレイブックは複製/プルされ、特定のplaybook node内で実行されます。その役割は、インフラストラクチャの残りをプロビジョニングすることです。

最初は、その秘密鍵をPlaybookのgitリポジトリ内に置くことを考えていましたが、それでも、主にやや明白なセキュリティ上の理由とその周りの常識のために、私はそれについて再考しています。本件。

これがテーブルに設定されている場合、次の質問があります。

  • Ansibleベースの開発環境では、ソース管理でSSH秘密鍵を保持するのは妥当ですか?
  • 開発環境のみこのプラクティスは推奨されますか?playbookノード内の別のローカルgitブランチは、実際の本番SSH秘密鍵を保持するために使用されますか?
  • 代わりにAnsible Vaultを使用してこのケースシナリオに対処する方が良いでしょうか?これを使用したことはありませんが、それにもかかわらず、これを使用するのに適切なケースであるかどうかはまだわかりません。
  • あなたの経験では、本番環境でこれをどのようにアプローチしますか?この特定のシナリオのベストプラクティスとは何ですか?
49

SSH秘密鍵を含め、あらゆる種類のプレーンテキストの秘密をリビジョン管理に保存するのは悪い考えです。代わりに、ansible-vaultを使用して秘密鍵を保存します。

ansible-vaultは、任意のファイルタイプで操作できます。ファイルを暗号化するだけです

ansible-vault encrypt /path/to/local/private_key

次に、キーをインストールします。

- name: Install a private SSH key
  vars:
    source_key: /path/to/local/private_key
    dest_key: /path/to/remote/private_key
  tasks:
  - name: Ensure .ssh directory exists.
    file: 
      dest: "{{ dest_key | dirname }}"
      mode: 0700 
      owner: user 
      state: directory
  - name: Install ssh key
    copy: 
      src: "{{ source_key }}" 
      dest: "{{ dest_key }}"
      mode: 0600
      owner: user

Ansible-vaultの以前のバージョンは、varファイルで定義された変数でのみ動作するため、次のようなことをしなければなりませんでした。

ssh_key: |
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa

Ansible-vaultで暗号化する:

ansible-vault encrypt /path/to/var_file

キーをインストールします。

- name: Ensure .ssh directory exists.
  file: 
    dest: "{{ key_file | dirname }}"
    mode: 0700 
    owner: user 
    state: directory

- name: Install ssh key
  copy: 
    content: "{{ ssh_key }}" 
    dest: "{{ key_file }}"
    mode: 0600
    owner: user

コメントで回答を改善してくれた以下の方々に感謝します。

61
Ben Whaley

ゼロからプロビジョニングするため、generateplaybook nodeの秘密/公開キーペアを使用し、authorized_keysモジュールを介して公開キーを配布する必要があります。これにより、必要なホスト以外の場所に秘密を保存する必要がなくなります。 playbook nodeで実行されるこれを実現するためのプレイブックを次に示します。

---
- hosts: 127.0.0.1
  Sudo: yes
  gather_facts: no
  tasks:

  - name: create ansible_ssh_user locally
    user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa

  - name: copy the generated public key to an accessible location for the next play
    Shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub

- hosts: all
  Sudo: yes
  gather_facts: no
  tasks:

  - name: create ansible_ssh_user
    user: name=ansible_ssh_user groups=group1,group2

  - name: Add RSA public key to the remote Host
    authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"

- hosts: 127.0.0.1
  Sudo: yes
  gather_facts: no
  tasks:

  - name: remove public key from /tmp
    Shell: rm /tmp/ansible_ssh_user.pub
...
5
gmoon