在cron作业中运行mysql dump而不暴露密码


11

我要跑步

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

从事一项日常工作。我该如何安全地这样做?

我知道我可以将命令放在此处,但是任何有权访问该计算机的人都可以通过crontab立即看到它。有更好的方法吗?


1
您的示例不正确,它应该是-pP4SSw0rd,没有空格。
西蒙·伍德赛德

Answers:


14

如中所述man mysqldump:参见6.1.2.1。MySQL参考手册中的《最终用户密码安全准则》

选项文件是最安全的选择,尤其是根据上述参考。在crontab中以纯文本形式提供它不是很好,这尤其是因为默认情况下ps其他用户可以通过该进程命令行看到它。实际上,这也适用于参考资料中所述的环境变量。

MySQL参考手册的相关部分:

将密码存储在选项文件中。例如,在Unix上,您可以在主目录中文件的[client]部分中列出密码.my.cnf

[client]
password=your_pass

为了确保密码安全,除了您自己之外,任何人都不能访问该文件。为此,请将文件访问模式设置为400600。例如:

shell> chmod 600 .my.cnf

要从命令行命名包含密码的特定选项文件,请使用--defaults-file=file_name选项,其中file_name是文件的完整路径名。例如:

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

4.2.3.3“使用选项文件”,更详细地讨论了选项文件。

另请参阅/programming//q/10725209


似乎ps命令使用一个x来混淆密码:ps:mysqldump -uroot -px xx mydb。我并不是说这是一个很好的保护(如果您键入作业,则密码以纯文本形式显示)。

4

以特定用户身份运行cronjob,并使用一些简单的Bash逻辑从存储在系统某处的纯文本文件中提取密码,该文件的权限仅允许用户(或组)访问它。

PASS=`cat /path/to/pwdfile`

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

因此,如果cronjob以用户'example'的身份运行,则文件的所有权应为“ example:example”,并且权限为0400。

您还可以使用用户级.my.cnf实现类似的功能。


1
read PASS < /path/to/pwdfile是做同一件事的惯用语言(可以说我猜是这样;superuser.com/q/323060/49184适用)。
丹尼尔·安德森

*“是一种习惯上更清洁的方式” ...编辑中丢失。
丹尼尔·安德森

甚至对Bash有了最基本的了解的人都应该能够看到那只猫的病情。:)
加勒特2012年

1
没错,我什至会说这是最常用的方法,但还是有点让人讨厌:-)。如果使UUOC成为一种习惯,则在文件大于时会咬人ARGMAX,这会花费额外的过程而不是使用内置的Shell,它可能会诱使诸如构造for i in `cat file`; do ...自己的问题之类的构造。但是,当然,大多数情况下:如果知道发生了什么,则可以自由选择。我不会在这里进行十字军东征,无论它看起来如何:-D。
丹尼尔·安德森

0

任何可以访问本机具有相同的访问级别/var/spool/cron/crontabs//var/lib/mysql你让他们有。因此,在目录上设置适当的权限并完成。具有root用户访问权限的任何人都可以直接直接访问数据库文件。您不信任的任何人都不能访问该计算机。

通常,人们只能通过看到自己的cronjob crontab -l


0

为了进行备份,请考虑在mysql中拥有一个只读用户,如下所示

CREATE USER bUser IDENTIFIED BY 'p4ss';

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

mysqldump只需要SELECTLOCK TABLES特权就可以完成它的工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.