Quel est l'utilisateur MySQL de debian-sys-maint (et plus)?

71

J'ai été mordu à plusieurs reprises par l'utilisateur 'debian-sys-maint' qui est installé par défaut sur les paquets mysql-server installés à partir des référentiels Ubuntu.

En général, je récupère une nouvelle copie de notre base de données de production (qui ne tourne pas sous Debian / Ubuntu) à des fins de dépannage ou de nouveau développement, sans oublier d’exclure la table mysql.user et de perdre ainsi l’utilisateur debian-sys-maint.

Si nous ajoutons de nouveaux utilisateurs mysql pour une raison quelconque, je dois les "fusionner" dans mon environnement de développement, au lieu de simplement superposer la table.

Sans l'utilisateur, mon système semble toujours fonctionnel, mais en proie à des erreurs telles que:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • À quoi sert debian-sys-maint?
    • Existe-t-il un meilleur moyen pour les mainteneurs de paquets de faire ce qu'ils essaient de faire?
  • Quel est le moyen le plus simple de le restaurer après l'avoir perdu?
  • Quel est le jeu de privilèges correct / minimal pour cet utilisateur?
    • Cela semble être une mauvaise idée d '' accorder tous les privilèges sur *. * ... '

Modifier

Question supplémentaire - Le mot de passe dans /etc/mysql/debian.cnf est-il déjà haché ou s'agit-il du mot de passe en texte brut? C'est important quand vous allez recréer l'utilisateur et je ne semble jamais réussir du premier coup.

Merci

Joe Holloway
la source
8
Le mot de passe est en clair dans /etc/mysql/debian.cnf
Brent

Réponses:

57

À quoi sert debian-sys-maint?

Une des principales choses pour lesquelles il est utilisé est de dire au serveur de rouler les journaux. Il faut au moins le privilège de rechargement et d’arrêt.

Voir le fichier /etc/logrotate.d/mysql-server

Il est utilisé par le /etc/init.d/mysqlscript pour obtenir le statut du serveur. Il est utilisé pour éteindre / recharger le serveur en douceur.

Voici la citation du 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.

Quel est le moyen le plus simple de le restaurer après l'avoir perdu?

Le meilleur plan consiste simplement à ne pas le perdre. Si vous perdez vraiment le mot de passe, réinitialisez-le en utilisant un autre compte. Si vous avez perdu tous les privilèges d’administrateur sur le serveur mysql, suivez les instructions pour réinitialiser le mot de passe root, puis réparez le debian-sys-maint.

Vous pouvez utiliser une commande comme celle-ci pour créer un fichier SQL que vous pourrez utiliser ultérieurement pour recréer le compte.

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

Le mot de passe dans /etc/mysql/debian.cnf est-il déjà haché?

Le mot de passe n'est pas chiffré ni chiffré lors de l'installation, mais les nouvelles versions de mysql permettent désormais de chiffrer les informations d'identification (voir: https://serverfault.com/a/750363 ).

Zoredache
la source
1
"Le meilleur plan consiste simplement à ne pas le perdre." Sérieusement? C'est zéro aide pour les personnes qui l'ont déjà perdu comme je l'ai apparemment fait lors d'une mise à niveau. Pour ceux qui ont besoin de recréer l'utilisateur, utilisez l'une des options "ANNULER TOUT" des autres réponses, car cet utilisateur N'EST PAS utilisé uniquement pour les opérations logrotate - c'est une partie essentielle du processus de mise à niveau.
FKEinternet
Si vous perdez les informations d'identification, vous avez toujours la possibilité de démarrer simplement le démon mysql / mariadb avec l'option permettant d'ignorer le système de permissions ou de vous connecter en tant qu'autre utilisateur disposant des privilèges root et de réinitialiser le mot de passe. La réinitialisation des mots de passe et le contournement du système de privilèges sont bien documentés dans d’autres emplacements de Google et dans d’autres questions de ce site.
Zoredache
22

L’utilisateur debian-sys-maint est par défaut un équivalent racine . Il est utilisé par certains scripts de maintenance sur les systèmes Debian et, en tant qu’effet secondaire, permet aux utilisateurs disposant d’un accès root sur la boîte de visualiser le mot de passe en texte brut dans /etc/mysql/debian.cnf (bon ou mauvais?)

Vous pouvez recréer l'utilisateur en:

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

Assurez-vous simplement que le mot de passe correspond à celui de /etc/mysql/debian.cnf

Brent
la source
9
Re (bon ou mauvais) - Si quelqu'un réussit à devenir root, il peut entièrement contourner le système de privilèges en redémarrant simplement le serveur avec les options appropriées. Si vous êtes un utilisateur malveillant sous root, vous avez probablement de plus gros problèmes que ce fichier de configuration.
Zoredache
2
également re: bon ou mauvais - je devais compter sur l’accès debian-sys-maint pour redéfinir le mot de passe du compte racine MySQL après l’oubli. C'était bien d'avoir cette option de secours.
Brent
1
@Brent: Voir dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html pour savoir comment réinitialiser le mot de passe mysql root. J'ai désactivé cet utilisateur sur de nombreuses installations mysql sur Debian, car cela pourrait causer des dégâts au démarrage en vérifiant les tables si celles-ci étaient volumineuses.
Nathan
1
Nathan, merci pour ce lien. C'est une nouvelle information pour moi. Si vous avez une procédure pour désactiver le compte debian-sys-maint, pourquoi ne pas l'inclure ici en tant que réponse séparée. Ce serait génial!
Brent
3
une meilleure subvention serait juste pour donner les privilèges d'arrêt / démarrage.
Jmtd
19

