在 cron 任务中运行 mysql dump 而不暴露密码

在 cron 任务中运行 mysql dump 而不暴露密码

我想跑

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

在 cron 作业中。我该如何安全地执行此操作?

我知道我可以将命令放在那里,但任何有权访问该机器的人都会通过 crontab 立即看到它。有没有更好的方法?

答案1

如上所述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 “使用选项文件”,更详细地讨论了选项文件。

另请参阅https://stackoverflow.com/q/10725209

答案2

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

PASS=`cat /path/to/pwdfile`

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

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

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

答案3

任何有权访问该机器的人都拥有/var/spool/cron/crontabs//var/lib/mysql您允许他们拥有的相同级别的访问权限。因此,在目录上设置适当的权限即可。任何具有 root 访问权限的人都可以直接访问数据库文件。任何您不信任有权访问该机器的人都不应该访问该机器。

通常人们只能通过 查看自己的 cronjobs crontab -l

答案4

为了备份目的,请考虑使用只读mysql 中的用户,如下所示

CREATE USER bUser IDENTIFIED BY 'p4ss';

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

mysqldump仅需要SELECTLOCK TABLES特权即可完成其工作。

相关内容