在Puppet中,我将如何保护密码variables(在这种情况下是MySQL密码)?

我正在使用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 ? 目前,我从节点定义文件中删除了默认的世界可读权限,并通过ACL显式给出了puppet读取权限。

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

在使用Puppet和MySQL时,我倾向于将根密码放在/root/.my.cnf中,将该文件locking,然后将SSH访问限制在数据库服务器上。

是的,以明文forms将根密码存储在数据库服务器上并不是最安全的解决scheme。 但是,如果你在这个文件中写入mysql root密码,保护mysql root帐户只允许从本地主机login,那么密码将不会被保存在puppet中,而且还会出现在进程列表ps表中。

另外,如果某人有根访问权限来读取/root/.my.cnf文件,那么他们也可能访问到停止本地MySQL守护进程,并重新启动守护进程而无需用户表立即获得对数据库的根访问权限。

其他人可能会指出一些插件或类似的纠正我,但一般的方法去存储encryption的密码,而不是纯文本密码。

不过,我现在可以告诉你,MySQL不允许你使用encryption的密码 – 否则,这将是密码,哈希将允许你无论如何login。

有很多“黑客”,允许您使用第三方实用程序,如Hiera和GPG 。 显然,你可以自己推出 – 但是即使是Puppet自己的邮件列表也暗示了这种方法 。

您没有指定保护密码的人。 我将假定其他系统pipe理员或可能有权访问puppet master和/或客户端的开发人员,但不需要知道root密码。

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

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

这将允许您在您的木偶configuration中存储encryption的密码,而不是明文密码。

为了在命令行上使用mysqladminmysql客户端,我能想到的最好的办法就是将.my.cnf文件添加到您的puppetconfiguration中,并将其部署到适当的用户主目录中。 puppet master和客户端上的文件都应该有适当的,限制性的文件权限。

在将puppet添加到混合中(比如编写一个从客户端拉取文件的exec())时,这些文件权限有很多方法,但是与将密码存储在世界可读文件中相比,这似乎是一个改进。 如果你使用puppetconfiguration的版本控制系统,这将会更加困难。

这个链接提出了两个方法:使用环境variables和使用subshel​​l。

我想你也可以在命令mysqladmin周围创build一个简单的包装,并将encryption的密码传递给它。 这个包装器将解密密码并将其传递给mysqladmin 。 你需要保护你的包装,因为它包含解密部分。

您可以根据自己的环境select感觉更安全的方式,以及可以访问系统的人员。