Vous pourriez aussi:

sudo dpkg-reconfigure mysql-server-5.0

Ce qui vous donnera la possibilité de recréer l'utilisateur debian-sys-maint. Les utilisateurs existants et les bases de données sont en sécurité.


la source
Cela a également fonctionné sur mysql-server-5.5.
serverSentinel
Cela ne fonctionnera que si votre installation de mysql-server n'est pas en panne, comme cela pourrait arriver si l'utilisateur debian-sys-maint est manquant.
FKEinternet
19

Je voulais juste commenter, mais je pense que la syntaxe correcte mérite sa propre entrée. Cela créera l’utilisateur debian-sys-maint :

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

Si vous avez toujours le fichier /etc/mysql/debian.cnf, utilisez simplement le mot de passe qu'il contient.

N'hésitez pas à proposer une solution sécurisée plus paranoïaque .

d -_- b
la source
1
Il est aussi paranoïaque que nécessaire. Ensuite, seuls /etc/mysql/debian.cnfles rootutilisateurs Linux sont capables de lire le fichier . Et quand quelqu'un peut lire ce fichier, il a déjà rootaccès à la machine et peut arrêter le serveur MySQL et ajouter son propre administrateur système. De plus, le script qui démarre MySQL et d'autres packages ne peut effectuer aucune maintenance, ni aucune autre maintenance. Alors oui, il est aussi sécurisé que jamais. Et utile si vous perdez le mot de passe administrateur MySQL pour le récupérer, sans avoir à le redémarrer en mode non sécurisé. ;-)
Anders
C'est à quoi sert l'édition.
RobinJ
6

Si vous devez ajouter l' debian-sys-maintutilisateur uniquement à des logrotate.dfins spécifiques, vous ne devez pas accorder ALL PRIVILEGESou le GRANT OPTION- ceci est une faille de sécurité inutile. Au lieu de cela, vous pouvez simplement ajouter l'utilisateur avec le RELOADprivilège comme ceci (en supposant que vous accédez à votre base de données en tant que root, et que vous remplacez xxxxxx par votre mot de passe)

# 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;

Mise à jour 2019

Cette réponse est peut-être obsolète - veuillez vous reporter aux commentaires ci-dessous portant sur l'opinion

Mark Chackerian
la source
C’est la seule réponse sécurisée sur laquelle il n’accorde que les autorisations requises debian-sys-maint. En outre, je peux confirmer que cela fonctionne comme un charme. À votre santé!
Jealie
2
Est-ce vraiment un trou de sécurité? Si quelqu'un peut déjà lire /etc/mysql/debian.cnf, il est présumé qu'il a un accès root et peut redémarrer mysql avec --skip-grant-tables.
mc0e
Merci. Mais inutile de vider les choses deux fois, MySQL sait déjà ce que fait la commande GRANT. Voir dev.mysql.com/doc/refman/5.6/fr/privilege-changes.html
ygoe
1
Et cela ne fonctionnera pas, car l' debian-sys-maintutilisateur est également utilisé pour arrêter le serveur. Et aussi pour vérifier les utilisateurs root lors du démarrage du serveur mysql. Vous devez donc au moins accorder des privilèges de sélection sur mysql. * Et des privilèges d’arrêt.
Anders
1
NON NON NON, NE suivez PAS le conseil de cette réponse - vous devez accorder tous les privilèges à debian-sys-maint pour les raisons exposées dans l'autre réponse intitulée "autorisations requises pour debian-sys-maint". En bref, vous pouvez vous débrouiller au quotidien, mais rencontrer de graves problèmes lorsque vous appliquez une mise à jour de sécurité, un correctif ou une mise à niveau de votre système.
Kurt Fitzner
3

Au lieu de

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

je pense

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

parce que le mot de passe n'est pas haché ...?

Fortega
la source
3

autorisations requises par debian-sys-maint

Les autres réponses ont suffisamment traité de toutes les tâches, à l'exception de l'ensemble minimal d'autorisations requises pour l'utilisateur debian-sys-maint. Beaucoup de réponses ici sont simplement fausses à cet égard, et en fait dangereuses. Ne réduisez pas les privilèges debian-sys-maint (y compris l’option d’octroi) sans avoir lu et compris ce qui suit:

