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.