Qual è un'alternativa sicura all'utilizzo di una password MySQL sulla riga di comando?


35

Abbiamo uno script da riga di comando PHP per la versione di un database. Eseguiamo questo script ogni volta che uno sviluppatore ha aggiunto una nuova patch di database.

Lo script esegue la patch con la riga di comando di MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

Tuttavia, MySQL 5.6 ora emette il seguente avviso:

Avvertenza: l'utilizzo di una password sull'interfaccia della riga di comando può essere insicuro

Il che è ovviamente vero, ma potrebbe o meno essere un problema per l'utente.

  • Qual è l' alternativa sicura allora?
  • In alternativa, è possibile disabilitare questo avviso?

Si prega di notare che non voglio fare affidamento su un file di password esterno.


2
Avere le tue credenziali in un file non è un grosso problema. Se una persona ha i privilegi di root sul tuo server, può bypassare completamente il sistema di autenticazione, semplicemente riavviando il server mysql con una particolare opzione.
Zoredache,

Questo non è lo stesso problema del duplicato suggerito . MySQL non richiede una password, la sto fornendo e funziona perfettamente. Sto cercando alternative per fornire la password, escluso un file di password.
Benjamin,

Risposte:


17

Nella recente versione GA di MySQL, ovvero versione 5.6 , è possibile farlo tramite il comando mysql_config_editor, come descritto in http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Fondamentalmente quello che fa è: crittografare l'utente / passare le credenziali con un alias host, quindi utilizzare l'alias host, inserire queste informazioni in un file di configurazione nella directory home e quindi, quando necessario, invece di fare qualcosa di simile :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

invece scrivi:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

evitando così di inserire la password in alcuni script in chiaro.

Perché questo funzioni, devi prima (solo una volta) definire myhostaliascome:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

Puoi utilizzare percorsi di accesso diversi per account e / o host diversi come preferisci. Bella idea se me lo chiedi.

Come nota, credo, questa funzionalità NON esiste in nessuna versione sotto la 5.6.


nota: mi rendo conto che mysql_config_editor in realtà crea un file di password esterno, tuttavia, questo non è fatto da te, è come funziona il sistema, quindi non c'è en / de / crypting manuale da fare da te.
Tuncay Göncüoğlu,

Grazie, sto usando MySQL 5.6, quindi questo non è un problema. Detto questo, il tuo approccio è ancora problematico (almeno con il modo in cui attualmente lavoriamo), perché voglio prendere la password da un file di configurazione PHP in tempo reale e passarla dinamicamente alla riga di comando. Con quello che mi suggerisci, dovrei comunque usare la password dalla riga di comando durante la chiamata mysql_config_editor, quindi purtroppo non porta molto più valore. Sto anche cercando di evitare che lo sviluppatore lo faccia manualmente, quindi devo mantenere sia il file di configurazione di PHP che la configurazione di mysql.
Benjamin

La mia migliore soluzione è probabilmente ignorare gli avvisi per ora. In realtà mi chiedo se c'è qualche problema di sicurezza: poiché è chiamato da PHP, immagino che la riga di comando non sia memorizzata nella cronologia di bash o in qualsiasi altra parte della macchina?
Benjamin,

non per quanto ne sappia, no, la storia di Bash non lo memorizza. tuttavia, la password in chiaro nel file di configurazione php comporta lo stesso identico rischio, solo in un'altra forma. forse preferirai archiviare la password usando mysql_config_editor e memorizzare il percorso di accesso nel tuo file di configurazione php? In questo modo non esporrai la tua password ovunque. (ma dovrà comunque mantenere la password esterna).
Tuncay Göncüoğlu,

9

Utilizzare l' opzione --defaults-fileo --defaults-extra-file. È possibile specificare l'ID utente e la password in esso. Ha lo stesso formato di /etc/my.cnf.

Leggendo ulteriormente, dici che non vuoi fare affidamento su un file di password esterno, ma questo è l'unico modo davvero sicuro. Qualsiasi altra cosa lascerà tracce nella tabella dei processi o qualcosa del genere. Puoi anche mettere il file della password nel controllo della versione se lo desideri davvero. Renderlo 600 (o 400) e leggibile solo da mysql o dall'utente con cui è in esecuzione.


