git ssh ansible ssh-keys

git - ¿Clave privada Ansible SSH en control de fuente?



ssh-keys (2)

Como está aprovisionando desde cero, debe generar el par de claves privadas / públicas en el nodo de libro de jugadas y luego distribuir la clave pública a través del módulo 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 ...

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 inventario, sin embargo, dicho usuario necesitará su propio par de claves SSH, lo que implicaría algún tipo de plan para mantener / almacenar su clave 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 función es aprovisionar el resto de la infraestructura.

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

Con este conjunto sobre la mesa, estas son las preguntas de seguimiento:

  • En un entorno de desarrollo basado en Ansible, ¿es sensato / razonable mantener una clave SSH privada en el control de la fuente?
  • ¿Se aconsejaría esta práctica solo para entornos de desarrollo, mientras que otra rama git local dentro del nodo de libro de jugadas se usaría para mantener la clave 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, todavía 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 clase de secreto de texto sin formato en el control de revisión, incluidas las claves privadas SSH. En su lugar, use ansible-vault para almacenar la clave privada.

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

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

luego instala la clave:

- 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 archivos 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 clave:

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