Como posso pré-assinar certificados de marionetes?

26

O Puppet exige certificados entre o cliente (fantoche) que está sendo gerenciado e o servidor (puppetmaster). Você pode executar manualmente no cliente e depois acessar o servidor para assinar o certificado, mas como você automatiza esse processo para clusters / máquinas na nuvem?

Ranguard
fonte
1
Um problema de maiúsculas e minúsculas é quando você reutiliza um nome de host. A assinatura automática não resolverá isso. Estou tendo esse mesmo problema.
Joel K

Respostas:

28

No servidor (puppetmaster), execute:

puppetca --generate <NAME>

Em seguida, copie o seguinte do servidor para o cliente:

/var/lib/puppet/ssl/certs/<NAME>.pem
/var/lib/puppet/ssl/certs/ca.pem
/var/lib/puppet/ssl/private_keys/<NAME>.pem

Se você deseja assinar <NAME>como algo diferente do nome do host, use:

puppetd --fqdn=<NAME>

E adicione /etc/puppet/puppet.conf se estiver executando o daemon

[puppetd]
certname=<NAME>
Ranguard
fonte
Isso é realmente útil, obrigado. Eu mesma estava intrigada com isso.
Jon Topper
1
novo comando é puppet cert --generate <NAME>ver serverfault.com/a/457364/71452
c33s 23/10/19
6

Se você possui um banco de dados host, pode usar o recurso de assinatura automática. No seu puppet.confarquivo, no [puppetmasterd], adicione:

autosign = /path/to/autosign.conf

Em seguida, use um crontab para gerar esse arquivo. O arquivo de assinatura automática é apenas uma lista de hosts para assinatura automática quando eles se conectam ao puppetmaster. Eu uso o LDAP para configurar meus hosts fantoches, para que meu cron se pareça com:

* * * * * root /usr/bin/ldapsearch -x '(objectClass=puppetClient)' cn | /bin/grep ^cn | /bin/sed 's!^cn: !!' > /etc/puppet/autosign.conf

Tenho certeza de que as pessoas que usam o iClassify seriam capazes de escrever uma consulta para fazer o mesmo.

Obviamente, você precisa ter alguma confiança na rede. Eu uso isso no EC2. Meu servidor puppetmaster está em um grupo que permite apenas conexões de outros grupos confiáveis. Eu não recomendaria fazer isso se o seu puppetmaster estiver aberto à internet.

Gary Richardson
fonte
6

Resposta simples: assine automaticamente novos pedidos. É claro que isso é perigoso, porque você confia cegamente em qualquer sistema que se conecte ao seu puppetmaster, que é o objetivo de exigir assinatura manual.

[puppetmasterd]
autosign = true

Você pode especificar false e um arquivo a ser usado para determinar quais chaves assinar também.

Veja a referência de configuração no wiki do Puppet.

Outra opção é usar uma ferramenta como o Capistrano , em que você especifica o nó puppetmaster e cria os nós da instância do cliente e na tarefa:

  • Crie o nó da instância, digamos com a API do EC2 com Ruby.
  • Execute o puppetd na instância, conectando-se ao servidor.
  • Execute puppetca --sign para a solicitação da instância (já que conhecemos o nome da instância como foi fornecido no bit de criação acima).
  • Execute o puppetd novamente na instância, desta vez conectando-se com êxito à medida que o certificado for assinado.
jtimberman
fonte
Nota: Se você estiver usando o Puppet 2.6 ou superior, o [puppetmasterd]cabeçalho da seção deve ser agora [master]. Consulte docs.puppetlabs.com/guides/tools.html para obter mais informações.
MrLore
4

No servidor (puppetmaster), execute:

puppetca --generate <NAME>

Em seguida, copie o seguinte do servidor para o cliente:

/var/lib/puppet/ssl/certs/<NAME>.pem
/var/lib/puppet/ssl/certs/ca.pem
/var/lib/puppet/ssl/private_keys/<NAME>.pem

Se você deseja ter algo diferente do nome do host, use:

puppetd --fqdn=<NAME>

E adicione /etc/puppet/puppet.conf se estiver executando o daemon

[puppetd]
certname=<NAME>
Ranguard
fonte
Isso apenas parece mais complicado para mim. Você instala o fantoche no cliente, ele gera um certificado e o envia ao mestre para assinatura. Quando você assina no mestre, o cliente começará a trabalhar na próxima vez em que for executado. Isso envolve menos etapas. Se você realmente deseja salvar até mesmo esta etapa, pode executar um trabalho cron que faça algo como: para host em $ (puppetca --list); do puppetca --sign $ host; feito
David Pashley
1
Isso é bom se você tiver uma ou duas máquinas, mas quando você está iniciando e parando máquinas na nuvem, não deseja fazer isso manualmente, posso iniciar uma máquina base, executar um script que entra e define tudo via fantoche sem precisar fazer login no mestre de bonecos.
Ranguard 5/06