118 votos

¿Cómo puedo implementar ansible con cada host de contraseñas, de forma segura?

Me gustaría usar el ansible para gestionar un grupo de servidores existentes. He creado un ansible_hosts archivo, y se ha probado con éxito (con la -K opción) con los comandos que sólo un único host de destino

ansible -i ansible_hosts host1 --sudo -K # + commands ...

Mi problema ahora es que las contraseñas de usuario en cada host son diferentes, pero no puedo encontrar una manera de manejar esto en Ansible.

El uso de -K, sólo me pide un solo sudo contraseña inicial, que a su vez parece ser intentado por todos los siguientes hosts sin preguntar:

host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password

Hasta ahora la investigación:

  • un StackOverflow pregunta con una respuesta incorrecta ("uso -K") y en una respuesta por el autor diciendo: "yo necesitaba sin contraseña sudo"

  • el Ansible docs, que dicen que "el Uso de sin contraseña sudo hace las cosas más fáciles de automatizar, pero no es necesario." (el énfasis es mío)

  • esta seguridad StackExchange pregunta que toma como leer que NOPASSWD es requerido

  • el artículo "Escalable y Comprensible de Aprovisionamiento..." que dice:

    "ejecutando sudo puede requerir la inserción de una contraseña, que es una manera segura de bloqueo de Ansible para siempre. Una solución sencilla es ejecutar visudo en el host de destino, y asegúrese de que el usuario Ansible va a utilizar para el inicio de sesión no tiene un tipo de contraseña"

  • el artículo "Basic Ansible Playbooks", que dice:

    "Ansible puede iniciar sesión en el servidor de destino como de la root y evitar la necesidad de sudo, o dejar que el ansible usuario ha sudo sin una contraseña, pero la idea de hacer bien mi bazo amenazar a dar un salto hasta mi garganta y bloquear la tráquea, por lo que no"

    Mis pensamientos exactamente, pero, a continuación, cómo se extienden más allá de un solo servidor?

  • ansible problema #1227, "Ansible debe pedir sudo contraseña para todos los usuarios en un libro de jugadas", que fue cerrado hace un año por mpdehaan con el comentario "no He visto mucho de la demanda de este, creo que la mayoría de las personas son sudoing de sólo una cuenta de usuario o usando las teclas de la mayoría de las veces".

Así que... ¿cómo es la gente el uso de Ansible en situaciones como estas? Configuración de NOPASSWD en /etc/sudoers, la reutilización de la contraseña a través de hosts o habilitar root SSH login todos parecen bastante drásticas reducciones en la seguridad.

61voto

Zeb Puntos 428

Seguramente has hecho tu investigación...

De todos los de mi experiencia con ansible lo que usted está buscando para llevar a cabo, no es compatible. Como usted ha mencionado, ansible los estados que no requieren sin contraseña sudo, y estás en lo correcto, no. Pero todavía tengo que ver a cualquier método de uso de múltiples sudo contraseñas dentro de ansible, sin por supuesto de la ejecución de múltiples configuraciones.

De modo, que no puede ofrecer la solución exacta que usted está buscando, pero no pregunte...

"Así que... ¿cómo es la gente el uso de Ansible en situaciones como estas? Configuración NOPASSWD en /etc/sudoers, la reutilización de la contraseña a través de los ejércitos o de la habilitación de root SSH login todos parecen bastante drásticas reducciones en la seguridad".

Te puedo dar una opinión sobre eso. Mi caso de uso es de 1k nodos en varios centros de datos de apoyo global SaaS, firma en la que tengo que diseñar/implementar algunos increíblemente apretado controles de seguridad debido a la naturaleza de nuestro negocio. La seguridad es siempre acto de equilibrio, más usabilidad menos seguridad, este proceso no es diferente si se ejecuta 10 servidores o 1.000 o 100.000.

Usted está absolutamente en lo correcto no usar root inicios de sesión, ya sea a través de contraseñas o claves ssh. De hecho, a root del inicio de sesión debe ser desactivado por completo si los servidores tienen un cable de red conectados a ellos.

Vamos a hablar acerca de la contraseña de la reutilización, en una gran empresa, es razonable pedir a los administradores de sistemas para tener contraseñas diferentes en cada nodo? para un par de nodos, tal vez, pero mi admins/ingenieros motín si tenían que tener contraseñas diferentes en 1000 nodos. La aplicación que sería casi imposible así, cada usuario tendría que almacenar sus contraseñas en algún lugar, es de esperar una keypass, no una hoja de cálculo. Y cada vez que pones una contraseña en un lugar donde se puede extraer en formato de texto, que han disminuido notablemente su seguridad. Me gustaría mucho saber, por el corazón, una o dos contraseñas fuertes, que tienen que consultar a un keypass archivo cada vez que se necesitan para iniciar o cerrar sesión en invocar sudo en una máquina.

Así contraseña resuse y la estandarización es algo que es completamente aceptable y estándar, incluso en un entorno seguro. De lo contrario, ldap, keystone, y otros servicios de directorio no tendría que existir.

