我想跑
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
为了保证密码安全,除了您自己之外,任何人都不能访问该文件。为确保这一点,请将文件访问模式设置为
400
或600
。例如:shell> chmod 600 .my.cnf
要从命令行命名包含密码的特定选项文件,请使用选项
--defaults-file=file_name
,其中file_name
是文件的完整路径名。例如:shell> mysql --defaults-file=/home/francis/mysql-opts
部分4.2.3.3 “使用选项文件”,更详细地讨论了选项文件。
答案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仅需要SELECT
和LOCK TABLES
特权即可完成其工作。