¿Cuál es el usuario de MySQL de debian-sys-maint (y más)?

71

He sido mordido varias veces por el usuario 'debian-sys-maint' que está instalado por defecto en los paquetes mysql-server instalados desde los repositorios de Ubuntu.

En general, lo que sucede es que obtengo una copia nueva de nuestra base de datos de producción (que no se está ejecutando en Debian / Ubuntu) para la resolución de problemas o el nuevo desarrollo y olvido excluir la tabla mysql.user, por lo tanto, pierdo el usuario debian-sys-maint.

Si agregamos nuevos usuarios de mysql por cualquier razón, tengo que 'fusionarlos' en mi entorno de desarrollo en lugar de simplemente superponer la tabla.

Sin el usuario, mi sistema todavía parece funcional, pero está plagado de errores como:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • ¿Para qué se utiliza debian-sys-maint?
    • ¿Hay una mejor manera para que los encargados del paquete hagan lo que intentan hacer?
  • ¿Cuál es la forma más fácil de restaurarlo después de haberlo perdido?
  • ¿Cuál es el conjunto correcto / mínimo de privilegios para este usuario?
    • Parece una mala idea 'otorgar todos los privilegios en *. * ...'

Editar

Pregunta adicional: ¿la contraseña en /etc/mysql/debian.cnf ya está cifrada o esta es la contraseña de texto sin formato? Importa cuando vas a recrear al usuario y parece que nunca lo hago bien en el primer intento.

Gracias

Joe Holloway
fuente
8
La contraseña es texto sin formato en /etc/mysql/debian.cnf
Brent

Respuestas:

57

¿Para qué se utiliza debian-sys-maint?

Una cosa importante para la que se usa es decirle al servidor que ruede los registros. Necesita al menos el privilegio de recarga y apagado.

Ver el archivo /etc/logrotate.d/mysql-server

El /etc/init.d/mysqlscript lo utiliza para obtener el estado del servidor. Se utiliza para apagar / recargar el servidor con gracia.

Aquí está la cita de README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

¿Cuál es la forma más fácil de restaurarlo después de haberlo perdido?

El mejor plan es simplemente no perderlo. Si realmente pierde la contraseña, reiníciela con otra cuenta. Si ha perdido todos los privilegios de administrador en el servidor mysql, siga las guías para restablecer la contraseña de root, luego repare el debian-sys-maint.

Puede usar un comando como este para crear un archivo SQL que pueda usar más tarde para volver a crear la cuenta.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

¿La contraseña en /etc/mysql/debian.cnf ya está en hash

La contraseña no está cifrada / cifrada cuando está instalada, pero las nuevas versiones de mysql ahora tienen una forma de cifrar las credenciales (consulte: https://serverfault.com/a/750363 ).

Zoredache
fuente
1
"El mejor plan es simplemente no perderlo". ¿Seriamente? Eso es cero ayuda para las personas que ya lo han perdido, como aparentemente hice durante una actualización. Para aquellos que necesitan volver a crear el usuario, use una de las opciones de "CONCEDER TODO" en las otras respuestas, ya que este usuario NO solo se usa para operaciones de rotación de registros: es una parte crítica del proceso de actualización.
FKEinternet
Si pierde las credenciales, siempre tiene la opción, simplemente de iniciar el demonio mysql / mariadb con la opción que omite el sistema de permisos, o iniciar sesión como otro usuario con privilegios de root mysql y restablecer la contraseña. El restablecimiento de contraseñas y eludir el sistema de privilegios está bien documentado en otras ubicaciones en Google y otras preguntas en este sitio.
Zoredache
22

El usuario debian-sys-maint es por defecto un equivalente raíz . Es utilizado por ciertos scripts de mantenimiento en los sistemas Debian y, como efecto secundario, permite a los usuarios con acceso root en el cuadro ver la contraseña de texto sin formato en /etc/mysql/debian.cnf (¿buena o mala?)

Puede volver a crear el usuario de la siguiente manera:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Solo asegúrese de que la contraseña coincida con la de /etc/mysql/debian.cnf

Brent
fuente
9
Re (bueno o malo): si alguien logra convertirse en root, puede omitir el sistema de privilegios por completo simplemente reiniciando el servidor con las opciones correctas. Si un atacante obtiene root, probablemente tenga mayores problemas que ese archivo de configuración.
Zoredache
2
también re: bueno o malo: he tenido que confiar en el acceso debian-sys-maint para restablecer la contraseña de la cuenta raíz de MySQL cuando se había olvidado. Fue agradable tener esta opción alternativa.
Brent
1
@Brent: consulte dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html para saber cómo restablecer la contraseña de root de mysql. He deshabilitado a este usuario en muchas instalaciones mysql en Debian, ya que puede causar estragos en el inicio al verificar las tablas si son tablas grandes.
Nathan
1
Nathan, gracias por ese enlace. Esa es nueva información para mí. Si tiene un procedimiento para deshabilitar la cuenta debian-sys-maint por completo, ¿por qué no la incluye aquí como una respuesta separada? ¡Eso seria genial!
Brent
3
una mejor concesión sería solo dar privilegios de apagado / inicio.
jmtd
19

También podrías:

sudo dpkg-reconfigure mysql-server-5.0

Lo que le dará la opción de recrear el usuario debian-sys-maint. Los usuarios y las bases de datos existentes son seguros.


fuente
Esto funcionó en mysql-server-5.5 también.
serverSentinel
Esto solo funcionará si su instalación de mysql-server no está rota, como podría suceder si falta el usuario debian-sys-maint.
FKEinternet
19

Solo quería comentar, pero creo que la sintaxis correcta merece su propia entrada. Esto creará el usuario debian-sys-maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Si todavía tiene el archivo /etc/mysql/debian.cnf, simplemente use la contraseña allí.

Siéntase libre de encontrar una solución segura más paranoica .

d -_- b
fuente
1
Es tan paranoico como debe ser. Entonces solo uno que debería poder leer el /etc/mysql/debian.cnfarchivo es el rootusuario de Linux . Y cuando alguien puede leer ese archivo, ya tiene rootacceso a la máquina y puede detener el servidor MySQL y agregar un administrador de sistema propio. Y el script que inicia MySQL y otros paquetes no puede hacer mantenimiento de seguridad y otro mantenimiento. Entonces sí, es tan seguro como siempre debe ser. Y útil si pierde la contraseña de administrador de MySQL para recuperarla, sin la necesidad de reiniciarla en modo inseguro. ;-)
Anders
Para eso está la edición.
RobinJ
6

