web-dev-qa-db-fra.com

Une clé privée SSH ansible dans le contrôle de code source?

Je développe un playbook Ansible depuis quelques semaines, par conséquent, mon expérience avec une telle technologie est relativement courte. Une partie de ma stratégie consiste à utiliser un ansible_ssh_user Personnalisé pour provisionner les hôtes tout au long de l'inventaire, mais cet 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. Sur un environnement de production, ce playbook serait cloné/tiré et exécuté à l'intérieur d'un certain nœud du playbook dont le rôle est de provisionner le reste de l'infrastructure.

Au début, je pensais simplement mettre cette clé privée dans le référentiel git de playbook, mais j'y réfléchis néanmoins, principalement pour des raisons de sécurité quelque peu évidentes et de bon sens, d'où la raison pour laquelle je dois vous consulter cette question.

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

  • Dans un environnement de développement basé sur Ansible, est-il raisonnable/raisonnable de détenir une clé SSH privée dans le contrôle de code source?
  • Cette pratique serait-elle conseillée niquement pour les environnements de développement alors qu'une autre branche git locale à l'intérieur du noeud playbook serait alors utilisée pour conserver la clé privée SSH de production réelle?
  • Serait-il préférable de traiter ce scénario de cas via Ansible Vault à la place?, Je ne l'ai jamais utilisé auparavant, mais malgré cela, je ne peux pas encore dire si ce serait un cas approprié pour l'utiliser.
  • D'après votre expérience, quelle serait votre approche à ce sujet dans un environnement de production?, Quelle serait-elle considérée comme la meilleure pratique dans ce scénario particulier?
49

C'est une mauvaise idée de stocker tout type de secret en clair dans le contrôle de révision, clés privées SSH incluses. Utilisez plutôt ansible-vault pour stocker la clé privée.

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

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

puis 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 de ansible-vault ne fonctionnaient que sur les 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 installez 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.

61
Ben Whaley

Puisque vous provisionnez à partir de zéro, vous devez générer la paire de clés privée/publique sur le noeud playbook puis distribuer la clé publique via le authorized_keys module. 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
gmoon