Utilizzo di mysqldump nel processo cron senza password di root


14

Se accedo con la password di root sulla mia casella, posso semplicemente digitare

mysqldump --all-database e otterrò l'atteso "Dump".

Ho impostato un lavoro in cron.daily per eseguirlo e scaricarlo su un'unità di backup. Il problema che ho è che sebbene l'utente stia eseguendo come root ricevo il seguente messaggio

mysqldump: errore ottenuto: 1045: accesso negato per l'utente 'root' @ 'localhost' (utilizzando la password: NO)

quando si tenta di connettersi. Io non voglio codificare la password di root database mysql nello script (che sarebbe).

Considerando che posso semplicemente digitare "mysqldump" nella riga di comando nella mia shell bash ci deve essere un modo per aggirare usando il parametro -u. Ho già #! / Bin / bash nella parte superiore dello script.

Cosa mi manca qui per ottenere questo per non chiedere la password di root al database?

Risposte:


12

Per connettersi al server mysql è necessario fornire le credenziali. Puoi specificarli in un file di configurazione, passarli tramite la riga di comando o semplicemente creare un account che non richiede credenziali.

Ovviamente l'opzione senza password non dovrebbe mai essere utilizzata, la riga di comando pass-by non è eccezionale perché chiunque può eseguire ps potrebbe essere in grado di vedere la riga di comando.

L'opzione consigliata è quella di creare un file di configurazione mysql con le credenziali al suo interno e quindi proteggere quel file con le autorizzazioni del filesystem in modo che solo l'utente di backup possa accedervi.

La possibilità di accedere al server mysql durante l'accesso interattivo come root sembra suggerire che non si dispone di una password di root impostata o che si dispone di un file di configurazione che non viene trovato dallo script. Se si dispone di un file .my.cnf, potrebbe essere necessario puntarlo manualmente. Se il tuo account di root non ha una password impostata, ti consiglio vivamente di risolverlo.

Aggiornamento (29/06/2016) Se si esegue mysql 5.6.6 o versioni successive, è necessario esaminare lo strumento mysql_config_editor che consente di archiviare le credenziali in un file crittografato. Grazie a Giovanni per avermelo detto.


1
Tale metodo richiede ancora una password non crittografata in testo normale per trovarsi nel sistema. Questo è ciò che sto cercando di evitare.
Mech Software

> o non hai impostato una password di root o che hai un file di configurazione che non è stato trovato dal tuo script. L'autore afferma chiaramente che esiste una password mysql per root e che sta provando ad accedere al database senza fornirlo al comando mysqldump: "(usando la password: NO)". Quindi accesso negato errore.
monomyth

1
@monomyth, l'autore afferma anche che può accedere senza password mentre è connesso interattivamente come root. Questo mi dice che qualcosa non va.
Zoredache,

2
Software @Mech, non ha molto senso cercare di proteggerti dall'account di root. Se qualcuno ha l'account root, potrebbe semplicemente riavviare mysql e bypassare completamente il sistema di autorizzazione.
Zoredache,

1
Il motivo per cui sono stato in grado di accedere era che l'account root aveva un .my.cnf specificato con 600 autorizzazioni, quindi è così che la shell stava ottenendo l'accesso. cron, tuttavia, deve ignorare il file, quindi ho usato il parametro in questo post per puntarlo.
Mech Software

3

La sicurezza non dovrebbe essere fatta attraverso l'oscurità. Se hai paura che qualcuno abbia accesso al tuo account root, non importa se la password mysql di root è memorizzata nello script, poiché hai tutti i tuoi dati disponibili in dump mysql o file di database. Quindi, la vera domanda è: cosa stai cercando di proteggere?

Se non si desidera che altri ottengano una password che consentirà loro di modificare i dati nel database, è necessario creare un utente con le autorizzazioni appropriate .

Se non si desidera che la password mysql venga visualizzata da alcun account locale, ad eccezione delle autorizzazioni per i file di root impostati su quello script, sia 0700 e il proprietario su root.


1
Immagino che ciò che ancora non capisco è che se riesco a digitare (dal prompt di root) mysqldump senza input di password, perché non riesco a eseguirlo attraverso il processo cron allo stesso modo. Quale pezzo manca che richiede il parametro -p. Non sto cercando di "oscurare" la password, preferirei non inserirla mai. Qualcosa di particolare al login root stesso è consentire l'accesso, quindi perché non può essere replicato con cron?
Mech Software

Se vedi che puoi accedere senza una password e con una password usando lo stesso utente "root", è possibile che ci siano più utenti root nel tuo database mysql. Alcuni di essi potrebbero non avere la password impostata. Puoi rimuovere la password da 'root' @ 'localhost', ma non solo cron sarà in grado di connettersi al tuo database, ma chiunque abbia un account locale. Questo non è diverso (o peggio) che avere una password in uno script di testo chiaro.
monomyth

Penso che il punto sia che MechSoftware stava affermando che essenzialmente essere root ti dà accesso in lettura ai file di database e non sono crittografati. Pertanto, richiedere la password di root MySQL da parte dell'utente root solo per stampare in modo grazioso i dati a cui essenzialmente può già accedere è "sicurezza attraverso l'oscurità". Inoltre, le autorizzazioni sono molto facili da incasinare, ad esempio se qualcuno le sta impostando in modo ricorsivo per una directory, se c'è un collegamento simbolico al file ecc.
Septagram

2

L'utilizzo della shell può farlo perché si dispone di una shell da cui eseguirla, ovvero quando si accede, vengono eseguiti tutti gli script della shell nel profilo.

