sviluppo-web-qa.it

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

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 *. * ..."

Edit

Domanda aggiuntiva: la password in /etc/mysql/debian.cnf è già stata sottoposta a 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

69
Joe Holloway

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

È utilizzato da /etc/init.d/mysql script 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 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 (vedere: https://serverfault.com/a/75036 ).

58
Zoredache

L'utente debian-sys-maint è di default un equivalente radice. È 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;

Solo assicurati che la password corrisponda quello in /etc/mysql/debian.cnf

22
Brent

Volevo solo commentare, ma penso sintassi corretta merita 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 inventare di più paranoico soluzione sicura.

19
d-_-b

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.

19
Spoom

Se devi aggiungere il debian-sys-maint utente solo per logrotate.d scopi, dovresti non concedere ALL PRIVILEGES o il GRANT OPTION - questo è un buco di sicurezza gigante non necessario. Invece, puoi semplicemente aggiungere l'utente con il privilegio RELOAD in questo modo (supponendo che stai accedendo al tuo db come root e 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.

6
Mark Chackerian

debian-sys-maint autorizzazioni necessarie

Altre risposte hanno affrontato in modo sufficiente tutto tranne la serie minima di autorizzazioni necessarie 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:

  • shutdown e ricaricare, 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, assicurando la presenza di 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, necessario 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.

WARNING Se decidi di ridurre i privilegi di debian-sys-maint, assicurati di essere pronto a gestire manualmente eventuali futuri aggiornamenti di sicurezza di debian e/o aggiornamenti che toccano 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.

3
Kurt Fitzner

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
Sean

Quando si utilizza MySQL 5.6+, si consiglia di utilizzare mysql_config_editor comando 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, il file di configurazione specifico debian /etc/mysql/debian.cnf può essere modificato 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.cnf file anziché il file specifico debian sostituendolo

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

con

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

Spero che sia di aiuto :)

Dave

2
Dave Rix

Come nota a margine, dai un'occhiata a questo post sul blog delle performance di mysql per i motivi per cui potresti voler disabilitare le cose specifiche di debian.

2
Jon Topper