Benutzer-Werkzeuge

Webseiten-Werkzeuge


ldap-public_keys

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 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: 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

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

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 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.

/home/http/wiki/data/pages/ldap-public_keys.txt · Zuletzt geändert: von 127.0.0.1