====== LDAP-Public Keys ====== 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. ===== LDAP-Server einrichten ===== 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 [[http://www.openldap.org|OpenLDAP]] Reference Manual. ==== Public Key Schema ==== **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 ==== Eltern-Knoten für Benutzer und Gruppen ==== **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 ==== Beispiele für Benutzer und Gruppe ==== **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 ===== Gepatchte openSSH-Pakete bauen ===== Da dies nicht ganz so trivial ist, sollte man diesen Vorgang in einer **chroot**-Umgebung oder einer dedizierten Maschine durchführen. ==== Chroot-Umgebung ==== Eine Solche Umgebung kann man sich selber mit **debootstrap** erstellen: [[http://wiki.debian.org/Debootstrap|Debootstrap - Ubuntu Wiki]] > chroot /usr/share/openqrm/master-template/kvm-host-master/kvm-host-master_11-devel > cd build ==== Aktuelle Paketsourcen ==== Die aktuellen Sourcen der Pakete sämtlicher Ubuntu-Versionen findet man auf [[http://packages.ubuntu.com|http://packages.ubuntu.com]] Für openSSH zum Zeitpunkt der Erstellung dieses Wiki unter [[http://packages.ubuntu.com/precise/openssh-server|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 ==== openSSH AKC Patch ==== 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.ubuntu.ack.patch.gz|openSSH 5.9p1 AKC Patch}} ==== Ubuntu 10.04 - neue dpkg-Pakete ==== 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 ==== openSSH patchen und kompilieren ==== 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 ===== Linux Client einrichten ===== ==== Benötigte Pakete ==== > aptitude install libnss-ldap ==== nsswitch.conf ==== > 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** ;) ==== ldap.conf ==== > 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/ ==== openSSH-AKC-Pakete installieren ==== > 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 ==== sshd_config anpassen ==== 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.