我正在 Puppet 中设置 Bacula 配置。我想做的一件事是确保每个密码字段都不同。我目前的想法是使用秘密值对主机名进行哈希处理,以确保每个文件守护进程都有一个唯一的密码,并且该密码可以写入导演配置和文件服务器。我绝对不想使用一个通用密码,因为那样会允许任何可能破坏一台机器的人通过 Bacula 访问任何机器。
除了使用哈希函数生成密码之外,还有其他方法吗?
澄清:
这是不是关于服务的用户帐户。这是关于客户端/服务器文件中的身份验证令牌(使用另一个术语)。示例代码片段:
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
}
答案1
我对自己的解决方案非常满意。这是一个由 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 或其他密码生成工具,修改 workdir 变量以适应您的系统设置,检查密码长度。在模板文件中调用它:
Password = <%= scope.function_generate("/etc/puppet/helpers/bacula/getpwd", bacula_dirname) %>
Puppet 变量 bacula_dirname 应该基于主机名或从 extlookup() 设置,例如:
$bacula_dirname = "${hostname}-dir"
答案2
$secret = "super special complicated long secure random string"
$password = sha1("${fqdn}${secret}")
notify {$password:}
从另一个文件导入$secret
(可能是您未保留在版本控制中的那个木偶类),这样就完成了。神奇的密码生成。
可以通过更改 来全局更改密码$secret
,或者在每个声明中使用 以外的其他内容单独更改密码$fqdn
。
答案3
另一种方法是通过 extlookup() 设置某些东西,然后您可以获得不依赖于公共值的每台机器的唯一性。
在我们的案例中,我们使用类似的工具完成了类似的工作,这些工具需要的独特性比具有共同秘密的散列值所给予我们的更多。
在 site.pp 中
$extlookup_datadir = "/etc/puppet/manifests/extdata"
$extlookup_precedence = ["hostname/%{hostname}", "common"]
然后,你的扩展数据将如下所示:
/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 优先级中找到,并从那里提取 bacula_password 的值。