我在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的值将被从那里拉出。