Cuando nos movemos de forma automatizada los usuarios, las claves ssh gran trabajo para llegar a usted, pero usted todavía necesita para obtener a través de sudo. Sus opciones son un estándar de la contraseña para el usuario automatizado (que es aceptable en muchos casos) o para permitir que NOPASSWD como usted ha señalado. La mayoría de los automatizado de los usuarios sólo ejecutar un par de comandos, así que es muy posible, y ciertamente deseable permitir que NOPASSWD, pero sólo para pre-aprobado comandos. Me gustaría sugerir el uso de su gestión de la configuración (ansible en este caso) para administrar el archivo sudoers para que usted puede actualizar fácilmente la contraseña de menos de lista de comandos.

Ahora, hay algunos pasos que usted puede tomar una vez que comienzas a escalar para aislar aún más el riesgo. Mientras tenemos 1000 o más nodos, no todos ellos son la "producción" de los servidores, algunos son entornos de prueba, etc. No todos los administradores pueden acceder a los servidores de producción, los que a pesar de utilizar su mismo SSO de usuario/contraseña|clave que en otras partes. Pero automatizado de los usuarios son un poco más seguro, por ejemplo, una herramienta automatizada que no sean de producción administradores pueden tener acceso a un usuario y credenciales que no pueden ser utilizados en la producción. Si usted quiere lanzar ansible en todos los nodos, tendrías que hacerlo en dos tandas, una vez para que no sea de producción y una vez para la producción.

También utilizamos títere sin embargo, ya que es un cumplimiento de la gestión de la configuración de la herramienta, por lo que la mayoría de los cambios a todos los entornos que iba a ser lanzados a través de él.

Obviamente, en el caso de que la función de solicitud citado obtiene reabierto/completado, lo que usted está buscando para hacer serían totalmente compatibles. Incluso entonces, la seguridad es un proceso de evaluación de riesgo y compromiso. Si sólo tiene un par de nodos que pueden recordar las contraseñas sin tener que recurrir a una nota post-it, contraseñas separadas sería un poco más seguro. Pero para la mayoría de nosotros, no es una opción viable.

39voto

Daniel Neades Puntos 141

De Ansible 1.5, es posible utilizar un cifrado de la bóveda para host_vars y otras variables. Esto hace, al menos, permite almacenar una per-host (o por grupo) ansible_sudo_pass variable de forma segura. Por desgracia, --ask-vault-pass sólo símbolo del sistema para una sola bóveda de contraseñas por ansible invocación, por lo que todavía están limitados a una sola bóveda contraseña para todos los hosts que vamos a usar juntos.

Sin embargo, para algunos de los usos que esto puede ser una mejora con respecto a tener una sola contraseña de sudo a través de múltiples hosts, ya que un atacante sin acceso a su cifrado host_vars sería todavía necesita separar la contraseña de sudo para cada máquina (máquina o grupo) que él o ella ataques.

26voto

Alex Dupuy Puntos 171

Con Ansible 1.5, es posible establecer el ansible_sudo_pass variable lookup('password', …):

ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}"

Esto me parece más conveniente que el uso de archivos en host_vars/ por varias razones:

  • En realidad yo uso with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt" a disposición de contraseñas para implementar usuario remoto (el cual es necesario para sudo), así que ya están presentes en los archivos (aunque al hacer estas búsquedas de texto pierde el valor de la sal se almacena en el archivo cuando el valor hash se genera).

  • Esto mantiene sólo las contraseñas en el archivo (no ansible_sudo_pass: de texto simple conocido) para algunos epsilon aumento en la seguridad criptográfica. Más significativamente, esto significa que usted no es el cifrado de todos los otros host específico de las variables, para que puedan ser leídos sin la contraseña del almacén.

  • Poner las contraseñas en un directorio separado hace que sea más fácil mantener los archivos de control de código fuente, o el uso de una herramienta como git-cripta para almacenarlos en forma encriptada (usted puede usar esto con anteriores Ansible que carece de la bóveda de la característica). Puedo utilizar git-crypt y ya que sólo comprobar el repositorio en descifrar la forma en cifrado de sistemas de archivos, que no se molestan con la bóveda y por lo tanto no se necesita escribir una contraseña del almacén. (Uso de ambos sería, por supuesto, más segura).

Usted puede también utilizar la búsqueda de la función con ansible_ssh_pass; esto puede ser posible con versiones anteriores de Ansible que no tienen ansible_sudo_pass.

3voto

Este es un muy pasado de rosca, no obstante:

  • Se utilizan dos diferentes sistemas de autenticación en la casa, la gestión de las máquinas se realiza desde estaciones de trabajo locales en mi equipo.
  • Escribí un vars_plugin de Ansible (un lugar implementación completa se puede encontrar en https://gist.github.com/mfriedenhagen/e488235d732b7becda81) que distingue a los varios sistemas de autenticación:
  • El nombre de el sistema de autenticación es un grupo específico.
  • El usa de inicio de sesión/usuario sudo es el grupo y los de administración específicos.
  • Así que me tire el usuario de la administración del medio ambiente y la contraseña correspondiente a través de la python-llavero de la biblioteca a partir de una contraseña fuerte (que uso Mac OS X llavero, pero a partir de la documentación de kwallet Gnome y _win_crypto están soportadas).
  • I establecer permisos en las contraseñas en Mac OS X llavero para notificarme sobre el hecho de que el programa de línea de comando de seguridad de las solicitudes de acceso a una contraseña para cada sistema de autenticación utilizado por los anfitriones, así que me quede "ansible-s all-m ping" y obtener dos preguntas (una por cada sistema de autenticación) donde I pulse la barra de espacio y ansible recoge las contraseñas.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: