Después de comprender el problema con el uso de una contraseña en la línea de comando , necesito encontrar una manera de alimentar un programa con una contraseña sin que sea un problema (sin que la contraseña se registre en alguna parte).
Tengo un script bash que instala automáticamente un servidor LAMP completo desde la fuente: Apache, FastCGI, PHP y MySQL. Estas instalaciones requieren una contraseña, especialmente MySQL.
¿Cómo puedo hacer que el script sea completamente automático sin revelar la contraseña?
Editar (9 de junio, 3:55 UTC):
estoy invocando mysql con una contraseña en la línea de comando, a través de 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" en nuestro caso) ¡
Y ejecuto a ps aux | grep mysql
través de mi usuario habitual (dor), que no me muestra la contraseña !
(Algunos de) ps
resultados son:
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
¿Como es eso posible?
fuente
Respuestas:
Con respecto a su actualización:
Cuando se inicia un proceso, tiene un área de memoria dedicada donde se almacenan los argumentos y un int que indica cuántos argumentos se pasaron.
MySQL verifica si la contraseña se pasó en la línea de comando
-p
y si se copió a una nueva variable que no es visible, luego sobrescriba esa región de memoria conx
'es.En términos simples, por ejemplo:
Puede encontrarlo, por ejemplo, en
client/mysqladmin.cc
el código fuente:Cuando se
ps
ejecuta, lee la región de memoria de los argumentos, (argv[N]
), y así esxxxx
.Por un tiempo muy corto la contraseña es visible, pero solo por unos pocos ciclos de CPU.
Puede actualizar la contraseña de MySQL utilizando la
--init-file
opción y el procedimiento especiales. C.5.4.1.2. Restablecer la contraseña de root: sistemas UnixEditar:
Como @Gilles decir, que pueda
echo
,printf
o el usohere
de documentos desde un script.También puede agregar esto a
.my.cnf
su directorio de inicio o en un archivo ( temporal ) y usar la--defaults-extra-file
opción. (Cree que debe agregar esa opción al principio de la línea de comando). Opcionalmente, también incluya user. También tenga en cuenta el extra en el nombre de la opción a menos que quiera usar solo ese archivo como configuración:Opcionalmente, la
[client]
agrupación hace que semysqld
omita la configuración.También se puede usar
MYSQL_PWD
la variable de entorno, pero eso nunca se debe usar, ya que puede enumerar el entorno, en muchasps
implementacionesps -e
, en el/proc/<PID>/environ
archivo en Linux, etc.Más sobre el tema aquí .
También es posible que desee echar un vistazo a la Utilidad de configuración de MySQL que le permite almacenar la contraseña en un archivo cifrado en su directorio de inicio
.mylogin.cnf
.fuente
mysql-init
archivo con la contraseña que se almacena en una variable bash? (sin ser revelado)echo 'password=p4ssw0rd' >>mysql.cnf
es seguro, ya queecho
está integrado, por lo que la contraseña no aparece en la línea de comandos de ningún proceso. Un documento aquí también es seguro.La solución típica es leer la contraseña de un archivo o de una entrada estándar (o de otro descriptor de archivo que debería pasarse como parámetro).
fuente
Algunos programas (línea de comando,
ftp
por ejemplo) leen contraseñas del/dev/tty
archivo especial por proceso que representa el TTY que controla el proceso. Esto permite que el programa no repita la contraseña en la pantalla y tenga un poco más de seguridad sobre el origen de la contraseña.fuente