在没有root密码的cron作业中使用mysqldump


14

如果我使用我的盒子上的root密码登录,则只需键入

mysqldump --all-databases,我将获得预期的“ Dump”。

我在cron.daily中设置了一个作业,以运行并将其转储到备份驱动器。我遇到的问题是,尽管用户以root身份运行,但仍收到以下消息

mysqldump:得到错误:1045:用户'root'@'localhost'的访问被拒绝(使用密码:NO)

尝试连接时。我不想在脚本中(谁会)硬编码mysql数据库根密码。

考虑到我可以在bash shell的命令行中键入“ mysqldump”,所以必须使用-u参数来解决。我在脚本顶部已经有#!/ bin / bash了。

我在这里想得到什么来不要求输入数据库的根密码吗?

Answers:


12

为了连接到mysql服务器,您必须提供凭据。您可以在配置文件中指定它们,通过命令行传递它们,或者直接创建不需要凭据的帐户。

当然,永远不要使用no-password选项,因为命令行用户不是很好,因为可以运行ps的任何人都可以看到命令行。

推荐的选项是创建一个带有证书的mysql配置文件,然后使用文件系统权限保护该文件,以便只有您的备份用户才能访问它。

当您以root身份交互登录时,能够登录mysql服务器似乎表明您没有设置root密码,或者您的脚本未找到配置文件。如果您有.my.cnf,则可能需要手动指向它。如果您的root帐户未设置密码,那么我强烈建议您解决此问题。

更新(2016-06-29)如果运行的是mysql 5.6.6或更高版本,则应查看mysql_config_editor工具,该工具可将凭据存储在加密文件中。感谢乔瓦尼向我提及这一点。


1
该方法仍需要使用纯文本格式的未加密密码才能在系统上使用。那就是我要避免的事情。
— Mech Software 2010年

>您没有设置root密码,或者您的脚本没有找到配置文件。作者明确指出,root用户有一个mysql密码,并且他试图访问数据库而不将其提供给mysqldump命令:“(使用密码:否)”。因此访问被拒绝错误。
— 神话2010年

1
作者@monomyth还指出,以root身份交互式登录时,无需密码即可登录。这告诉我有些不对劲。
— Zoredache

2
@Mech Software,试图保护自己免受root帐户的攻击没有多大意义。如果某人拥有root帐户,则只需重启mysql并完全绕过权限系统即可。
— Zoredache

1
我能够登录的原因是root帐户指定了具有600权限的.my.cnf,因此这就是Shell获得访问权限的方式。但是cron必须忽略该文件,因此我在这篇文章中使用了参数来指向它。
— Mech Software 2010年

3

不应通过默默无闻来实现安全性。如果您担心有人可以访问您的root帐户,则脚本中是否存储了root的mysql密码也没关系,因为您的所有数据都可以在mysql转储或数据库文件中使用。因此,真正的问题是您要保护什么?

如果您不希望其他人获得可以让他们更改数据库中数据的密码,则需要创建一个具有适当权限的用户。

如果您不希望任何本地帐户看到该mysql密码,则该脚本的root设置文件权限为0700,所有者为root。


1
我想我仍然不明白的是,如果我可以在没有密码输入的情况下(从根提示符下)键入mysqldump,为什么不能以相同的方式在cron作业中运行它。需要-p参数缺少的部分。我并不是想“模糊”密码,我只是不想输入密码。根登录本身的特定之处在于允许访问,那么为什么不能用cron复制它呢?
— Mech Software 2010年

如果看到可以使用相同的“ root”用户使用密码登录而不使用密码,则说明您的mysql数据库中可能有多个root用户。其中一些可能未设置密码。您可以从“ root” @“ localhost”中删除密码,但不仅cron将能够连接到您的数据库,而且任何拥有本地帐户的人都可以连接到您的数据库。这与在明文脚本中输入密码没有什么不同(或更糟)。
— monomyth 2010年

我认为关键是MechSoftware所做的事情是,以root用户身份本质上可以使您对数据库文件进行读取访问,并且它们未加密。因此,只要求root用户提供root MySQL口令才能漂亮地打印他们实际上已经可以访问的数据,这就是“通过模糊性实现安全性”。此外,权限是很容易陷入困境,例如,如果有人递归设置他们的目录,如果有一个符号链接文件等
— Septagram

2

您可以使用Shell,因为您有可以运行的Shell,即登录时,配置文件中的所有Shell脚本都可以运行。

Cron没有这样的奢侈品。以root用户身份登录时,它将使用默认的shell登录。这样可以防止任何人远程登录,但这也意味着没有运行自动登录脚本。

