Gerenciando senhas de serviço com o Puppet

6

Estou configurando minha configuração do Bacula no Puppet. Uma coisa que quero fazer é garantir que cada campo de senha seja diferente. Meu pensamento atual é fazer o hash do nome do host com um valor secreto que assegure que cada daemon de arquivo tenha uma senha exclusiva e que a senha possa ser gravada na configuração do diretor e no servidor de arquivos. Eu definitivamente não quero usar uma senha universal, pois isso permitiria a qualquer um que pudesse comprometer uma máquina a ter acesso a qualquer máquina através do Bacula.

Existe outra maneira de fazer isso além de usar uma função hash para gerar as senhas?

Esclarecimento:

Isso NÃO é sobre contas de usuário para serviços. Isso é sobre os tokens de autenticação (para usar outro termo) nos arquivos cliente / servidor. Exemplo de snippet:

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
}
    
por Jeff Ferland 24.01.2012 / 17:49

3 respostas

3
    $secret = "super special complicated long secure random string"
    $password = sha1("${fqdn}${secret}")
    notify {$password:}

Importe $secret de outro arquivo (talvez aquela classe de fantoches que você não mantém no controle de versão) e aí está. Geração de senha mágica.

As senhas podem ser alteradas globalmente alterando $secret ou individualmente em cada declaração usando algo diferente de $fqdn .

    
por 02.04.2012 / 23:24
3

Estou muito satisfeito com a minha solução para isso. É um script de shell chamado pela função generate () do manifesto do fantoche. A senha para cada host é gerada e armazenada em um arquivo simples, conforme necessário.

#!/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"

Instale o pwgen ou outra ferramenta de geração de senha, modifique a variável workdir para as configurações do sistema, verifique os comprimentos das senhas. No arquivo de modelo, chame-o:

Password = <%= scope.function_generate("/etc/puppet/helpers/bacula/getpwd", bacula_dirname) %>

A variável do fantoche bacula_dirname deve ser baseada no nome do host ou definida a partir do extlookup (), por exemplo:

$bacula_dirname = "${hostname}-dir"
    
por 14.02.2012 / 17:15
0

Uma alternativa é configurar algo via extlookup () que você pode ter uma exclusividade por máquina que não depende de um valor comum.

No nosso caso, fizemos coisas como essa com ferramentas semelhantes que precisavam de mais exclusividade do que o que um valor com hash com um segredo comum nos deu.

no site.pp

$extlookup_datadir = "/etc/puppet/manifests/extdata"
$extlookup_precedence = ["hostname/%{hostname}", "common"]

Em seguida, seus dados ext seriam semelhantes a:

/etc/puppet/manifests/extdata
                             /common.csv
                             /hostname
                                      /foo.csv

Dentro de foo.csv, você colocaria algo como:

bacula_password,"J()*JF)jj0j20f9j02rj9<whatever>"

Então, no seu módulo bacula, você faria

$bacula_password = extlookup('bacula_password')

que você poderia então referenciar em seu modelo.

Quando o catálogo é avaliado, o nome do host "foo" seria encontrado primeiro na ext precedência e o valor de bacula_password seria obtido a partir daí.

    
por 28.01.2012 / 01:17