Security

使用 Puppet 管理服務密碼

  • April 3, 2012

我正在 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"

引用自:https://serverfault.com/questions/353153