Ejecutar mysql dump en un trabajo cron sin exponer contraseñas

11

quiero correr

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

en un trabajo cron. ¿Cómo puedo hacerlo de forma segura?

Sé que podría poner el comando allí mismo, pero cualquier persona con acceso a la máquina lo vería de inmediato a través de crontab. Hay una mejor manera de hacerlo?

slycat
fuente
1
Su ejemplo es incorrecto, debería ser -pP4SSw0rd sin espacio.
Simon Woodside

Respuestas:

14

Como se indica en man mysqldump: ver 6.1.2.1. Pautas para el usuario final para la seguridad de la contraseña en el manual de referencia de MySQL.

Un archivo de opciones es la apuesta más segura, no menos importante según la referencia anterior. Darlo en texto sin formato en crontab no es bueno, sobre todo porque la línea de comando del proceso por defecto es visible pspara otros usuarios. Lo mismo se aplica a las variables de entorno como se explica en la referencia.

Parte relevante del manual de referencia de MySQL:

Almacene su contraseña en un archivo de opciones. Por ejemplo, en Unix, puede enumerar su contraseña en la [client]sección del .my.cnfarchivo en su directorio de inicio:

[client]
password=your_pass

Para mantener la contraseña segura, el archivo no debe ser accesible para nadie más que para usted. Para garantizar esto, configure el modo de acceso a archivos en 400o 600. Por ejemplo:

shell> chmod 600 .my.cnf

Para nombrar desde la línea de comando un archivo de opción específico que contenga la contraseña, use la --defaults-file=file_nameopción, donde file_nameestá el nombre de ruta completo al archivo. Por ejemplo:

shell> mysql --defaults-file=/home/francis/mysql-opts

La Sección 4.2.3.3, “Uso de archivos de opciones” , trata los archivos de opciones con más detalle.

Consulte también /programming//q/10725209 .

Daniel Andersson
fuente
Parece que el comando ps ofusca la contraseña con una x: ps: mysqldump -uroot -px xx mydb. Sin embargo, no digo que sea una buena protección (si escribe trabajos, entonces la contraseña se revela en texto sin formato).
ling
4

Ejecute el cronjob como un usuario específico y use una lógica de Bash simple para extraer la contraseña de un archivo de texto sin formato almacenado en algún lugar del sistema con permisos que solo permitan que el usuario (o quizás el grupo) acceda a él.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Entonces, si el cronjob se ejecuta como 'ejemplo' del usuario, la propiedad del archivo debe ser "ejemplo: ejemplo" y con permiso 0400.

También puede lograr una función similar utilizando un nivel de usuario .my.cnf .

Garrett
fuente
1
read PASS < /path/to/pwdfilees un idiomáticamente más limpio para hacer lo mismo (podría decirse que supongo; se aplica superuser.com/q/323060/49184 ).
Daniel Andersson el
* "es UNA MANERA idiomáticamente más limpia" ... Perdido en la edición.
Daniel Andersson
Alguien con la comprensión más básica de Bash debería poder ver qué está pasando con ese gato. :)
Garrett
1
Es cierto, incluso diría que es la forma más común de hacerlo, pero sigue siendo un poco molesto :-). Si uno hace que UUOC sea un hábito, morderá cuando el archivo sea más grande que ARGMAX, requiere un proceso adicional en lugar de usar un shell incorporado, podría tentar construcciones como for i in `cat file`; do ...con su propia gama de problemas, etc. Pero, por supuesto, como con la mayoría de las cosas: si uno sabe lo que está sucediendo, es libre de hacer lo que elija. No estoy en una cruzada aquí, independientemente de cómo pueda parecer :-D.
Daniel Andersson
0

Cualquier persona con acceso a la máquina tiene el mismo nivel de acceso /var/spool/cron/crontabs/que /var/lib/mysqlusted le permite. Por lo tanto, establezca los permisos adecuados en los directorios y listo. Cualquier persona con acceso raíz tiene acceso directo a los archivos de la base de datos directamente. Cualquier persona en la que no confíe para tener acceso a la máquina no debería tener acceso a la máquina.

Por lo general, la gente solo ve sus propios cronjobs a través de crontab -l.

akira
fuente
0

Para fines de copia de seguridad, considere tener un usuario de solo lectura en mysql, así

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldump requiere solo SELECTy LOCK TABLESprivilegios para hacer su trabajo.

Saptarshi Biswas
fuente