Wie kann ich Puppenzertifikate vorsignieren?

26

Puppet erfordert Zertifikate zwischen dem verwalteten Client (Puppet) und dem Server (Puppetmaster). Sie können manuell auf dem Client ausgeführt werden und dann auf den Server gehen, um das Zertifikat zu signieren. Wie automatisieren Sie diesen Prozess für Cluster / Cloud-Computer?

Ranguard
quelle
1
Ein Eckfallproblem ist, wenn Sie einen Hostnamen wiederverwenden. Autosigning löst das nicht. Ich habe das gleiche Problem.
Joel K

Antworten:

28

Auf dem Server (Puppenmeister) laufen:

puppetca --generate <NAME>

Kopieren Sie dann Folgendes vom Server auf den Client:

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

Wenn Sie <NAME>als etwas anderes als den Hostnamen unterschreiben möchten, verwenden Sie:

puppetd --fqdn=<NAME>

Fügen Sie /etc/puppet/puppet.conf hinzu, wenn Sie den Daemon ausführen

[puppetd]
certname=<NAME>
Ranguard
quelle
Das ist wirklich nützlich, danke. Darüber hatte ich mir selbst Gedanken gemacht.
Jon Topper
1
Neuer Befehl: puppet cert --generate <NAME>siehe serverfault.com/a/457364/71452
c33s
6

Wenn Sie eine Host-Datenbank haben, können Sie die Autosign-Funktion verwenden. Fügen Sie in Ihrer puppet.confDatei [puppetmasterd]Folgendes hinzu:

autosign = /path/to/autosign.conf

Verwenden Sie dann eine Crontab, um diese Datei zu generieren. Die Autosign-Datei ist nur eine Liste der Hosts, die automatisch signiert werden sollen, wenn sie sich zum ersten Mal mit dem Puppenspieler verbinden. Ich verwende LDAP, um meine Puppet-Hosts zu konfigurieren, sodass mein Cron so aussieht:

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

Ich bin sicher, dass Leute, die iClassify verwenden, eine Abfrage schreiben können, um dasselbe zu tun.

Natürlich müssen Sie dem Netzwerk vertrauen. Ich benutze dies auf EC2. Mein Puppenmeisterserver befindet sich in einer Gruppe, die nur Verbindungen von anderen vertrauenswürdigen Gruppen zulässt. Ich würde dies nicht empfehlen, wenn Ihr Puppenspieler für das Internet geöffnet ist.

Gary Richardson
quelle
6

Einfache Antwort: Neue Anfragen automatisch signieren. Dies ist natürlich gefährlich, da Sie blind jedem System vertrauen, das eine Verbindung zu Ihrem Puppenspieler herstellt. Dies ist der Grund, warum Sie manuell signieren müssen.

[puppetmasterd]
autosign = true

Sie können false angeben und eine Datei verwenden, um zu bestimmen, welche Schlüssel ebenfalls signiert werden sollen.

Siehe die Konfigurationsreferenz im Puppet-Wiki.

Eine andere Möglichkeit besteht darin, ein Tool wie Capistrano zu verwenden , in dem Sie den Puppenmaster-Knoten angeben und die Client-Instanz-Knoten erstellen, und in der Aufgabe:

  • Erstellen Sie den Instanzknoten beispielsweise mit der EC2-API mit Ruby.
  • Führen Sie puppetd auf der Instanz aus und stellen Sie eine Verbindung zum Server her.
  • Führen Sie puppetca --sign für die Anforderung der Instanz aus (da wir den Instanznamen kennen, wie er im obigen Erstellungsbit angegeben wurde).
  • Führen Sie puppetd erneut für die Instanz aus, und stellen Sie diesmal eine erfolgreiche Verbindung her, wenn das Zertifikat signiert ist.
jtimberman
quelle
Hinweis: Wenn Sie Puppet 2.6 oder höher verwenden, sollte die [puppetmasterd]Abschnittsüberschrift jetzt lauten [master]. Weitere Informationen finden Sie unter docs.puppetlabs.com/guides/tools.html .
MrLore
4

Auf dem Server (Puppenmeister) laufen:

puppetca --generate <NAME>

Kopieren Sie dann Folgendes vom Server auf den Client:

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

Wenn Sie etwas anderes als den Hostnamen verwenden möchten:

puppetd --fqdn=<NAME>

Fügen Sie /etc/puppet/puppet.conf hinzu, wenn Sie den Daemon ausführen

[puppetd]
certname=<NAME>
Ranguard
quelle
Das erscheint mir nur komplizierter. Sie installieren Puppet auf dem Client, es generiert ein Zertifikat und sendet es zum Signieren an den Master. Wenn Sie es auf dem Master signieren, wird der Client bei der nächsten Ausführung mit der Arbeit beginnen. Dies erfordert weniger Schritte. Wenn Sie auch diesen Schritt wirklich speichern möchten, können Sie einen Cron-Job ausführen, der etwa Folgendes ausführt: for host in $ (puppetca -list); do puppetca --sign $ host; erledigt
David Pashley
1
Dies ist in Ordnung, wenn Sie einen oder zwei Computer haben, aber wenn Sie Computer in der Cloud starten und stoppen, möchten Sie dies nicht manuell tun müssen. Ich kann einen Basiscomputer starten, ein eingehendes Skript ausführen und alles festlegen up via puppet ohne sich beim puppet master einloggen zu müssen.
Ranguard