使用Puppetpipe理服务密码

我在Puppet中设置了我的Baculaconfiguration。 我想要做的一件事是确保每个密码字段是不同的。 我目前的想法是用主机名散列一个秘密值,以确保每个文件守护进程都有一个唯一的密码,并且该密码可以写入导向器configuration和文件服务器。 我绝对不希望使用一个通用密码,因为这可以让任何可能危害一台机器的人通过Bacula访问任何机器。

除了使用散列函数来生成密码之外,还有其他的方法吗?

澄清:

不是关于服务的用户帐户。 这是关于身份validation令牌(使用另一个术语)在客户端/服务器文件。 示例代码片段:

Director { # define myself Name = <%= hostname $>-dir QueryFile = "/etc/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 3 Password = "<%= somePasswordFunction =>" # Console password Messages = Daemon } 

我很满意我的解决scheme。 这是一个由puppet manifest的generate()函数调用的shell脚本。 生成每个主机的密码并根据需要存储在简单的文件中。

 #!/bin/bash # /etc/puppet/helpers/bacula/getpwd if [ "$#" -ne 1 ]; then echo "Usage: $0 <pwd_name>" exit 1 fi if [ ! -x /usr/bin/pwgen ]; then echo "missing pwgen!" >&2 exit 1 fi workdir="/etc/puppet/helpers/bacula/" workfile="$workdir/passwd" [ ! -r $workfile ] && exit 2 get_name="$1" # get password from storage pwd=$(awk -F: -v name="$get_name" ' BEGIN { r = "NOTFOUND" } name == $1 { r = $2 } END { printf "%s", r } ' "$workfile") if [ "$pwd" = "NOTFOUND" ]; then # generate new password & store it len=$((60 + $RANDOM % 9 )) pwd=$(/usr/bin/pwgen -s $len 1) echo "${get_name}:${pwd}" >> $workfile fi # echo password (without new line) echo -n "$pwd" 

安装pwgen或其他密码生成工具,修改您的系统设置的workdirvariables,检查密码长度。 在模板文件中调用它:

 Password = <%= scope.function_generate("/etc/puppet/helpers/bacula/getpwd", bacula_dirname) %> 

傀儡variablesbacula_dirname应该基于主机名或从extlookup()例如:

 $bacula_dirname = "${hostname}-dir" 
  $secret = "super special complicated long secure random string" $password = sha1("${fqdn}${secret}") notify {$password:} 

从另一个文件中导入$secret (可能是你没有保存在版本控制中的一个puppet类),并且你拥有它。 魔术密码的生成。

密码可以通过改变$secret全局更改,也可以通过使用$fqdn以外的内容单独更改。

另一种方法是通过extlookup()设置一些东西,然后就可以使每个机器的唯一性不依赖于一个共同的值。

在我们的例子中,我们用类似的工具完成了类似的工作,需要更多的唯一性,而不是一个具有共同秘密的散列值给我们的东西。

在site.pp

 $extlookup_datadir = "/etc/puppet/manifests/extdata" $extlookup_precedence = ["hostname/%{hostname}", "common"] 

然后,你的ext数据看起来像:

 /etc/puppet/manifests/extdata /common.csv /hostname /foo.csv 

在foo.csv里面,你会放一些东西:

 bacula_password,"J()*JF)jj0j20f9j02rj9<whatever>" 

然后在你的bacula模块中,你会这样做

 $bacula_password = extlookup('bacula_password') 

然后你可以在你的模板中引用。

在评估目录时,主机名称“foo”将首先以ext优先级被find,并且bacula_password的值将被从那里拉出。