Si es necesario agregar el debian-sys-maintusuario sólo para logrotate.dpropósitos, debe no otorga ALL PRIVILEGESo GRANT OPTION- Se trata de un agujero de seguridad gigante innecesaria. En cambio, puede agregar al usuario con el RELOADprivilegio de esta manera (suponiendo que está accediendo a su base de datos como root, y reemplaza xxxxxx con su contraseña)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Actualización 2019

Esta respuesta puede estar desactualizada; vea los comentarios muy dictivos a continuación.

Mark Chackerian
fuente
Esta es la única respuesta segura, ya que solo otorga los permisos necesarios debian-sys-maint. Además, puedo confirmar que funciona de maravilla. ¡Salud!
Jealie
2
¿Es realmente un agujero de seguridad? Si alguien puede leer /etc/mysql/debian.cnf ya, entonces presumiblemente tiene acceso de root y puede reiniciar mysql con --skip-grant-tables de todos modos.
mc0e
Gracias. Pero no es necesario limpiar las cosas dos veces, MySQL ya sabe lo que hace el comando GRANT. Ver dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe
1
Y esto no funcionará, ya que el debian-sys-maintusuario también se utiliza para apagar el servidor. Y también para verificar si hay usuarios root al iniciar el servidor mysql. Por lo tanto, al menos debe otorgar privilegios seleccionados en mysql. * Y privilegios de apagado.
Anders
1
NO NO NO, NO siga el consejo de esta respuesta: debe otorgar todos los privilegios a debian-sys-maint por los motivos descritos en la otra respuesta titulada "permisos requeridos de debian-sys-maint". En resumen, puede estar bien día a día, pero se encuentra con problemas graves cuando aplica una actualización de seguridad, parche o mejora su sistema.
Kurt Fitzner
3

En lugar de

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

Yo creo que

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

porque la contraseña no está cifrada ...?

Fortega
fuente
3

debian-sys-maint permisos requeridos

Otras respuestas han abordado suficientemente todo, excepto el conjunto mínimo de permisos que se requieren para el usuario debian-sys-maint. Muchas de las respuestas aquí son simplemente incorrectas a ese respecto, y de hecho son peligrosas. No reduzca los privilegios de debian-sys-maint (incluida la opción de concesión) sin leer y comprender a continuación:

