Cos'è l'utente MySQL debian-sys-maint (e altro)?


71

Sono stato morso più volte dall'utente 'debian-sys-maint' che è installato di default sui pacchetti mysql-server installati dai repository Ubuntu.

Generalmente ciò che accade è estrarre una nuova copia del nostro database di produzione (che non è in esecuzione su Debian / Ubuntu) per la risoluzione dei problemi o il nuovo sviluppo e dimentico di escludere la tabella mysql.user, perdendo così l'utente debian-sys-maint.

Se aggiungiamo nuovi utenti mysql per qualsiasi motivo, devo "unirli" nel mio ambiente di sviluppo piuttosto che sovrapporre la tabella.

Senza l'utente il mio sistema sembra ancora funzionante, ma afflitto da errori come:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • A cosa serve debian-sys-maint?
    • Esiste un modo migliore per i manutentori del pacchetto di fare ciò che stanno cercando di fare?
  • Qual è il modo più semplice per ripristinarlo dopo averlo perso?
  • Qual è il set di privilegi corretto / minimo per questo utente?
    • Sembra una cattiva idea di "concedere tutti i privilegi su *. * ..."

modificare

Domanda aggiuntiva - La password in /etc/mysql/debian.cnf è già stata hash o è questa la password in chiaro? È importante quando vai a ricreare l'utente e non mi sembra di averlo mai fatto al primo tentativo.

Grazie


8
La password è in chiaro in /etc/mysql/debian.cnf
Brent,

Risposte:


57

A cosa serve debian-sys-maint?

Una cosa importante per cui viene utilizzato è dire al server di eseguire il roll-log dei log. È necessario almeno il privilegio di ricaricare e spegnere.

Vedi il file /etc/logrotate.d/mysql-server

Viene utilizzato dallo /etc/init.d/mysqlscript per ottenere lo stato del server. Viene utilizzato per arrestare / ricaricare con garbo il server.

Ecco la citazione dal 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.

Qual è il modo più semplice per ripristinarlo dopo averlo perso?

Il miglior piano è semplicemente non perderlo. Se perdi davvero la password, ripristinala utilizzando un altro account. Se hai perso tutti i privilegi di amministratore sul server mysql segui le guide per reimpostare la password di root, quindi ripara il file debian-sys-maint.

È possibile utilizzare un comando come questo per creare un file SQL che è possibile utilizzare in seguito per ricreare l'account.

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

La password in /etc/mysql/debian.cnf è già stata sottoposta a hash

La password non viene hash / crittografata quando installata, ma le nuove versioni di mysql ora hanno un modo per crittografare le credenziali (consultare: https://serverfault.com/a/750363 ).


1
"Il piano migliore è semplicemente non perderlo." Sul serio? Questo è un aiuto zero per le persone che l'hanno già perso, come apparentemente ho fatto durante un aggiornamento. Per coloro che hanno bisogno di ricreare l'utente, utilizzare una delle opzioni "CONCESSIONE TUTTO" nelle altre risposte, poiché questo utente NON viene utilizzato solo per le operazioni di logrotate, è una parte fondamentale del processo di aggiornamento.
FK Internet dal

Se perdi le credenziali, hai sempre la possibilità di avviare il demone mysql / mariadb con l'opzione che salta il sistema di autorizzazioni o accedere come un altro utente con i privilegi di root mysql e reimpostare la password. Il ripristino delle password e il bypass del sistema dei privilegi sono ben documentati in altre posizioni su Google e in altre domande su questo sito.
Zoredache,

22

L'utente debian-sys-maint è di default un equivalente root . È usato da alcuni script di manutenzione sui sistemi Debian e, come effetto collaterale, consente agli utenti con accesso root sulla scatola di visualizzare la password in chiaro in /etc/mysql/debian.cnf (buono o cattivo?)

Puoi ricreare l'utente come segue:

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

Assicurati solo che la password corrisponda a quella in /etc/mysql/debian.cnf


9
Ri (buono o cattivo) - Se qualcuno riesce a diventare root, può bypassare del tutto il sistema dei privilegi semplicemente riavviando il server con le opzioni corrette. Se un utente malintenzionato ottiene il root, probabilmente hai problemi più grandi di quel file di configurazione.
Zoredache,

2
anche re: buono o cattivo - ho dovuto fare affidamento sull'accesso debian-sys-maint per reimpostare la password dell'account root MySQL quando era stata dimenticata. È stato bello avere questa opzione di fallback.
Brent,

1
@Brent: consultare dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html per come reimpostare la password di root di mysql. Ho disabilitato questo utente su molte installazioni mysql su Debian in quanto può causare il caos all'avvio con il controllo delle tabelle se sono tabelle di grandi dimensioni.
Nathan,

1
Nathan, grazie per quel link. Sono nuove informazioni per me. Se hai una procedura per disabilitare del tutto l'account debian-sys-maint, perché non includerlo qui come risposta separata. Sarebbe grandioso!
Brent,

3
una migliore concessione sarebbe solo per dare i privilegi di arresto / avvio.
jmtd,

19

Potresti anche:

sudo dpkg-reconfigure mysql-server-5.0

Che ti darà la possibilità di ricreare l'utente debian-sys-maint. Utenti e database esistenti sono al sicuro.


Questo ha funzionato anche su mysql-server-5.5.
serverSentinel,

Funzionerà solo se l'installazione di mysql-server non viene interrotta, come potrebbe accadere se mancasse l'utente debian-sys-maint.
FK Internet dal

19

Volevo solo commentare, ma penso che la sintassi corretta meriti la sua voce. Questo creerà l'utente debian-sys-maint :

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

Se hai ancora il file /etc/mysql/debian.cnf, usa la password lì dentro.

Sentiti libero di trovare una soluzione sicura più paranoica .


1
È paranoico quanto deve essere. Quindi solo uno che dovrebbe essere in grado di leggere il file /etc/mysql/debian.cnffile è l' rootutente Linux . E quando qualcuno può leggere quel file, ha già rootaccesso alla macchina e può arrestare il server MySQL e aggiungere un proprio amministratore di sistema. E lo script che avvia MySQL e altri pacchetti non può eseguire la manutenzione della sicurezza e altri tipi di manutenzione. Quindi sì, è sicuro come non mai. E utile se perdi la password dell'amministratore di MySQL per recuperarla, senza la necessità di riavviarla in modalità non sicura. ;-)
Anders,

