Larga historia corta: gran corporación antigua, muchos servidores UNIX / Linux.
Heredé la responsabilidad de un montón de guiones que dejaron hace unos años. Uno de ellos era un script que se ejecutaría cada $ X durante meses para actualizar globalmente la contraseña de root en todos nuestros servidores.
El script es un desastre de Shell Script and Expect, y funciona en la confianza SSH que se configura entre todos nuestros servidores y un servidor central de comando y control.
El problema es que el guión es un desastre gigante. Los comandos de Expect están tratando de dar cuenta de todas las versiones posibles de "passwd" que existen en cualquier cuadro de UNIX / Linux, y varían bastante.
A medida que estamos ampliando y actualizando gran parte de nuestra infraestructura, el script se está volviendo realmente inmanejable.
Mi pregunta es: ¿hay una mejor manera de hacer esto? Suponiendo que haya una confianza SSH ya establecida, ¿cuál es la mejor manera de cambiar la contraseña de root en más de 3000 servidores al mismo tiempo?
sudo
y eliminar las contraseñas raíz por completo no es una opción, ¿verdad?Respuestas:
Utiliza la marioneta .
Puppet es muy flexible, fácil de mantener y utiliza SSL. Puede sonar un poco exagerado y tendrás que hacer un esfuerzo extra para construir el sistema Puppet.
Pero. Probablemente esta no sea la última actualización masiva que harás en estas máquinas. Puppet te ahorrará mucho tiempo cuando comience cualquier procedimiento de actualización masiva y los scripts sean muy legibles / reutilizables.
Al menos esto funcionó para mí hace unos años y todavía puedo reutilizar algunas de esas recetas de Puppet (también conocidos como scripts). También lo he usado en entornos un poco más pequeños, solo asegúrate de que cada máquina tenga un estado conocido .
He demostrado muchas veces (en muchas empresas) que todos los scripts de implementación personalizados se vuelven dolorosos después de un tiempo o cuando interviene el siguiente tipo. Y siempre que lleve un teléfono celular, los scripts antiguos lo perseguirán y lo harán.
Si crees que esto realmente suena bien, aquí hay un gran tutorial de Puppet con entorno virtual incluido para que comiences.
fuente
user{"root":}
para establecer la contraseña. En cambio, use unexec{"chpasswd -e ..."}
, que es mucho más seguro.pip install ansible
en un cuadro de GNU / Linux, cree una lista de hosts yansible -m user -a "password=$crpyt"
. No se necesitan agentes. Gestiona GNU / Linux, AIX y Solaris fuera de la caja.He usado el módulo Perl Authen :: PAM en Solaris con gran éxito. Aquí hay un script de muestra:
fuente
Si puede escribir Perl, el módulo Net :: OpenSSH :: Parallel permite escribir scripts que realizan acciones en paralelo en hosts remotos a través de SSH con bastante facilidad.
Contiene una secuencia de comandos de muestra para cambiar las contraseñas que puede usar como base. Como parece que tiene un entorno heterogéneo, le gustaría agrupar los hosts por tipo y usar un sub diálogo de manejo de diálogo diferente para cada uno.
fuente
No sé sobre "mejor", y si es posible para todas las máquinas nix * que no son Linux en su mezcla, pero ¿ha mirado títeres o cfengine para este tipo de actividad?
También hay herramientas comerciales (muy caras) para la gestión de identidad, dos que he visto / usado en el pasado son Oracle Identity Manager y el equivalente de Novela.
fuente
Después de continuar investigando esto, aprendí algunas cosas ...
En primer lugar, esta es una tarea realmente molesta para automatizar, especialmente en muchos entornos diferentes. La respuesta más correcta a esta pregunta es probablemente @ tomi's: use Puppet.
Eventualmente, espero que Puppet administre la infraestructura, pero la implementación en los servidores UNIX de toda la empresa para un cambio de contraseña de root en este momento no es una opción tan factible.
Después de leer muchas páginas de manual y un montón de Google-fu, logré crear un script que recorre una lista de servidores de destino, abre una conexión SSH y ejecuta uno de los siguientes:
Hace bastante más que ejecutar solo esos comandos, pero los anteriores son los que funcionan la magia.
No pude encontrar ninguna manera simple de cambiar la contraseña de forma no iterativa en Solaris, por lo que recurrimos a la modificación
/etc/shadow
sobre la marcha.fuente
/dev/null
antes de hacerlo.Recientemente he hecho esto usando Bash Script ...
fuente
Esta es mi solución hasta ahora. todavía necesito ver si funciona en múltiples sistemas
fuente
Puede usar pdsh para ejecutar su comando en varios hosts al mismo tiempo.
fuente
passwd
es diferente en las diferentes versiones mencionadas.pw
no siempre disponible ....passwd
siempre es interactivo para el usuario.passwd
en RHEL Linux al menos tiene un--stdin
parámetroAdemás del títere: SaltStack Otro enfoque: automatice la ejecución usando las bibliotecas SSH de forma secuencial o en paralelo usando Fabric http://docs.fabfile.org/en/1.6/ , Capistrano o similar que no requieren mucho tiempo / esfuerzo para desplegarse.
fuente
Dos opciones:
Usar marioneta
Utilice la plataforma de ejecución. Run deck es un servidor que le permite ejecutar comandos en cientos de máquinas simultáneamente. Puede agrupar máquinas en grupos, para ejecutar comandos en solo un subconjunto de máquinas.
http://rundeck.org
fuente
Creo que el formato del
/etc/shadow
archivo es bastante estándar en las distribuciones de Linux. ¿Puedes escribir un script awk simple para actualizar la contraseña?cat /etc/shadow| awk -v pass='NEWPASSHASH' -v now=`date '+%s'` 'BEGIN{ OFS=FS=":"} /^root/ {$2=pass; $3=now} {print}' > /tmp/shadow && mv /tmp/shadow /etc/shadow
Me aseguraría de probarlo para que no te bloquees;)
fuente