En Puppet, ¿cómo protegería una variable de contraseña (en este caso, una contraseña de MySQL)?

13

Estoy usando Puppet para aprovisionar MySQL con una clase parametrizada:

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

¿Cómo puedo proteger $password? Actualmente, eliminé el permiso legible mundial predeterminado del archivo de definición de nodo y otorgué explícitamente puppetpermiso de lectura a través de ACL.

Supongo que otros se han encontrado con una situación similar, por lo que tal vez haya una mejor práctica.

Belmin Fernandez
fuente

Respuestas:

3

Cuando trabajo con Puppet y MySQL, tiendo a poner la contraseña raíz en /root/.my.cnf, bloquear este archivo y luego restringir el acceso SSH al servidor de la base de datos.

Sí, almacenar la contraseña de root en el servidor db en texto claro no es la solución más segura. Sin embargo, si escribe la contraseña raíz de mysql en este archivo, asegurar la cuenta raíz de mysql para permitir los inicios de sesión de localhost solo mantendrá la contraseña fuera de la marioneta, y también fuera de la pstabla de la lista de procesos .

Además, si alguien tiene acceso de root para leer el archivo en /root/.my.cnf, entonces probablemente también tenga acceso para detener el demonio MySQL local y reiniciar el demonio sin la tabla de usuarios para obtener acceso root inmediato a la base de datos.

robbyt
fuente
2
Use mysql_config_editor si está en mysql 5.6 y posterior. Entonces, al menos, la contraseña no estará en texto plano.
Kejau Touray
1

Alguien más puede señalar algún complemento o similar que me corrija, pero la forma general de hacerlo es almacenar la contraseña cifrada , no la contraseña de texto sin formato.

Sin embargo, puedo decirle que ahora, MySQL no le permite usar una contraseña cifrada; de lo contrario, esa sería la contraseña y el hash le permitiría iniciar sesión de todos modos.

Existen muchos "hacks" que le permiten utilizar utilidades de terceros como Hiera y GPG . Obviamente, puede rodar los suyos, pero incluso las propias listas de correo de Puppet sugieren este método .

Andrew M.
fuente
1

No especificó de quién está protegiendo esta contraseña. Asumiré que son otros administradores de sistemas o posiblemente desarrolladores que tienen acceso al puppet master y / o los cuadros de clientes, pero no necesitan saber la contraseña de root.

Para configurar la contraseña inicialmente, puede usar esta sintaxis:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

Lo que le permitiría almacenar una contraseña cifrada en su configuración de títeres en lugar de una de texto sin formato.

Para usar mysqladminy el mysqlcliente en la línea de comandos, lo mejor que puedo pensar es agregar un .my.cnfarchivo a la configuración de su marioneta que se implementa en el directorio de inicio de un usuario apropiado. El archivo tanto en el puppet master como en los clientes debe tener permisos de archivo apropiados y restrictivos.

Hay muchas maneras de evitar esos permisos de archivo cuando agrega una marioneta a la mezcla (como escribir un exec () que extrae el archivo de los clientes) pero parece ser una mejora sobre el almacenamiento de la contraseña en un archivo legible en todo el mundo. Esto sería más difícil si usa un sistema de versiones para su configuración de títeres.

Ladadadada
fuente
1
Pero si alguien recupera la contraseña encriptada, ¿no podrían simplemente usar la cadena encriptada para iniciar sesión?
Andrew M.
@Redmumba Todas mis pruebas parecen indicar que sí. Tal vez me estoy perdiendo algo que Ladadadada podría explicar.
Belmin Fernández el
3
No. Cuando se usa en IDENTIFIED BY PASSWORD '*HASH-HERE'lugar de IDENTIFIED BY 'PASSWORD-HERE'MySQL, se inserta el hash directamente en la usertabla. Luego debe usar la contraseña que generó ese hash para iniciar sesión. Puede ver cómo se vería su comando de concesión con el hash de contraseña iniciando sesión normalmente y escribiendo SHOW GRANTS;. También puede consultar a otros usuarios conSHOW GRANTS FOR user@host;
Ladadadada
Ah, entonces no puedo usar el hash para iniciar sesión, ya veo. Sin embargo, si tiene un cliente que necesita conectarse a la base de datos, por ejemplo, su front-end, también necesitaría una forma de almacenar la contraseña encriptada, lo cual es algo para pensar.
Andrew M.
0

Este enlace sugiere dos métodos: usar variables de entorno y usar subshell.

Creo que también puede crear un contenedor simple alrededor de su comando mysqladminy pasarle su contraseña cifrada. Este contenedor luego descifrará la contraseña y se la pasará mysqladmin. Debe proteger su envoltorio ya que contiene la parte de descifrado.

Puede elegir la forma en que lo siente más seguro según su entorno y quién tiene acceso a su sistema.

Khaled
fuente