1
Non sono contrario al file delle password per motivi di sicurezza, è solo che le credenziali di MySQL fanno parte di una configurazione globale nell'applicazione PHP (utilizzata anche per la connessione PDO), e fare ciò significherebbe creare un file di password (temporaneo) solo per il bene di eseguire la riga di comando mysql per la durata dello script (alcuni secondi).
Benjamin,

Come fare questo su Windows Server 2012? Dov'è il file di configurazione che contiene l'opzione --defaults-file?
Jake,

Devi solo specificare il file come opzione per --defaults-file come in:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@Benjamin, quindi se non si tratta di sicurezza, digita semplicemente la password nella riga di comando. Cosa c'è di sbagliato nel farlo (oltre alla sicurezza)?
Pacerier,

@Benjamin se stai già utilizzando MySQL da PHP, allora perché stai biforcando il mysqlclient della console?
Josip Rodin,

5

Hai 4 opzioni per http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Usare un -pyour_pass o--password=your_pass un'opzione sulla riga di comando
  • Usa il -p o--password opzione sulla riga comandi senza specificare un valore per la password. In questo caso, il programma client richiede la password in modo interattivo:
  • Memorizza la tua password in un file di opzioni.
  • Memorizza la tua password nella MYSQL_PWDvariabile d'ambiente

Per le tue esigenze, MYSQL_PWDpotrebbe essere un'opzione, ma non è più sicura. In realtà dovresti generare un processo interattivo con --passworde inviare la password in modo interattivo, ma questa è una soluzione abbastanza complessa per questo problema.


1
In che modo MYSQL_PWD sarebbe meno sicuro della riga di comando? La PW non compare mai nell'elenco dei processi, che sembra essere la preoccupazione principale
TheLQ

1
Certo che lo fa. man psha -E Display the environment as well. Dall'URL a cui mi sono collegato: questo metodo per specificare la password di MySQL deve essere considerato estremamente insicuro e non deve essere utilizzato. Alcune versioni di ps includono un'opzione per visualizzare l'ambiente dei processi in esecuzione. Su alcuni sistemi, se si imposta MYSQL_PWD, la password viene esposta a qualsiasi altro utente che esegue ps. Anche su sistemi senza tale versione di ps, non è saggio supporre che non ci siano altri metodi con cui gli utenti possono esaminare gli ambienti di processo.
RS

Raccogliendo da questa opzione MYSQL_PWD: suppongo che se imposti la variabile d'ambiente all'inizio di alcuni script, invochi la riga di comando di MySQL, quindi cancelli che in seguito alla fine dello script, potresti ridurre al minimo il tempo di esposizione . Sembra ragionevole?
superjos

@kormoc, si prega di approfondire l'ultimo paragrafo. Qual è la soluzione abbastanza complessa di cui stavi parlando?
Pacerier,

1
Sembra che l'utilizzo della variabile d'ambiente sia più sicuro della riga di comando. Su un sistema debian predefinito puoi fare pse vedere l'argomento della riga di comando per ogni processo di ogni utente. Ma ps emostra solo l'ambiente per i tuoi processi (a meno che tu non sia root, ovviamente). È solo leggermente più sicuro, ma è ancora più sicuro.
jlh

4

Se il tuo script PHP ha già una connessione al database aperta, perché non usi semplicemente mysqli_multi_query()per importare il file .sql? Se la sintassi del file .sql è valida, ovviamente ...


Non sono sicuro di quanto funzionerebbe con file .sql abbastanza grandi?
Benjamin,

1
@Benjamin Immagino non peggio di quanto farebbe il client MySQL - se sei davvero preoccupato per la sicurezza, anche se questo sarebbe il modo meno aggressivo per farlo, e la dimensione è un problema che puoi risolvere in diversi modi.
voretaq7,

Sai se è possibile con DOP?
Benjamin,

PDO non sembra avere una funzione equivalente per lanciare un sacco di query nel database tutte in una volta. Scusate. È stata un'idea ...
Michael Hampton
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.