Clé privée SSH Ansible dans le contrôle de source?

J'ai développé un playbook Ansible pendant quelques semaines, donc mon expérience avec une telle technologie est relativement courte. Une partie de ma stratégie comprend l'utilisation d'un ansible_ssh_user personnalisé pour approvisionner les hôtes tout au long de l'inventaire, cependant, un tel utilisateur aura besoin de sa propre paire de clés SSH, ce qui impliquerait une sorte de plan pour conserver/stocker sa clé privée correspondante. Dans un environnement de production, ce playbook serait cloné / tiré et exécuté à l'intérieur d'un certain nœudplaybook dont le rôle est de fournir le reste de l'infrastructure.

Au début, je pensais simplement mettre cette clé privée dans le dépôt git de playbook, mais j'ai quand même des doutes à ce sujet, principalement à cause de raisons de sécurité quelque peu évidentes et de bon sens, d'où la raison pour laquelle je dois vous consulter à ce sujet.

Avec cet ensemble sur la table, voici les questions de suivi:

  • dans un environnement de développement basé sur Ansible, est-ce sane / raisonnable de détenir une clé SSH privée dans le contrôle de source?
  • cette pratique serait-elle conseillée uniquement pour les environnements de développement alors qu'une autre branche git locale à l'intérieur du noeud playbook serait alors utilisée pour contenir la clé privée SSH de production réelle?
  • serait-il préférable d'aborder ce scénario de cas via Ansible Vault à la place?, Je n'ai jamais utilisé cela auparavant, mais indépendamment de cela, je ne peux pas encore dire si ce serait un cas approprié pour l'utilisation il.
  • d'après votre expérience, quelle serait votre approche dans un environnement de production?, quelle serait-elle considérée comme la meilleure pratique dans ce scénario particulier?
43
demandé sur hjpotter92 2015-04-01 16:41:10

2 réponses

C'est une mauvaise idée de stocker n'importe quel type de secret en clair dans le contrôle de révision, clés privées SSH incluses. Au lieu de cela, utilisez Ansible-vault pour stocker la clé privée.

ansible-vault peut fonctionner sur n'importe quel type de fichier. Chiffrez simplement le fichier avec

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

Ensuite, installez la clé:

- 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

Les versions antérieures d'Ansible-vault ne fonctionnaient que sur des variables définies dans les fichiers var, vous deviez donc faire quelque chose comme ceci:

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

Chiffrer avec Ansible-vault:

ansible-vault encrypt /path/to/var_file

Et installer la clé:

- 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

Merci à tous ceux ci-dessous qui ont amélioré la réponse avec leurs commentaires.

54
répondu Ben Whaley 2017-09-28 14:32:52

Puisque vous provisionnez à partir de zéro, vous devez générer la paire de clés privée/publique sur le nœud playbook , puis distribuer la clé publique via le module authorized_keys. Cela éliminerait la nécessité de stocker un secret n'importe où, sauf sur l'hôte où il est nécessaire. Voici un playbook pour y parvenir, qui serait exécuté sur le noeud playbook :

---
- 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
répondu gmoon 2015-04-10 00:29:32