¿Cómo se crea de forma segura una base de datos MySQL y un usuario a través de la línea de comandos?

2

Estoy creando una aplicación cuya funcionalidad incluye crear una base de datos y su usuario. Esto se logra así:

mysql -e "grant all on database.* to 'user'@'localhost' identified by '$PW';"

$PW es la contraseña que se utilizará. Este código se puede encontrar en un script de shell al que se llama cuando un usuario de la GUI hace clic en un botón específico. ¿Pero no es eso inseguro, ya que la contraseña se envía a través de la línea de comandos? ¿Cómo puedo asegurar mejor mi aplicación?

    
pregunta Marcus McLean 06.01.2016 - 22:53
fuente

3 respuestas

1
  

Pero no es eso inseguro,

No hay una escala absoluta de "seguro", de hecho, ni siquiera es un vector o propiedad escalar. (IT) La seguridad consiste en garantizar que su tecnología no haga las cosas que no pretende hacer, mientras continúa haciendo las cosas que debería. Esta es una manera muy larga de decir que debería habernos dicho cuál es el modelo de amenaza.

Dejando a un lado las muchas preguntas sobre cómo su aplicación persiste la contraseña y si necesita una contraseña y el hecho de que su método depende de que el usuario root no tenga una contraseña ...

Su método actual expondrá la contraseña (brevemente) a otros usuarios a través de 'ps' en Unix / Linux (y probablemente algo similar en MSWindows - no nos dijo en qué sistema operativo se encuentra, pero la etiqueta 'bash' tipo de implica Unix / Linux). Y si se ejecutó directamente en la línea de comandos, estará presente en los registros de auditoría y en su historial de shell, aunque usted dijo que esto estaba en un script. Hay una ruta potencial y las explotaciones de alias que un tercero podría usar (si tienen acceso) para subvertir el comportamiento, aunque está empezando a ser un poco esotérico.

Entonces, considerando solo el problema descrito de forma aislada y restringido por las únicas herramientas disponibles que son bash, entonces:

echo "grant all on database.* to 'user'@'localhost' identified by '$PW';" | mysql

es ligeramente mejor (de forma predeterminada, echo es una función bash incorporada y, por lo tanto, no inicia un nuevo proceso con una línea de comandos).

    
respondido por el symcbean 01.08.2018 - 14:04
fuente
0

Es de suponer que puede crear un archivo en el sistema de archivos temporalmente, en cuyo caso, coloque grant all on ... by '$PW'; dentro de un archivo legible solo por su usuario de proceso y llame a mysql ejecutando un script de una de las siguientes formas:

mysql yourDBHere < yourScript.sql

mysql yourDBHere -e "source yourScript.sql"

Asegúrese de limpiar (eliminar el script) una vez que haya terminado.

    
respondido por el Andrew Philips 07.01.2016 - 00:01
fuente
0

No digo que esto sea perfecto, pero algo que formé como parte de un script que escribí para hacer una copia de seguridad / restaurar Wordpress (incluida la base de datos) enlace aquí :

#---------------------------------------------------------------------------------------
# Install MySQL and Dependencies
#---------------------------------------------------------------------------------------
echo -e "\n\n######### Installing mysql Server #########\n\n"
echo "INFO: Installing mysql-server"
sudo -E apt-get -q -y install mysql-server >>$LOGFILE  #non-interactive mysql installation

#Some security cleaning up on mysql-----------------------------------------------------
sudo mysql -u root -e "DELETE FROM mysql.user WHERE User='';"
echo "INFO: Setting password for root user to $DBPASS"
sudo mysql -u root -e "UPDATE mysql.user SET authentication_string=PASSWORD('$DBPASS') WHERE User='root';"
sudo mysql -u root -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
sudo mysql -u root -e "DROP DATABASE IF EXISTS test;"
sudo mysql -u root -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';"
sudo mysql -u root -e "FLUSH PRIVILEGES;"

#Create DB for Wordpress with user------------------------------------------------------
echo "INFO: Creating Database with name $WPDBNAME"
sudo mysql -u root -e "CREATE DATABASE IF NOT EXISTS $WPDBNAME;"
echo "INFO: Granting Permission to $WPDBUSER with password: $WPDBPASS"
sudo mysql -u root -e "GRANT ALL ON *.* TO '$WPDBUSER'@'localhost' IDENTIFIED BY '$WPDBPASS';"
sudo mysql -u root -e "FLUSH PRIVILEGES;"

#Setup permission for my.cnf propery----------------------------------------------------
sudo chmod 644 /etc/mysql/my.cnf
    
respondido por el keithRozario 03.04.2018 - 10:09
fuente

Lea otras preguntas en las etiquetas