Security
使用 Puppet 管理服務密碼
我正在 Puppet 中設置我的 Bacula 配置。我想做的一件事是確保每個密碼欄位都不同。我目前的想法是用一個秘密值對主機名進行雜湊處理,以確保每個文件守護程序都有一個唯一的密碼,並且該密碼可以寫入到 director 配置和文件伺服器。我絕對不想使用一個通用密碼,因為這將允許任何可能破壞一台機器的人通過 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 }
$secret = "super special complicated long secure random string" $password = sha1("${fqdn}${secret}") notify {$password:}
$secret
從另一個文件(可能是您沒有保留在版本控制中的一個 puppet 類)導入,然後您就擁有了它。魔術密碼生成。密碼可以通過更改來全域更改,也可以
$secret
在每個聲明中單獨更改,使用$fqdn
.
我對我的解決方案感到非常滿意。它是由 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"