您可以为cron设置要在其下运行的外壳,编辑crontab并添加SHELL和HOME变量,例如。

SHELL=/bin/bash
HOME=/root

如果未设置这些选项,那么cron将使用/ etc / passwd中指定的shell和主目录运行(可能什么也不是,可能是/ bin / sh)。

如果要查看cron所运行的环境,请添加将env导出到文件的cron作业,例如:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

如果脚本是由超级用户运行的,则可以创建一个文件/root/.my.cnf,其权限为600,内容如下:

[client]
user = DBUSERNAME
password = DBPASSWORD

(当然,您可以在其中输入MySQL用户名和密码)。

如果以root身份运行,则任何mysql命令行工具都会自动读取该文件。不再需要在命令行上提供它。600权限可防止窥视。


1
我发现这是没有密码的情况下如何使用mysqldump的情况。因此,这解决了SHELL运作方式的神秘性,那么cron为什么不阅读它?
— Mech Software 2010年

1
从cron运行时,mysqldump可能无法找到.my.cnf文件。补救措施是添加一个mysqldump参数以显式读取.my.cnf文件中的选项,即--defaults-extra-file = / root / .my.cnf我从堆栈溢出的其他两个答案中学到了这一点。请参阅stackoverflow.com/a/602054/854680和stackoverflow.com/a/890554/854680
— MikeOnline 2015年

1

Cron调试起来可能非常令人沮丧。当执行cron作业时,它们没有像shell那样设置的环境。

cron提示:

  • 使用所有内容的完整路径-“ ECHO = / bin / echo”,等等:(在顶部定义变量以使其更容易)
  • 设置MAILTO,以便您从每个作业中收到一封电子邮件(或让这些作业将stderr / stdout重定向到文件)

如果您的root用户可以从Shell执行此操作,则cron应该可以执行此操作。确保您明确指定要在命令行上使用的配置文件。


0

尽管这些响应中的一些是有用的,但由于Unix根用户和mysql根用户并不相同,并且除了它们都使用登录名“ root”以外,它们基本上没有任何关系,因此令人困惑。也许这很明显,但似乎有些回应将两者混为一谈。

mysqld的一个有用选项(也许存在)是允许以unix root身份运行的客户端程序(例如mysql或mysqldump等)在没有密码的情况下访问mysqld的root @ localhost,而不必存储root @ localhost的(mysql)密码在my.cnf文件或类似文件中。

我知道这让您感到有些紧张,但原因是任何以本地(对于mysqld服务器)unix根目录运行的人都可以轻松地绕过mysqld的安全性。并拥有一个带有mysqld根密码7x24的my.cnf,甚至在运行中(例如,执行mysqldump)动态创建/删除一个带有mysqld根密码(该密码来自何处?)的my.cnf都使我感到紧张。

这将需要一些基础结构和思考,因为必须信任mysql / mysqldump / etc才能将其确实认为是由本地unix根帐户运行的消息传输到mysqld。

但是,例如,仅将其限制为mysqld的unix套接字(无TCP)可能会有所帮助,至少强烈建议使用此选项。那可能会确定客户端在本地运行,这可能还不够。但这可能是一个想法的开始。也许通过unix套接字发送文件描述符可能是另一段(如果听起来像疯话,那就用谷歌搜索)。

PS不,我不会在这里尝试集思广益,这些想法如何在非unix操作系统上运行,如果这个想法可能会转化为其他操作系统。


1
以/root/.my.cnf适当的权限放入凭据可以很好地解决此问题。
— 迈克尔·汉普顿

我不同意,现在任何可以访问该文件(包括通过其他系统漏洞进行访问)的人都具有mysql root pw。而且这里有24x7的系统需要受到攻击,并且位于固定的文件位置(因此,不必放在/ root目录中。)但是,例如,无论谁运行文件系统转储,或者可以访问其中一个,都可以将其拉出文件系统转储文件。在那种情况下,这听起来像是对不满的员工的一种诱惑。我认为这是一个合理的目标,在任何地方的系统上都不存在明文密码。
— 巴里·谢恩

也许是这样,但是您提出的建议要糟糕得多,因为它允许任何本地用户轻易地假装为root。
— 迈克尔·汉普顿

不,我的建议是,它们必须已经是本地服务器上的unix根,在这种情况下,本地mysqld信任以unix root身份运行的mysql或mysqldump等(客户端),并允许它们像已通过mysql root身份验证一样继续进行。正如我说的,如果它们已经是服务器本地的Unix root用户,则可以通过一些有据可查的命令来绕过mysql root密码(“ mysql root密码恢复”)。
— 巴里·谢因
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.