canalizando una contraseña y seguridad

11

A veces lo hago echo "secret" | mysql -u root -p .... Ahora estoy convencido de la seguridad aquí: ¿puede alguien que enumere todos los procesos ver la contraseña?

Para verificar lo intenté con echo "test" | sleep 1000y el comando echo con el secreto no era visible en la salida de "ps aux". Entonces supongo que es seguro, pero ¿puede un experto en seguridad confirmarlo por favor? :)

gucki
fuente
No se puede ver en una lista de procesos cuando se ejecuta un bucle sin fin. Buena pregunta.
Tim
1
Además, no olvide que lo que escriba en la mayoría de los shells se almacenará en un archivo de historial en algún lugar (como .history).
Alexander Bird

Respuestas:

13

La respuesta a esto depende de qué shell está utilizando. Muchos shells tienen echocomo comando incorporado lo que significa que no genera un proceso separado y, por lo tanto, no aparecerá en una lista de procesos. Sin embargo, si escribe /bin/echoo ./echodeshabilita los componentes integrados con el enable -n echocomando, el shell no utilizará su comando integrado y utilizará la versión binaria en su lugar. Esto aparecerá en una lista de procesos.

Si está utilizando el binario en lugar del shell incorporado, el comando echo aparecerá durante el tiempo que sea necesario para mover los datos al búfer STDIN del otro proceso. Este búfer tiene un tamaño finito, por lo que si hay más datos de los que caben en el búfer, el comando echo tendrá que esperar un tiempo hasta que el otro proceso pueda leer algunos de los datos del búfer. Para la mayoría de los casos (como los dos ejemplos que dio anteriormente) este período de tiempo será de microsegundos. Si está pegando un volcado de SQL de 20 MB en MySQL usando echo, esto podría ser más largo. No importa cuán corto sea el tiempo, si está utilizando el binario en lugar del shell incorporado y alguien obtiene el momento justo, podrá ver el proceso en la lista de procesos.

Puede evitar esto colocando los datos secretos en un archivo (con los permisos adecuados) y utilizando el archivo como STDIN de esta manera:

mysql -u root -p < file_with_secret.sql
Ladadadada
fuente
55
Tenga en cuenta que al escribir la contraseña en la línea de comando de esa manera, lo más probable es que se guarde en el archivo de historial de su shell, por lo que vale la pena verificar el contenido y los permisos del archivo de historial.
aculich
3

Para el caso mysql ~ / .my.cnf se puede usar para almacenar secretos, es decir

[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER

[mysql]
database = DBNAME
cada vez más sabio
fuente
1

Solo usa

mysql -uroot -p

y pulsa enter. Luego se le pedirá la contraseña y no será visible ni en la lista de procesos ni en los archivos del historial.

jdw
fuente
Los datos aceptados en STDIN por MySQL son los comandos que se ejecutarán una vez que haya iniciado sesión. El "secreto" en la pregunta no es la contraseña.
Ladadadada