Comment pré-signer des certificats de marionnettes?

26

Puppet requiert des certificats entre le client (marionnette) géré et le serveur (marionnettiste). Vous pouvez exécuter manuellement sur le client, puis aller sur le serveur pour signer le certificat, mais comment automatisez-vous ce processus pour les clusters / machines cloud?

Ranguard
la source
1
Un problème de cas d'angle est lorsque vous réutilisez un nom d'hôte. La signature automatique ne résoudra pas cela. J'ai ce même problème.
Joel K

Réponses:

28

Sur le serveur (puppetmaster) exécutez:

puppetca --generate <NAME>

Copiez ensuite les éléments suivants du serveur sur le client:

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

Si vous souhaitez vous connecter <NAME>avec autre chose que le nom d'hôte, utilisez:

puppetd --fqdn=<NAME>

Et ajoutez à /etc/puppet/puppet.conf si vous exécutez le démon

[puppetd]
certname=<NAME>
Ranguard
la source
C'est vraiment utile, merci. J'étais perplexe à ce sujet moi-même.
Jon Topper
1
la nouvelle commande est puppet cert --generate <NAME>voir serverfault.com/a/457364/71452
c33s
6

Si vous avez une base de données hôte, vous pouvez utiliser la fonction de signature automatique. Dans votre puppet.conffichier, dans le [puppetmasterd], ajoutez:

autosign = /path/to/autosign.conf

Utilisez ensuite une crontab pour générer ce fichier. Le fichier de signature automatique n'est qu'une liste d'hôtes à signer automatiquement lorsqu'ils se connectent pour la première fois au marionnettiste. J'utilise LDAP pour configurer mes hôtes marionnettes, donc mon cron ressemble à:

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

Je suis sûr que les personnes qui utilisent iClassify pourraient écrire une requête pour faire de même.

Bien sûr, vous devez avoir une certaine confiance dans le réseau. Je l'utilise sur EC2. Mon serveur puppetmaster fait partie d'un groupe qui autorise uniquement les connexions à partir d'autres groupes de confiance. Je ne recommanderais pas de faire cela si votre marionnettiste est ouvert à Internet.

Gary Richardson
la source
6

Réponse simple: signez automatiquement de nouvelles demandes. Bien sûr, cela est dangereux parce que vous faites aveuglément confiance à n'importe quel système qui se connecte à votre marionnettiste, ce qui est le but d'exiger une signature manuelle.

[puppetmasterd]
autosign = true

Vous pouvez également spécifier false et un fichier à utiliser pour déterminer les clés à signer.

Voir la référence de configuration sur le wiki Puppet.

Une autre option consiste à utiliser un outil comme Capistrano , dans lequel vous spécifiez le nœud puppetmaster et créez les nœuds d'instance client, et dans la tâche:

  • Créez le nœud d'instance, par exemple avec l'API EC2 avec Ruby.
  • Exécutez puppetd sur l'instance, en vous connectant au serveur.
  • Exécutez puppetca --sign pour la demande de l'instance (puisque nous connaissons le nom de l'instance tel qu'il a été donné dans le bit de création ci-dessus).
  • Exécutez à nouveau puppetd sur l'instance, cette fois avec succès la connexion lorsque le certificat est signé.
jtimberman
la source
Remarque: Si vous utilisez Puppet 2.6 ou supérieur, l'en [puppetmasterd]-tête de section devrait maintenant être [master]. Voir docs.puppetlabs.com/guides/tools.html pour plus d'informations.
MrLore
4

Sur le serveur (puppetmaster) exécutez:

puppetca --generate <NAME>

Copiez ensuite les éléments suivants du serveur sur le client:

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

Si vous souhaitez utiliser autre chose que le nom d'hôte, utilisez:

puppetd --fqdn=<NAME>

Et ajoutez à /etc/puppet/puppet.conf si vous exécutez le démon

[puppetd]
certname=<NAME>
Ranguard
la source
Cela me semble plus compliqué. Vous installez marionnette sur le client, il génère un certificat et l'envoie au maître pour signature. Lorsque vous le signez sur le maître, le client commencera à fonctionner la prochaine fois qu'il s'exécutera. Cela implique moins d'étapes. Si vous voulez vraiment enregistrer même cette étape, vous pouvez exécuter un travail cron qui fait quelque chose comme: pour l'hôte dans $ (puppetca --list); do puppetca --sign $ host; fait
David Pashley
1
C'est bien si vous avez une ou deux machines, mais lorsque vous démarrez et arrêtez des machines dans le cloud, vous ne voulez pas avoir à le faire manuellement, je peux démarrer une machine de base, exécuter un script qui entre et définit tout via marionnette sans avoir à se connecter au maître de marionnettes.
Ranguard