Mysqldump由cron启动和密码安全性
Mysqldump由cron启动和密码安全性
我编写了一个脚本来备份我的MySQL数据库,使用的命令是:
mysqldump --opt --all-databases -u user -pmypassword > myDump.sql
一个cron定时任务每晚会启动它,并将结果通过scp发送到另一台服务器。
mypassword
明文出现在我的脚本中,任何有适当权限的人都可以看到它。我还听说过/proc问题(可以看到运行的命令)。
MySQL文档中写道:
在命令行上指定密码应被视为不安全的。请参阅第7.6节,“保持密码安全”。
我在任何地方都没有找到这个神奇的第7.6节。
处理自动化mysqldump和密码安全的最佳实践是什么?
问题出现的原因是因为在使用mysqldump命令时,如果密码直接写在命令中,会导致密码暴露的风险。解决方法是将密码存储在一个选项文件中,并设置该文件的访问权限,以确保只有自己能够访问。
根据MySQL文档的建议,可以将密码存储在一个选项文件中,例如在Unix系统中的用户目录下的.my.cnf文件的[client]部分中添加以下内容:
[client]
password=your_pass
为了保证密码的安全性,该文件的访问权限应该设置为400或600,可以使用以下命令进行设置:
shell> chmod 600 .my.cnf
如果想要在命令行中指定包含密码的特定选项文件,可以使用`--defaults-file=file_name`选项,其中`file_name`是文件的完整路径名。
尝试上述方法后,需要等待几天以验证是否满足需求,一旦logrotate再次运行,就能知道是否成功。
不足之处是,这种方法会导致MySQL在执行命令后不再要求输入密码。实际上,我们只是希望在运行mysqldump命令时不暴露密码。
当使用`--defaults-file=file_name`选项时,必须从命令中删除`-p`标志。
这种方法将密码存储在明文文件中。更安全的方法是使用`mysql_config_editor`创建一个加密的登录路径。关于如何使用该方法,我在另一个答案中已经解释过了。
在这个问题中,出现了使用cron启动Mysqldump时存在的密码安全问题。解决方法是使用mysql_config_editor创建一个加密的登录路径,以便在不暴露密码的情况下使用mysqldump。
在问题中,接受的答案将密码存储在一个明文文件中,任何具有管理员(root)访问权限的人都可以读取该文件。如果您的数据库在共享托管环境中,这是不可取的。
更好的选择是使用mysql_config_editor创建一个名为mysqldump的加密登录路径。根据MySQL文档的说明,mysql_config_editor会加密.mylogin.cnf文件,以防止以明文形式读取,并且在客户端程序解密时,仅在内存中使用其内容。这样,密码可以以非明文格式存储在文件中,并在以后使用时无需在命令行或环境变量中公开。
以下命令将创建您的mysqldump登录路径:
mysql_config_editor set --login-path=mysqldump --host=your_hostname --user=your_username --password
您将被提示输入密码,并且您创建的登录路径将以加密格式存储。mysqldump在将来调用时将自动使用此登录路径,除非您使用--login-path命令行选项指定了一个不同的登录路径。
在创建加密登录路径后,您可以如下调用mysqldump:
mysqldump database_name > output_file
如果您需要备份具有不同用户名和密码的两个数据库,您可以使用另一个--login-path。例如,mysql_config_editor set --login_path=other_account
,然后在调用mysqldump时,只需调用另一个登录路径:mysqldump --login_path=other_account database_name > output_file
。
该解决方案可避免将密码以明文形式存储在文件中,提高了密码安全性。