¿Clave privada Ansible SSH en control de fuente?

He estado desarrollando un libro de jugadas de Ansible por un par de semanas, por lo tanto, mi experiencia con dicha tecnología es relativamente corta. Parte de mi estrategia incluye el uso de un ansible_ssh_user personalizado para el aprovisionamiento de hosts en todo el deviseio, sin embargo, dicho usuario necesitará su propio par de keys SSH, lo que implicaría algún tipo de plan para mantener / almacenar su key privada correspondiente. En un entorno de producción, este libro de jugadas se clonaría / arrastraría y se ejecutaría dentro de un determinado nodo de libro de jugadas cuya function es aprovisionar el rest de la infraestructura.

Al principio, estaba pensando simplemente poner esa key privada dentro del repository de git del libro de jugadas, pero estoy teniendo dudas al respecto, sobre todo por razones de security obvias y sentido común, por eso necesito consultarlo. este asunto.

Con este set sobre la table, estas son las preguntas de seguimiento:

  • En un entorno de desarrollo basado en Ansible, ¿es sensato / razonable mantener una key SSH privada en el control de la fuente?
  • ¿Se aconsejaría esta práctica solo para entornos de desarrollo, mientras que otra twig git local dentro del nodo de libro de jugadas se usaría para mantener la key privada de producción real SSH?
  • ¿Sería mejor abordar este escenario de caso a través de Ansible Vault en su lugar ?, nunca he usado esto antes, pero independientemente de eso, aún no puedo decir si este sería un caso adecuado para usarlo.
  • En su experiencia, ¿cuál sería su enfoque al respecto en un entorno de producción ?, ¿cuál sería la mejor práctica en este escenario en particular?

Es una mala idea almacenar cualquier class de secreto de text sin formatting en el control de revisión, incluidas las keys privadas SSH. En su lugar, use ansible-vault para almacenar la key privada.

ansible-vault puede operar en cualquier tipo de file. Solo encripta el file con

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

luego instala la 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 

Las versiones anteriores de ansible-vault solo funcionarían en variables definidas en files var, por lo que tenía que hacer algo como esto:

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

Encriptar con ansible-vault:

 ansible-vault encrypt /path/to/var_file 

E instala la key:

 - 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 

Gracias a todos los de abajo que mejoraron la respuesta con sus comentarios.

Como está aprovisionando desde cero, debe generar el par de keys privadas / públicas en el nodo de libro de jugadas y luego distribuir la key pública a través del module authorized_keys . Esto eliminaría la necesidad de almacenar un secreto en cualquier lugar, excepto en el host donde se necesita. Aquí hay un libro de jugadas para lograr esto, que se ejecutará en el nodo de libro de jugadas :

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