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