Sichere PasswörterIn meinen Puppet Installationen habe ich mir angewöhnt alles in Git zu Versionieren, sowohl die kleinsten Module, als auch die Site Konfiguration der einzelnen Nodes.
Das stellte mich vor das Problem, wie hinterlege ich hier Passwörter ohne sie in die Manifeste zu schreiben und später mit in der Versionskontrolle gespeichert zu haben – was unter Umständen ein Sicherheitsrisiko wäre, selbst bei der Verwendung von Hashes.
Was ich als Lösung für mich gefunden habe war trocla. Es handelt sich dabei um ein Ruby Gem und ein Puppetmodul, das die einfache Möglichkeit bereitstellt die Passwörter in einer eigenen Datei zu speichern, abseits der Manifeste. Um ein Passwort zu verwenden muss nur die Parser-Funktion trocla() im jeweiligen Manifest verwendet werden.

Funktionen

  • Speichert Passwörter in einer YAML Datei, als einfache Key-Values
  • Kann mehrere Hash-Typen und Plaintext speichern
  • Passwörter können bei Bedarf automatisch erstellt werden
  • Das Plaintext Passwort muss nicht gespeichert bleiben
  • Muss nur auf dem Puppetmaster installiert sein

Wie funktioniert das?

Grundsätzlich muss man nur das Ruby Gem installieren, Abhängigkeiten werden dadurch eigentlich automatisch installiert. Es ist allerdings hilfreich soweit möglich Betriebssystem Pakete zu benutzen, vor allem für ruby-bcrypt.

gem install trocla

Nach der Installation stellt das CLI commando “trocla” bereit um direkt mit den gespeicherten Daten zu arbeiten.
Wichtig: Solange nichts konfiguriert ist werden die Daten in ‘/tmp/trocla.yaml’ gespeichert!

create

Mit create wird ein Passwort mit einem bestimmten Typen erstellt, oder einfach ausgegeben wenn schon vorhanden.

trocla create myadminuser plain
trocla create global_root sha512crypt
trocla create mysql_root mysql

get

Liefert ein Passwort des bestimmten Typs zurück, setzt aber voraus dass der Wert schon vorhanden ist.
trocla get mysql_root mysql

set

Setzt ein bestimmtes Passwort mit einem selbst festgelegten Wert.

trocla set user1 plain     # (interaktive eingabe)
trocla set --password supersicher123 user1 plain

reset

Setzt einen Passwort-Hash zurück und erzeugt einen neuen aus dem Plain Passwort.

trocla reset global_root sha512crypt

delete

Löscht ein Passwort aus dem Speicher, auch praktisch dafür um Plaintext Passwort zu löschen wenn man nur noch die Hashes braucht.

trocla delete global_root plain

Konfiguration mit Puppet

Als Konfigurationsdatei dient eine weitere YAML Datei, die Standardwerte sind unter default_config.yaml zu finden.
Das Puppetmodul sorgt dafür dass die Konfiguration und die Dateien auf dem Master automatisch angelegt und geschützt werden. Dazu muss noch die Puppetklasse trocla::config für den Puppetmaster included werden.
Folgende Dateien werden erzeugt:

/etc/puppet/trocla_data.yaml
/etc/puppet/troclarc.yaml
/etc/troclarc.yaml -> /etc/puppet/troclarc.yaml

Durch die letzte Datei kann man mit dem CLI Tool auch mit den Passwörtern arbeiten.

Verwendung in Puppet

Die Verwendung in Puppet ist dabei relativ simpel.

user { 'myadmin':
    password => trocla("$name", 'sha512crypt'),
    ...
}
/* oder wenn das Passwort nicht erzeugt werden soll */
user { 'root':
    password => trocla_get('root', 'sha512crypt'),
    ...
}

Links

Hier noch ein paar Links zum Thema trocla:

Ein geniales Modul finde ich, Danke an @duritong!
Das Titelbild stammt von Paul O’Rear auf Flickr (CC BY-SA 2.0).

Markus Frosch
Markus Frosch
Principal Consultant

Markus arbeitet bei NETWAYS als Principal Consultant und unterstützt Kunden bei der Implementierung von Nagios, Icinga und anderen Open Source Systems Management Tools. Neben seiner beruflichen Tätigkeit ist Markus aktiver Mitarbeiter im Debian Projekt.