使用 Puppet 管理服务密码

使用 Puppet 管理服务密码

我正在 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 的值。

相关内容