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 puppet
permiso 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.
fuente
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 .
fuente
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:
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
mysqladmin
y elmysql
cliente en la línea de comandos, lo mejor que puedo pensar es agregar un.my.cnf
archivo 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.
fuente
IDENTIFIED BY PASSWORD '*HASH-HERE'
lugar deIDENTIFIED BY 'PASSWORD-HERE'
MySQL, se inserta el hash directamente en lauser
tabla. 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 escribiendoSHOW GRANTS;
. También puede consultar a otros usuarios conSHOW GRANTS FOR user@host;
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
mysqladmin
y 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.
fuente