Le responsable Debian n’a pas donné tous les privilèges à l’utilisateur de manière capricieuse. Voici ce qui est requis, où et pourquoi. Certains de ces privilèges sont des sur-ensembles d'autres, mais je vais les énumérer de manière indépendante au cas où vous souhaiteriez personnaliser des éléments et en supprimer l'exigence:

  • arrêt et rechargement , nécessaires sans surprise, pour arrêter ou créer une base de données, effectués par /etc/init.d/mysql
  • sélectionnez sur mysql.user , requis pour les vérifications de sécurité effectuées au démarrage de la base de données, en veillant à ce qu'il y ait un utilisateur root. Fait chaque démarrage par / etc / mysql / debian-start (appelé par /etc/init.d/mysql) avec le code actuel dans la fonction check_root_accounts dans le fichier /usr/share/mysql/debian-start.inc.sh
  • sélectionnez sur information_schema.tables , sélection globale , requis pour la vérification des tables bloquées. Fait chaque démarrage avec / etc / mysql / debian-start (appelé par /etc/init.d/mysql) avec le code actuel dans la fonction check_for_crashed_tables du fichier /usr/share/mysql/debian-start.inc.sh
  • global tous les privilèges , nécessaires pour la mise à niveau des tables si / quand une nouvelle version de MySQL est installée via une mise à jour ou une mise à niveau de Debian. Fait chaque démarrage par / etc / mysql / debian-start (appelé par /etc/init.d/mysql) avec le code actuel dans la fonction upgrade_system_tables_if_necessary dans le fichier /usr/share/mysql/debian-start.inc.sh - appelle réellement le binaire MySQL mysql_upgrade - ne vous laissez pas berner par le nom de la fonction (upgrade_system_tables_if_necessary), cela peut potentiellement toucher toutes les tables - voir ci-dessous

La dernière est, bien sûr, la principale exigence en matière de privilèges. La page de manuel de mysql_upgrade indique que:

mysql_upgrade examine toutes les tables de toutes les bases de données pour y rechercher des incompatibilités avec la version actuelle de MySQL Server. mysql_upgrade met également à niveau les tables système afin que vous puissiez tirer parti des nouveaux privilèges ou fonctionnalités éventuellement ajoutés.

Si mysql_upgrade découvre qu'une table a une incompatibilité possible, il vérifie la table et, si des problèmes sont détectés, tente de réparer la table.

AVERTISSEMENT Si vous décidez de réduire les privilèges dont dispose debian-sys-maint, assurez-vous d’être prêt à gérer manuellement les futures mises à jour de sécurité et / ou mises à niveau de Debian qui touchent MySQL. Si vous effectuez une mise à jour sur les paquets MySQL avec un privilège réduit de debian-sys-maint, et si mysql_upgrade ne peut pas se terminer, il se peut que votre base de données reste dans un état indéfini (lecture interrompue). La réduction des privilèges peut ne pas poser de problèmes quotidiens apparents tant qu'une mise à jour n'est pas disponible, alors ne vous fiez pas au fait que vous avez déjà réduit les privilèges sans aucun effet dommageable pour fonder votre sécurité.

Kurt Fitzner
la source
Merci pour la réponse élaborée. Difficile de croire que cette question a presque 10 ans!
Joe Holloway
Cela devrait être l'une des premières choses que les gens lisent.
FKEinternet
2

En guise de remarque, jetez un coup d'œil à cet article de mysqlperformanceblog pour connaître les raisons pour lesquelles vous souhaitez peut-être désactiver les éléments spécifiques à Debian.

Jon Topper
la source
1
"Notez que cela ne devrait pas être un problème avec MySQL de Debian Lenny, car il est livré avec des scripts d'initialisation qui n'exécutent pas CHECK TABLE sur des tables autres que MYISAM." - à partir de la page liée
d -_- b
2

Lorsque vous utilisez MySQL 5.6+, je vous recommande d'utiliser la mysql_config_editorcommande pour créer une entrée pour l'utilisateur 'debian-sys-maint'@'localhost'à l'aide du mot de passe approprié, ce qui signifie qu'il n'est pas nécessaire que le mot de passe soit stocké en texte brut sur le serveur.

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

Ensuite, le fichier de configuration spécifique à Debian /etc/mysql/debian.cnfpeut être modifié afin que les informations de nom d’utilisateur et de mot de passe ne soient pas stockées dans le fichier.

Enfin, modifiez le fichier logrotate pour MySQL afin qu’il utilise les informations de connexion stockées dans le ~/.mylogin.cnffichier au lieu du fichier spécifique à Debian en remplaçant

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

avec

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

J'espère que cela t'aides :)

Dave

Dave Rix
la source
Mais, le but de l' debian-sys-maint utilisateur sera-t-il atteint? Que les paquets devraient pouvoir utiliser cet utilisateur / mot de passe pour faire une maintenance du système en tant rootqu'utilisateur dans le domaine Linux (pas un rootutilisateur dans MySQL sans que l'administrateur ait besoin d'entrer le rootmot de passe pour MySQL?
Anders
Cela fonctionne pour moi dans mes tests, si vous effectuez toutes les modifications, telles que modifier /etc/mysql/debian.cnfpour supprimer les mots de passe et modifier le fichier logrotate afin qu'il fasse référence à utiliser les détails sécurisés. Je ne sais pas si l'utilisateur debian-sys-maint est utilisé pour autre chose, mais si c'est le cas, cela aidera à vous indiquer où Debian utilise ce compte utilisateur en votre nom.
Dave Rix