El mantenedor de Debian no le dio todos los privilegios al usuario caprichosamente. Esto es lo que se requiere, dónde y por qué. Algunos de estos privilegios son supersets de otros, pero los enumeraré independientemente en caso de que desee personalizar cosas y eliminar el requisito para ellos:

  • Apagar y volver a cargar , lo cual es bastante sorprendente, para cerrar o hacer una base de datos, realizado por /etc/init.d/mysql
  • seleccione en mysql.user , requerido para las comprobaciones de cordura realizadas cuando se inicia la base de datos, asegurando que haya un usuario root. Hecho cada inicio por / etc / mysql / debian-start (llamado por /etc/init.d/mysql) con el código real en la función check_root_accounts en el archivo /usr/share/mysql/debian-start.inc.sh
  • seleccione en information_schema.tables , selección global , requerido para verificar las tablas bloqueadas. Hecho cada inicio por / etc / mysql / debian-start (llamado por /etc/init.d/mysql) con el código real en la función check_for_crashed_tables en el archivo /usr/share/mysql/debian-start.inc.sh
  • Todos los privilegios globales , necesarios para actualizar tablas si / cuando se instala una nueva versión de MySQL a través de una actualización o actualización de Debian. Hecho cada inicio por / etc / mysql / debian-start (llamado por /etc/init.d/mysql) con el código real en la función upgrade_system_tables_if_necessary en el archivo /usr/share/mysql/debian-start.inc.sh - en realidad llama al binario MySQL mysql_upgrade - no se deje engañar por el nombre de la función (upgrade_system_tables_if_nenecesable), esto puede tocar potencialmente todas las tablas - vea abajo

El último es, por supuesto, el principal requisito de privilegios. La página del manual para mysql_upgrade dice que:

mysql_upgrade examina todas las tablas en todas las bases de datos para detectar incompatibilidades con la versión actual de MySQL Server. mysql_upgrade también actualiza las tablas del sistema para que pueda aprovechar los nuevos privilegios o capacidades que podrían haberse agregado.

Si mysql_upgrade encuentra que una tabla tiene una posible incompatibilidad, realiza una verificación de la tabla y, si se encuentran problemas, intenta repararla.

ADVERTENCIA Si decide reducir los privilegios que tiene debian-sys-maint, asegúrese de estar preparado para manejar manualmente cualquier futura actualización de seguridad de Debian y / o mejoras que toquen MySQL. Si realiza una actualización en los paquetes MySQL con un privilegio de debian-sys-maint reducido, y si mysql_upgrade no puede completarse como resultado, puede dejar su base de datos en un estado indefinido (lectura rota). Es posible que la reducción de privilegios no tenga ningún problema cotidiano aparente hasta que se presente una actualización, por lo tanto, no piense que ya ha reducido los privilegios sin efectos perjudiciales como base para pensar que es seguro.

Kurt Fitzner
fuente
Gracias por la elaborada respuesta. ¡Es difícil de creer que esta pregunta tenga casi 10 años!
Joe Holloway
Esta debería ser una de las primeras cosas que la gente lee.
FKEinternet
2

Como nota al margen de esto, eche un vistazo a esta publicación de mysqlperformanceblog por las razones por las que puede deshabilitar las cosas específicas de Debian.

Jon Topper
fuente
1
"Tenga en cuenta que esto no debería ser un problema con MySQL de Debian Lenny, ya que se entrega con guiones de inicio que no ejecutarán CHECK TABLE en tablas que no sean MYISAM". - desde la página vinculada
d -_- b
2

Cuando use MySQL 5.6+, recomendaría usar el mysql_config_editorcomando para crear una entrada para el usuario 'debian-sys-maint'@'localhost'usando la contraseña relevante, lo que significa que la contraseña no necesita ser almacenada en texto plano en el servidor.

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

Después de esto, el archivo de configuración específico de Debian /etc/mysql/debian.cnfpuede modificarse para que los detalles de nombre de usuario y contraseña no se almacenen en el archivo.

Finalmente, modifique el archivo logrotate para MySQL para que use los detalles de inicio de sesión almacenados en el ~/.mylogin.cnfarchivo en lugar del archivo específico de Debian reemplazando

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

con

/usr/bin/mysqladmin --login-path=debian-sys-maint

Espero que esto ayude :)

Dave

Dave Rix
fuente
Pero, ¿se logrará el propósito del debian-sys-maint usuario? Que los paquetes deberían poder usar este usuario / contraseña para realizar un mantenimiento del sistema como rootusuario en el dominio de Linux (¿no es necesario que el rootusuario en MySQL ingrese la rootcontraseña para MySQL?
Anders
Me funciona en mis pruebas, si realiza todos los cambios, como alterar /etc/mysql/debian.cnfpara eliminar las contraseñas y cambiar el archivo logrotate para hacer referencia a los detalles protegidos. No estoy seguro de si el usuario debian-sys-maint se usa para otra cosa, pero si es así, esto le ayudará a indicar dónde está usando Debian esta cuenta de usuario en su nombre.
Dave Rix