Alimentazione sicura di un programma con una password


9

Dopo aver compreso il problema con l'uso di una password nella riga di comando , ho bisogno di trovare un modo per alimentare un programma con una password senza che sia un problema (senza che la password venga registrata da qualche parte).

Ho uno script bash che installa automaticamente un intero server LAMP dalla fonte: Apache, FastCGI, PHP e MySQL. Queste installazioni richiedono una password, in particolare MySQL.

Come posso rendere lo script completamente automatizzato senza rivelare la password?

Modifica (9 giugno, 3:55 UTC):
sto invocando mysql con una password dalla riga di comando, tramite root:

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(PASS = "p4ssw0rd" nel nostro caso)
Ed eseguo ps aux | grep mysqltramite il mio utente normale (dor), che non mi mostra la password !
(Alcuni di) psoutput è:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

Com'è possibile?


Vedi anche unix.stackexchange.com/q/385339/135943 , ma nota che questo non lo rende sicuro!
Carattere jolly

Risposte:


11

Per quanto riguarda il tuo aggiornamento:

All'avvio di un processo ha un'area di memoria dedicata in cui sono memorizzati gli argomenti e un int che indica quanti argomenti sono stati passati.

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQL controlla se la password è stata passata dalla riga di comando -pe se è stata copiata in una nuova variabile non visibile, quindi sovrascrivi quella regione di memoria con x'es.

In termini semplici, ad esempio:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

Puoi trovarlo ad es. Nel client/mysqladmin.cccodice sorgente:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

Quando pseseguito legge la regione di memoria degli argomenti, ( argv[N]), e quindi lo è xxxx.

Per un breve periodo la password è visibile, ma solo per alcuni cicli della CPU.


È possibile aggiornare la password MySQL utilizzando l' --init-fileopzione e la procedura speciali. C.5.4.1.2. Reimpostazione della password di root: Unix Systems

mysqld_safe --init-file=/home/me/mysql-init &

Modificare:

Come @Gilles dicono, è possibile echo,printf o l'uso heredel documento da uno script.

Puoi anche aggiungere questo alla .my.cnftua home directory o in un file ( temporaneo ) e usare l' --defaults-extra-fileopzione. (Credi di dover aggiungere questa opzione all'inizio della riga di comando.) Facoltativamente includere anche l'utente. Nota anche il extra nel nome dell'opzione a meno che tu non voglia usare solo quel file come configurazione:

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

Facoltativamente il [client]raggruppamento fa mysqldsaltare la configurazione.

Si può anche usare MYSQL_PWDla variabile d'ambiente, ma che non dovrebbe mai essere usata in quanto è possibile elencare l'ambiente, in molte psimplementazioni ps -e, nel /proc/<PID>/environfile su Linux ecc.

tr '\0' '\n' < /proc/<PID>/environ

Maggiori informazioni sull'argomento qui .

Potresti anche dare un'occhiata all'utilità di configurazione MySQL che ti consente di memorizzare la password in un file crittografato nella tua home directory - .mylogin.cnf.


C'è un modo per cambiare un token nel mysql-initfile con la password che è memorizzata in una variabile bash? (senza essere rivelato)
Dor

4
@Dor Qualcosa di simile echo 'password=p4ssw0rd' >>mysql.cnfè sicuro, perché echoè incorporato, quindi la password non appare sulla riga di comando di nessun processo. Un documento qui è anche sicuro.
Gilles 'SO- smetti di essere malvagio' il

4

La soluzione tipica è leggere la password da un file o dallo standard input (o da un altro descrittore di file che dovrebbe essere passato come parametro).


3

Alcuni programmi ( ftpad esempio la riga di comando ) leggono le password /dev/tty, il file speciale per processo che rappresenta il processo che controlla TTY. Ciò consente al programma di non ripetere l'eco della password sullo schermo e di avere un po 'più di sicurezza sulla provenienza della password.

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

echo $PASSWORD
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.