Cron non ha tali lussi. Quando accede (come root) accederà con una shell predefinita. Ciò impedisce a chiunque di accedere in remoto, ma significa anche che non sono stati eseguiti script di accesso automatico.

È possibile impostare una shell in cui eseguire cron, modificare il crontab e aggiungere le variabili SHELL e HOME, ad es.

SHELL=/bin/bash
HOME=/root

se questi non sono impostati, cron verrà eseguito con la shell e la directory home specificate in / etc / passwd (che probabilmente non sono nulla, possibilmente / bin / sh).

Se vuoi vedere l'ambiente in cui cron è in esecuzione, aggiungi un processo cron che esporta env in un file, ad esempio:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

Se lo script viene eseguito da root, è possibile creare un file /root/.my.cnf con autorizzazioni 600 e il seguente contenuto:

[client]
user = DBUSERNAME
password = DBPASSWORD

(dove inserisci il tuo nome utente e password MySQL ovviamente).

Questo file verrà automaticamente letto da qualsiasi strumento da riga di comando mysql, se viene eseguito come root. Non è più necessario fornirlo sulla riga di comando. Le 600 autorizzazioni lo proteggono da occhi indiscreti.


1
Ho scoperto che questo era il caso di COME sono stato in grado di farci mysqldump senza la password. Quindi questo ha risolto il mistero di come lo sta facendo SHELL, quindi perché cron non lo legge?
Mech Software

1
mysqldump quando eseguito da cron potrebbe non essere in grado di individuare il file .my.cnf. Il rimedio è aggiungere un parametro mysqldump per leggere esplicitamente le opzioni nel file.my.cnf, cioè --defaults-extra-file = / root / .my.cnf L'ho imparato da altre due risposte su Stack Overflow. Vedere stackoverflow.com/a/602054/854680 e stackoverflow.com/a/890554/854680
MikeOnline

1

Cron può essere molto frustrante per il debug. Quando i lavori cron vengono eseguiti, non hanno un ambiente impostato come da te dato per scontato con una shell.

Suggerimenti per cron:

  • usa percorsi completi per tutto - "ECHO = / bin / echo", ecc: (definisci le variabili in alto per renderlo più facile)
  • impostare MAILTO, in modo da ricevere un'e-mail da ciascun lavoro (o fare in modo che i lavori reindirizzino stderr / stdout su un file)

Se l'utente root può farlo dalla shell, cron dovrebbe essere in grado di farlo. Assicurati di specificare esplicitamente il file di configurazione da utilizzare nella riga di comando.


0

Sebbene molte di queste risposte siano utili, molte sono confuse perché l'utente root unix e l'utente root mysql non sono uguali e fondamentalmente non hanno relazioni diverse da quelle che usano entrambi il nome di accesso 'root'. Forse è ovvio, ma sembra che alcune risposte confondano i due.

Quale potrebbe essere un'opzione utile (forse esiste?) A mysqld sarebbe quella di consentire a programmi client come mysql o mysqldump ecc. In esecuzione come root unix di accedere a root @ localhost di mysqld senza password senza dover memorizzare la password di root @ localhost (mysql) in un file my.cnf o simile.

So che rende nervoso, ma il ragionamento è che chiunque esegua come root unix locale (al server mysqld) può aggirare la sicurezza di mysqld comunque, abbastanza facilmente. E avere un my.cnf con la password di root mysqld 7x24 o persino creare / eliminare un my.cnf con la password di root mysql (da dove viene quella password?) Al volo (ad esempio, per fare un mysqldump) mi rende nervoso.

Richiederebbe qualche infrastruttura e pensiero perché si dovrebbe fidare di mysql / mysqldump / etc per trasmettere a mysqld che crede davvero che sia gestito da un account root unix locale.

Ma per esempio limitare al solo socket unix di mysqld, nessun TCP, potrebbe aiutare, almeno come opzione fortemente raccomandata di questa opzione. Ciò potrebbe stabilire che il client è in esecuzione localmente anche se probabilmente non è abbastanza. Ma potrebbe essere l'inizio di un'idea. Forse l'invio di un descrittore di file su un socket unix potrebbe essere un altro pezzo (cercalo su Google se sembra un discorso folle).

PS No, non ho intenzione di fare un brainstorming proprio qui su come qualcosa di tutto ciò potrebbe funzionare su un sistema operativo non unix, anche se l'idea si traduce probabilmente in altri sistemi operativi.


1
Inserendo le credenziali /root/.my.cnfcon le autorizzazioni appropriate si risolve ordinatamente il problema.
Michael Hampton

Non sono d'accordo, ora chiunque sia in grado di accedere a quel file, anche tramite qualche altro difetto del sistema, ha il mysql root pw. Ed è lì per essere attaccato 24x7, e in una posizione di file fissa (anche se, certamente, non dovrebbe essere in / root.) Ma per esempio chi esegue i dump del file system o può accedervi, può estrarlo da un file di dump del file system. In quel caso sembra una tentazione per un dipendente scontento. Penso che sia un obiettivo ragionevole che non esistano password in chiaro su un sistema, ovunque.
Barry Shein,

Forse è così, ma la proposta che hai fatto è molto peggio, dal momento che consente a qualsiasi utente locale di fingere banalmente di essere root.
Michael Hampton

No, la mia proposta era che dovevano già essere root unix sul server locale, nel qual caso il mysqld locale si fida che mysql o mysqldump ecc (client) vengano eseguiti come root unix e consente loro di procedere come se fossero autenticati come root mysql . Come ho detto, se sono già unix root locali sul server, possono in ogni caso bypassare la password di root mysql con alcuni comandi ben documentati ("ripristino della password di root mysql").
Barry Shein,
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.