Ecco a cosa serve la modifica.
RobinJ,

6

Se è necessario aggiungere l' debian-sys-maintutente solo per logrotate.dscopi, si dovrebbe non concede ALL PRIVILEGESo GRANT OPTION- Si tratta di un buco inutile di sicurezza gigante. Invece, puoi semplicemente aggiungere l'utente con il RELOADprivilegio in questo modo (supponendo che stai accedendo al tuo db as roote che sostituisci xxxxxx con la tua password)

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

Aggiornamento 2019

Questa risposta potrebbe non essere aggiornata. Consulta i commenti fortemente motivati ​​di seguito.


Questa è l'unica risposta sicura che garantisce solo le autorizzazioni necessarie debian-sys-maint. Inoltre, posso confermare che funziona come un fascino. Saluti!
Jealie,

2
È davvero una falla di sicurezza? Se qualcuno può già leggere /etc/mysql/debian.cnf, presumibilmente hanno accesso come root e possono comunque riavviare mysql con --skip-grant-tables.
MC0e,

Grazie. Ma non c'è bisogno di svuotare le cose due volte, MySQL sa già cosa fa il comando GRANT. Vedi dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe

1
E questo non funzionerà, poiché l' debian-sys-maintutente viene utilizzato anche per arrestare il server. E anche per verificare la presenza di utenti root all'avvio del server mysql. Quindi devi almeno concedere i privilegi di selezione su mysql. * E i privilegi di spegnimento.
Anders,

1
NO NO NO, NON seguire i consigli di questa risposta - è necessario concedere tutti i privilegi a debian-sys-maint per i motivi indicati nell'altra risposta intitolata "autorizzazioni richieste debian-sys-maint". In breve, si può andare bene tutti i giorni ma si verificano gravi problemi quando si applica un aggiornamento di sicurezza, una patch o l'aggiornamento del sistema.
Kurt Fitzner,

3

Invece di

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

penso

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

perché la password non è cancellata ...?


3

debian-sys-maint autorizzazioni necessarie

Altre risposte hanno affrontato in modo sufficiente tutto tranne la serie minima di autorizzazioni richieste per l'utente debian-sys-maint. Molte delle risposte qui sono semplicemente sbagliate al riguardo, e in effetti pericolose. Non ridurre i privilegi di debian-sys-maint (inclusa l'opzione di concessione) senza leggere e comprendere di seguito:

