在Puppet中,如何保护密码变量(在这种情况下为MySQL密码)?


13

我正在使用Puppet为MySQL提供参数化类:

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

我该如何保护$password?目前,我从节点定义文件中删除了默认的世界可读权限,并puppet通过ACL 显式赋予了读取权限。

我假设其他人也遇到过类似的情况,所以也许有更好的做法。

Answers:


3

在使用Puppet和MySQL时,我倾向于将root密码放在/root/.my.cnf中,将其锁定,然后限制对数据库服务器的SSH访问。

是的,将root密码以明文形式存储在db服务器上并不是最安全的解决方案。但是,如果您在该文件中写入mysql根密码,则保护mysql根帐户以仅允许从本地主机登录将使该密码不被伪造,也不会进入进程列表ps

另外,如果某人具有root权限来读取/root/.my.cnf上的文件,则他们也可能有权停止本地MySQL守护程序并在没有users表的情况下重新启动该守护程序,以获得对数据库的即时root访问权限。


2
如果在mysql 5.6及更高版本上,请使用mysql_config_editor。然后,至少密码将不是纯文本格式。
Kejau Touray

1

其他人可能会指出一些可以解决我问题的插件或类似工具,但通常的解决方法是存储加密密码,而不是纯文本密码。

但是,我现在可以告诉您,MySQL不允许您使用加密的密码-否则,将使用密码,并且哈希将允许您以任何方式登录。

周围有很多“黑客”,使您可以使用第三方工具,例如Hiera和GPG。显然,您可以自己动手,但即使Puppet自己的邮件列表也建议使用此方法


1

您未指定要保护谁的密码。我将假设是其他sysadmin或可能的开发人员可以访问人偶主机和/或客户端盒,而无需知道root密码。

要最初设置密码,可以使用以下语法:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

这样一来,您便可以在木偶配置中存储加密的密码,而不是使用纯文本密码。

对于在命令行上使用mysqladminmysql客户端,我能想到的最好的办法是将一个.my.cnf文件添加到您的人偶配置中,该文件将被部署到适当用户的主目录中。人偶主文件和客户端文件均应具有适当的限制性文件权限。

将人偶添加到混合文件中时,有许多方法可以解决这些文件权限(例如,编写从客户端拉出文件的exec()),但这似乎比将密码存储在世界可读文件中有所改善。如果对人偶配置使用版本控制系统,这将更加困难。


1
但是,如果有人检索了加密的密码,他们难道不能只使用加密的字符串登录吗?
Andrew M.

@Redmumba我的所有测试似乎都表明了这一点。也许我缺少Ladadadada可以阐述的东西。
Belmin Fernandez

3
不。当您使用IDENTIFIED BY PASSWORD '*HASH-HERE'而不是IDENTIFIED BY 'PASSWORD-HERE'MySQL时,将哈希直接插入user表中。然后,您必须使用生成该哈希的密码登录。通过正常登录并键入,您可以看到带有密码哈希的Grant命令的外观SHOW GRANTS;。您还可以通过SHOW GRANTS FOR user@host;
Ladadadada

嗯,我知道您不能使用哈希本身进行登录。但是,如果他有一个需要连接到数据库的客户端(例如,他的前端),那么他还需要一种存储加密密码的方式,这值得我们深思。
Andrew M.

0

该链接建议了两种方法:使用环境变量和使用subshel​​l。

我认为您还可以围绕命令创建一个简单的包装mysqladmin,并将加密的密码传递给它。然后,该包装器将解密密码并将其传递给mysqladmin。您需要保护包装程序,因为它包含解密部分。

您可以根据您的环境和有权访问您的系统的用户来选择更安全的方式。

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.