Es soll an Hand von Beispielen gezeigt werden, wie man POSIX-Accounts in LDAP speichert und diese in Ubuntu Linux verwenden kann. Zusätzlich wird eine gepatchte Version von openSSH erstellt, so daß die Authentifizierung über die in LDAP gespeicherten öffentlichen Schlüssel erfolgt.
Die Grundinstallation/Konfiguration des LDAP-Server ist unter LDAP-Server beschrieben.
Um Public Keys speichern zu können, muß der LDAP-Server um ein entsprechendes Schema erweitert werden.
ACHTUNG:
Diese Beispiele beinhalten keine SSL/TLS-verschlüsselung. Mehr zum Thema Verschlüsselung im OpenLDAP Reference Manual.
pubkey.ldif
dn: cn=openssh-lpk_openldap,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk_openldap
olcAttributeTypes: {0}( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DES
C 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.
1.1466.115.121.1.40 )
olcObjectClasses: {0}( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' DESC
'MANDATORY: OpenSSH LPK objectclass' SUP top AUXILIARY MAY ( sshPublicKey $
uid ) )
Das Schema mit folgendem Kommando einspielen.
> ldapadd -Y EXTERNAL -H ldapi:/// -f pubkey.ldif
knoten.ldif
# Knoten für Benutzer dn: ou=people,dc=domain,dc=de objectClass: organizationalUnit objectClass: top ou: people # Knoten für Gruppen dn: ou=group,dc=domain,dc=de objectClass: organizationalUnit objectClass: top ou: group
Die Knoten anlegen.
> ldapadd -Y EXTERNAL -H ldapi:/// -f knoten.ldif
user_group.ldif
# Benutzer (POSIX Account) dn: cn=testacc,ou=people,dc=domain,dc=de cn: testacc gidNumber: 1234 homeDirectory: /home/testacc loginShell: /bin/bash objectClass: person objectClass: posixAccount objectClass: ldapPublicKey objectClass: top sn: testacc uid: testacc uidNumber: 1234 sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCpQkxoVZH7MaIaRyCkTw6T3FwU srW1xWcluiy4cROjjun94T0BHgbBKIhDCsKxwxROKPBTM1UVyA4j1KQGNN6xUm9PhJ706gjVEh2UA yfNvfnz4EVJhCyE21lVsd8NIwKsk1tNoZBksuprGe1UEG+ZSHM8g1SHO1SPmyqDkxQmgJPP0lzO5E Dd98ARuoeomcsZOAvyUTbTp8C7wgNYTmJs1xN5L3N8ydXTRWUXQbD6+ePWgohU+jUM4G6eVgHVQlX sIOrf1x+eZohgbRlGzzmTkXzyxtzPXksWx8ORsDNo+m8lHEjBqDoEfoXaJhPZVDtDy8Ga2YLq2eaQ yNhnaU101JDxMk0eKcUniybFhgqLJVheWQJRh0lflIH+3mlOMrzvs4cG5qAD4yzPC0kZy1nvqTKOc hKSOQVIO9a3l2pMmpE0LvWUIGM3zu4Wc8ZDWwiixfsgLoafQFY5rpEfrCgVyzO1cqZuCElzdyVrp4 lwH18JqU7ICp8MbngHJ2EanTVsDTsxzOwxessU5pEpNT8ffnTaSGuw71hnXF6pjIE/EDeFPpRAJ23 9YtDk2PVhehV7Pk+zY+uP1ZUsfRTCqoVOnEjqb4PG2Jh1kaaeteOL0ZlZnjhlYalQq0IqG5hTBfDs sfgWT9T2i4GUPAnwtnspNATFGKKD19msqkeCHToJWQ== testacc@ldaptest # Gruppe (POSIX Group) dn: cn=testgrp,ou=group,dc=domain,dc=de gidNumber: 1234 objectClass: posixGroup objectClass: top cn: testgrp
Benutzer und Gruppe anlegen.
> ldapadd -Y EXTERNAL -H ldapi:/// -f user_group.ldif
Da dies nicht ganz so trivial ist, sollte man diesen Vorgang in einer chroot-Umgebung oder einer dedizierten Maschine durchführen.
Eine Solche Umgebung kann man sich selber mit debootstrap erstellen: Debootstrap - Ubuntu Wiki
> chroot /usr/share/openqrm/master-template/kvm-host-master/kvm-host-master_11-devel > cd build
Die aktuellen Sourcen der Pakete sämtlicher Ubuntu-Versionen findet man auf http://packages.ubuntu.com
Für openSSH zum Zeitpunkt der Erstellung dieses Wiki unter openSSH Ubuntu Package
> wget -c -t 0 http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh_5.9p1-5ubuntu1.dsc > wget -c -t 0 http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh_5.9p1.orig.tar.gz > wget -c -t 0 http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh_5.9p1-5ubuntu1.debian.tar.gz
Dieser Patch erweitert openSSH um den sshd_config-Paramater AuthorizedKeysCommand. Damit können Helper-Programme aufgerufen werden, die aus beliebigen Datenquellen, in unserem Fall LDAP, öffentliche Schlüssel zentral abfragen können, die man sonst in die authorized_keys einfügen müßte.
Eine für den Ubuntu 12.04 openSSH 5.9p1 angepaßte Version des Patches laden.
> wget -c -t 0 http://marc.wäckerlin.ch/_media/computer/blog/openssh-5.9p1.ubuntu.ack.patch
Alternativ von unserem Wiki-Server: openSSH 5.9p1 AKC Patch
Die dpkg-Version von Ubuntu 10.04 ist zu alt, um das openSSH-Paket erstellen zu können, daher muß eine aktuelle Version aus einem PPA-Repository installiert werden.
Hinweis: dpkg selber kompilieren ist auf Grund der vielen damit verbundenen Tücken und Abhängikeiten nicht empfehlenswert. Im schlimmsten Fall "zerstört" man das vorhandene dpkg-Paket und das Paketmanagement ist irreparabel.
PPA von Nate Meunch hinzufügen.
> aptitude install python-software-properties > add-apt-repository ppa:n-muench/programs-ppa2
Aktuelle dpkg-Pakete installlieren.
> aptitude update > aptitude install libdpkg-perl libdpkg-dev
Wenn alle benötigten (Devel-)Pakete installiert sind (die Liste ist zu groß), kann man openSSH patchen und kompilieren.
Ubuntu Sourcen entpacken.
> dpkg-source -x openssh_5.9p1-5ubuntu1.dsc
AKC-Patch hinzufügen.
> cd openssh-5.9p1 # AKC-Patch > patch -p1 <../openssh-5.9p1.ubuntu.ack.patch # Paketname anpassen > sed -i "s|1:5.9p1-5ubuntu1|1:5.9p1-AKC-5ubuntu1|" debian/changelog # Konfigurationsskripts und Template-Header für configure neu generieren > autoconf > autoheader # configure-Parameter anpassen > sed -i '/confflags *+= *--with-pam/aconfflags += --with-authorized-keys-command' debian/rules > sed -i '/confflags *+= *--with-consolekit/d' debian/rules # Versionsnummern aus Paketabhängikeiten entfernen > sed -i 's/ (>[^)]*),/,/g' debian/control
Kompilieren und Pakete erstellen.
> dpkg-buildpackage -rfakeroot -b
> aptitude install libnss-ldap
> vi /etc/nsswitch.conf
Die Zeilen für User-/Group-/Shadow-Zuweisungen wie folgt anpassen.
passwd: compat ldap group: compat ldap shadow: compat ldap
Man beachte das Wörtchen ldap ;)
> vi /etc/ldap.conf
Folgende Zeilen anpassen bzw. auskommentieren.
base dc=domain,dc=de uri ldap://192.168.0.232/ nss_base_passwd ou=People,dc=domain,dc=de?one nss_base_shadow ou=People,dc=domain,dc=de?one nss_base_group ou=Group,dc=domain,dc=de?one
Beim URI beachten, daß dort die richtige IP des LDAP-Servers steht. Es können mehrere Server angegeben werden, z.B.
> uri ldap://192.168.0.1/ ldap://192.168.0.2/
> dpkg -i openssh-client_5.9p1-AKC-5ubuntu1_amd64.deb openssh-server_5.9p1-AKC-5ubuntu1_amd64.deb
Das Braucht man für ldap-keys.sh (s.u.):
> aptitude install ldap-utils
Folgende Zeile in die sshd_config einfügen.
> vi /etc/ssh/sshd_config AuthorizedKeysCommand /etc/ssh/ldap-keys.sh
ldap-keys.sh:
#!/bin/bash
# get configuration from /etc/ldap.conf
for x in $(sed -n 's/^\([a-zA-Z_]*\) \(.*\)$/\1="\2"/p' /etc/ldap.conf); do
eval $x;
done
OPTIONS=
case "$ssl" in
start_tls)
case "$tls_checkpeer" in
no) OPTIONS+="-Z";;
*) OPTIONS+="-ZZ";;
esac;;
esac
ldapsearch $OPTIONS -H ${uri} \
-w "${bindpw}" -D "${binddn}" \
-b "${base}" \
'(&(objectClass=posixAccount)(uid='"$1"'))' \
'sshPublicKey' \
| sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
Dieses Skript bekommt vom sshd als Parameter den Benutzernamen übergeben und sucht im LDAP nach dessen dort hinterlegten öffentlichen Schlüsseln, die im selben Format wie in der Datei authorized_keys ausgegeben und vom sshd ausgewertet werden.