Il manutentore Debian non ha dato tutti i privilegi all'utente in modo capriccioso. Ecco cosa è richiesto, dove e perché. Alcuni di questi privilegi sono superset di altri, ma li elencherò in modo indipendente nel caso in cui si desideri personalizzare le cose e rimuovere i requisiti per esse:

  • spegnimento e ricarica , richiesto abbastanza sorprendente, per chiudere o fare un database, fatto da /etc/init.d/mysql
  • selezionare su mysql.user , necessario per i controlli di integrità eseguiti all'avvio del database, assicurandosi che sia presente un utente root. Fatto ogni avvio da / etc / mysql / debian-start (chiamato da /etc/init.d/mysql) con il codice effettivo nella funzione check_root_accounts nel file /usr/share/mysql/debian-start.inc.sh
  • selezionare su information_schema.tables , selezione globale , necessario per verificare la presenza di tabelle bloccate. Fatto ogni avvio da / etc / mysql / debian-start (chiamato da /etc/init.d/mysql) con il codice effettivo nella funzione check_for_crashed_tables nel file /usr/share/mysql/debian-start.inc.sh
  • tutti i privilegi globali , necessari per aggiornare le tabelle se / quando viene installata una nuova versione di MySQL tramite un aggiornamento o un aggiornamento Debian. Fatto ogni avvio da / etc / mysql / debian-start (chiamato da /etc/init.d/mysql) con il codice effettivo nella funzione upgrade_system_tables_if_necessario nel file /usr/share/mysql/debian-start.inc.sh - chiama effettivamente il binario MySQL mysql_upgrade - non lasciarti ingannare dal nome della funzione (upgrade_system_tables_if_necessary), questo può potenzialmente toccare tutte le tabelle - vedi sotto

L'ultimo è, ovviamente, il principale requisito per i privilegi. La pagina man di mysql_upgrade afferma che:

mysql_upgrade esamina tutte le tabelle in tutti i database per incompatibilità con la versione corrente di MySQL Server. mysql_upgrade aggiorna anche le tabelle di sistema in modo da poter sfruttare i nuovi privilegi o funzionalità che potrebbero essere stati aggiunti.

Se mysql_upgrade rileva che una tabella presenta una possibile incompatibilità, esegue un controllo della tabella e, se vengono rilevati problemi, tenta una riparazione della tabella.

ATTENZIONE Se decidi di ridurre i privilegi di debian-sys-maint, assicurati di essere pronto a gestire manualmente eventuali futuri aggiornamenti di sicurezza debian e / o upgrade che tocchino MySQL. Se si esegue un aggiornamento sui pacchetti MySQL con un privilegio debian-sys-maint ridotto e, di conseguenza, se mysql_upgrade non può essere completato, il database potrebbe rimanere in uno stato indefinito (letto non funzionante). La riduzione dei privilegi potrebbe non avere alcun apparente problema quotidiano fino a quando non arriva un aggiornamento, quindi non andare dal fatto che hai già ridotto i privilegi senza effetti dannosi come base per pensare che sia sicuro.


Grazie per la risposta elaborata. Difficile credere che questa domanda abbia quasi 10 anni!
Joe Holloway,

Questa dovrebbe essere una delle prime cose che la gente legge.
FK Internet dal

2

Come nota a margine, dai un'occhiata a questo post di mysqlperformanceblog per motivi per cui potresti voler disabilitare le cose specifiche di debian.


1
"Nota che questo non dovrebbe essere un problema con MySQL di Debian Lenny, dato che viene fornito con script di init che non eseguiranno CHECK TABLE su tabelle non MYISAM." - dalla pagina collegata
d -_- b

2

Quando si utilizza MySQL 5.6+, si consiglia di utilizzare il mysql_config_editorcomando per creare una voce per l'utente 'debian-sys-maint'@'localhost'utilizzando la password pertinente, il che significa che la password non deve essere memorizzata in testo semplice sul server.

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

Successivamente, è /etc/mysql/debian.cnfpossibile modificare il file di configurazione specifico debian in modo che i dettagli di nome utente e password non vengano memorizzati nel file.

Infine, modifica il file logrotate per MySQL in modo che utilizzi i dettagli di accesso memorizzati nel ~/.mylogin.cnffile anziché il file specifico debian sostituendo

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

con

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

Spero che sia di aiuto :)

Dave


Ma lo scopo debian-sys-maint dell'utente sarà raggiunto da questo? Che i pacchetti dovrebbero essere in grado di usare questo utente / password per fare un po 'di manutenzione del sistema come rootutente nel dominio Linux (non rootutente in MySQL senza che l'amministratore debba inserire la rootpassword per MySQL?
Anders

Funziona per me nei miei test, se si eseguono tutte le modifiche, come ad esempio la modifica /etc/mysql/debian.cnfper rimuovere le password e modificare il file di logrotate per fare riferimento a per utilizzare i dettagli protetti. Non sono sicuro che l'utente debian-sys-maint sia usato per qualcos'altro, ma se lo è, questo ti aiuterà a indicare dove Debian sta usando questo account utente per tuo conto.
Dave Rix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.