SSH key Verwaltung mit Puppet

Viele Administratoren benutzen SSH und melden sich jeden Tag an vielen Maschinen mit unterschiedlichen Passwörtern an.
Das dauert zum einen lange und zum anderen verleitet es einen möglichst kurze, einfache Passwörter zu benutzen.
Die bessere Variante ist, sich per public key einzuloggen.
Sofern man nicht schon einen key hat, z.B. in ~/.ssh, kann man sich einen anlegen.

[root@srv ~]# ssh-keygen

Der public key wird anschließend auf den Server gelegt, den privaten behält man für sich! Es gibt außerdem zwei verschiedene Ansätze: Wenn man sich anmeldet, kann man entweder sofort root sein, oder man bleibt erstmal normaler Benutzer und kann sich später zum root machen.
Nun möchte man natürlich nicht jeden Server per Hand konfigurieren, sonst hat man die Zeitersparnis ganz schnell aufgebraucht. Aber deswegen gibt es ja Puppet, mit dem man Linuxserver zentral konfigurieren kann.

Wir legen uns drei Klassen in Puppet an.

1.) ssh

Mit dieser Klasse wird sichergestellt, dass der ssh-daemon installiert ist, läuft und eine gültige Konfiguration hat.

class ssh {
package {'openssh-server':
ensure => 'present',
}
service {'sshd':
name => 'ssh',
require => Package['openssh-server'],
ensure => 'running',
enable => 'true',
hasstatus => 'true',
hasrestart => 'true',
subscribe => File['/etc/ssh/sshd_config']
}
file {'/etc/ssh/sshd_config':
ensure => 'present',
source => 'puppet:///files/etc/ssh/sshd_config-new',
owner => 'root',
group => 'root',
mode => '644',
}
}

Es ist wichtig, dass für die Authentifizierung als root in der sshd_config unter anderem folgende Werte gesetzt sind:

PermitRootLogin yes
PubkeyAuthentication yes

Außerdem, damit man bei der root Anmeldung immer sieht wer sich genau anmeldet:

LogLevel VERBOSE

2.) ssh keys für root Anmeldung

Hier werden die keys in /root/.ssh/ssh_authorized_key geschoben. Man kann sich anschließend mit

 ssh root@system  

anmelden ohne das Passwort einzugeben.

class users_root {
ssh_authorized_key {
'Max_Mustermann':
ensure => 'present',
user => 'root',
key => 'vnjklvfAVFNJAAAAAAAAKÖASFV+vfdnjklas/
vfnjklvslöoVFSJOASvmklvaäüvfadhnjuiAAAAyYZH7b9eDNVehtL87t5lJ199IfrU7Tw7+58zAiyYZH7b9eDNVehtL87t5l
J199IfrU7Tw7+58zAivmnjkövfaslAAAA/vnfjakiölvsjkölvfadbnjkö/++vasmnjköv/BGDSAvnkljbdaBFAFDEnjoäöba
BAEjnbiobhuzipy--BAbujpöbhuip//bnjauip  vfda/VNÖASÖDKINAAAAsvmklötrrehhjj55öybö',
type => 'ssh-rsa';
}
}

3.) ssh keys für user Anmeldung

In dieser Klasse werden auf allen Systemen Benutzer angelegt und anschließend der public key verteilt.

class users_user {
group {'Firma':
ensure => 'present',
gid => '40000',
}
group {'Firma-IT':
ensure => 'present',
gid => '40001',
}
#Max Mustermann
user {Max_Mustermann':
ensure => 'present',
managehome => 'true',
shell => '/bin/bash',
uid => '35123',
gid => 'Firma',
groups => 'Firma-IT'
}
ssh_authorized_key {'Max_Mustermann':
ensure => 'present',
user => 'Max_Mustermann',
key => 'vnjklvfAVFNJAAAAAAAAKÖASFV+vfdnjklas/
vfnjklvslöoVFSJOASvmklvaäüvfadhnjuiAAAAyYZH7b9eDNVehtL87t5lJ199IfrU7Tw7+58zAiyYZH7b9eDNVehtL87t5l
J199IfrU7Tw7+58zAivmnjkövfaslAAAA/vnfjakiölvsjkölvfadbnjkö/++vasmnjköv/BGDSAvnkljbdaBFAFDEnjoäöba
BAEjnbiobhuzipy--BAbujpöbhuip//bnjauip  vfda/VNÖASÖDKINAAAAsvmklötrrehhjj55öybö',[/code]
type => 'ssh-rsa',
require => User['Max_Mustermann']
}
Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.