Es gibt im Wesentlichen zwei Möglichkeiten, sich an einem SSH-Server zu authentifizieren: Via Passwort und via Schlüssel. Da ich bei einem selbstverständlich mit einer guten Passwort-Phrase geschützten Schlüssel nicht nur etwas brauche, was ich weiß, sondern auch noch etwas brauche, was ich mit mir führe, ist die Schlüssel-Authentizierung sicherer.
Einige Kunden haben es schon einmal gesehen, andere Fragen sich vielleicht: Wie kopieren wir eigentlich unsere öffentlichen SSH-Schlüssel auf Linux-Systeme, für die Kunden Fernwartung wünschen, oder auf unsere eigenen Server? Es ist natürlich möglich mit den Befehlen scp
und cat oder eben mit ssh-copy-id
zu arbeiten, um jeden öffentlichen Schlüssel einzeln der authorized_keys
-Datei des betreffenden Benutzers auf jeden Server zu kopieren. Es geht aber auch wesentlich einfacher:
Wir setzen seit Jahren dazu das selbst geschriebene Distkeys ein.
Was zunächst als Perl-Skript startete, ist in der aktuellen Inkarnation ein objektorientiertes Ruby-Skript, das beim Verteilen der Schlüssel zunächst die authorized_keys
-Datei vom Server herunterlädt, alle Änderungen durchführt, und dann, nach dem Erstellen eines Backups, wieder hoch lädt, anstatt für jeden einzelnen Schlüssel erneut eine SSH-Verbindung aufzubauen. Zudem erreicht es via SSH Port Forwarding auch Server hinter einer Firewall und löscht veraltete Schlüssel. Als nettes Gimick bietet Distkeys auch interaktive SSH-Logins und das Ausführen eines Skriptes auf einer Liste von Hosts.
Wir dachten uns, dass ein solches Skript auch andere Admins interessieren könnte, die viele Server verwalten. Daher stellten wir den Quelltext unter eine Open-Source-Lizenz (GPL2+) und machten das Projekt auf unserer Open-Source-Webseite https://github.com/teamix/distkeys publik. Zusätzlich erstellte ich ein Debian-Paket und schlug dieses für eine Aufnahme in das Debian-Archiv vor. Wer Disktkeys schon jetzt mal auf einem Debian-System ausprobieren möchte, findet das Paket auf meiner persönlichen Webseite bei teamix.
Eine Schlüsselliste zum Hinzufügen und Entfernern von Schlüsseln sieht beispielsweise so aus:
1 2 3 4 |
# cat infra-admins.keylist +id_rsa-ms.pub +id_rsa-neuer-mitarbeiter-im-infra-team.pub -alt/id_rsa-alter-mitarbeiter.pub |
Ein einfacher Aufruf stellt sicher, dass alle mit einem Pluszeichen markierte Schlüssel und kein mit Minuszeichen markierter Schlüssel auf dem System ist – andere Schlüssel läßt Distkeys unberührt:
1 2 3 4 5 6 7 8 9 10 |
# distkeys -H root@intraws -k infra-admins.keylist addremove Host: root@intraws Connecting to host intraws (user: root, port: 22)... Opening SFTP session... Key Martin Steigerwald […] already there and identical. Skipped adding it. Key Neues Mitglied im Infrastruktur-Team […] added. Key Alter Mitarbeiter is not there. Skipped removing it. Creating a backup to .ssh/authorized_keys-2013-10-07.bak if not already done today... Uploading keys to .ssh/authorized_keys-new... File does exist and has correct size, moving to .ssh/authorized_keys... |
Bei Interesse erläutere ich in einem weiteren Blog-Eintrag die Verwendung von Distkeys etwas näher.
Als Alternative bietet sich natürlich an, gleich die komplette Konfiguration via Puppet oder einem Ähnlichen Werkzeug zum Konfigurationsmanagement auszurollen. Wer jedoch einfach mal ein paar SSH-Schlüssel verteilen möchte und das auch an Systeme hinter Feuerwällen, findet mit Distkeys eine einfache Lösung dafür.