OpenLDAP automatisch installieren und einrichten

Ich habe heute ein Script geschrieben, welches OpenLDAP auf Debiansystemen automatisch installieren und auch gleich für ppolicy konfigurieren kann. Wer sowas schonmal von Hand gemacht hat, weiß um die Schwierigkeiten. Es sollte auf den meisten Debianderivaten funktionieren (entwickelt habe ich auf stretch), ist aber leicht anpassbar, da ich alle Einzelschritte in Funktionen gepackt habe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#!/bin/bash
 
# globals
LDAPDB="mdb"
PASSWORD="test1234"
HOSTNAME=`hostname`
DOMAIN=`echo  $HOSTNAME | awk -v FS="." '{print $1}'`
TLD=`echo  $HOSTNAME | awk -v FS="." '{print $2}'`
PPOLICY_FILE="/etc/ldap/schema/ppolicy.ldif"
LOGFILE="debug.txt"
 
# basesetup()
# Installs slapd (openLDAP) unattended
# using debconf
 
basesetup() {
 
	PASS=$1
        HOST=$2
	DBTYPE=$3
 
	echo "Building LDAP-Roottree ...\n"
 
	export DEBIAN_FRONTEND=noninteractive
	echo -e " \
		slapd    slapd/internal/generated_adminpw    password   $PASS
		slapd    slapd/password2    password    $PASS
		slapd    slapd/internal/adminpw    password   $PASS
		slapd    slapd/password1    password    $PASS
		slapd	 slapd/backend: string	$DBTYPE
		slapd	 slapd/domain	string	$HOST
	" | debconf-set-selections
 
	apt-get install -y slapd ldap-utils
 
}
 
make_index() {
 
	echo "Adding index ...\n"
 
        echo -e " \
dn: olcDatabase={1}$LDAPDB,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: mail,givenName eq,subinitial
        " | ldapmodify -Y EXTERNAL -H ldapi:///
 
}
 
# configure_policy()
# installs: 	ppolicy-scheme
# 		ppolicy-module
# 		overlay
# 		ppolicycontext
# 		defaultpolicy
 
configure_policy() {
 
        echo "Setting temporary ACLs ..."
 
        echo -e " \
dn: olcDatabase={1}$LDAPDB,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" write by * none
        " | ldapmodify -Y EXTERNAL -H ldapi:///
 
	echo "Adding ppolicy-scheme ..."
 
	ldapadd -Q -Y EXTERNAL -H ldapi:/// -f $PPOLICY_FILE
 
        echo "Activating ppolicy-module ..."
 
        echo -e " \
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la
        " | ldapmodify -Y EXTERNAL -H ldapi:///
 
	/etc/init.d/slapd restart
 
        echo "Generating ppolicy-context ..."
 
        echo -e " \
dn: ou=policies,dc=$DOMAIN,dc=$TLD
objectClass: organizationalUnit
objectClass: top
ou: policies
        " | ldapadd -Q -Y EXTERNAL -H ldapi:///
 
        echo "Setting default policy ..."
 
        echo -e " \
dn: cn=default,ou=policies,dc=$DOMAIN,dc=$TLD
objectClass: top
objectClass: person
objectClass: pwdPolicy
cn: default
sn: default
pwdAllowUserChange: TRUE
# this don't work though documentation says it should
# pwdAttribute: userPassword
# So we use OID for workaround
pwdAttribute: 2.5.4.35
pwdInhistory: 3
pwdLockout: TRUE
pwdLockoutDuration: 1800
pwdMaxAge: 0
pwdMaxFailure: 3
pwdMinLength: 6
pwdMustChange: TRUE
pwdSafeModify: TRUE
# comment for syntax reason (trailing TAB here leads to syntax error when importing)
        " | ldapadd -Q -Y EXTERNAL -H ldapi:///
 
        echo "Generating overlay ..."
 
        echo -e " \
dn: olcOverlay=ppolicy,olcDatabase={1}$LDAPDB,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=$DOMAIN,dc=$TLD
olcPPolicyHashCleartext: FALSE
olcPPolicyUseLockout: FALSE
olcPPolicyForwardUpdates: FALSE
# comment for syntax reason (trailing TAB here leads to syntax error when importing)
        " | ldapadd -Q -Y EXTERNAL -H ldapi:///
 
}
 
# configure_tls()
# does:
#	generating of cert-authority
#	generating of certs for slapd
#	configuring of slapd for using tls
 
configure_tls() {
 
	echo
 
}
 
# toggle_acl()
# sets ACL back to save values after install
 
toggle_acl() {
 
	echo
 
}
 
# debug_output()
# dumps to file:
#	debconf values for slapd
#	complete Root-DN
#	complete cn=config
 
debug_output() {
 
	debconf-show slapd > $LOGFILE
	slapcat >> $LOGFILE
	ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config >> $LOGFILE
 
}
 
 
# cleanldap()
# Removes all of openLDAP
 
cleanldap() {
 
	apt-get remove -y slapd ldap-utils --purge
 
}
 
# main
 
basesetup $PASSWORD $HOSTNAME $LDAPDB
make_index
configure_policy
debug_output
cleanldap

Eigentlich muss man oben nur ein anderes Passwort setzen und am Ende das „cleanldap“ auskommentieren. Da das Ganze noch „Work in Progress“ ist, fehlen noch einige Funktionen:

  1. Konfiguration für TLS
  2. Integration des freeradius-Schemas
  3. Vernünftige ACLs nach Abschluss der Installation setzen

Ja, ich stehe in diesem Jahr ziemlich auf LDAP …

Verzeichnisdienste

Weitgehend unbemerkt von uns Normalsterblichen verrichten unzählige Verzeichnisdienste ihr Werk in verschiedenen Institutionen. Wenn man Netzwerke etwas weiter denkt als auf einen Standort bezogen, kommt man um dieses Thema irgendwann nicht mehr herum. Verzeichnisdienste gelten als sperrig, nur für Eingeweihte zu administrieren und haben immer die Aura des Mysteriösen um sich. Das stimmt übrigens beides. Gleichzeitig sind Verzeichnisdienste das zentrale Element, um Zugänge, Gruppenzugehörigkeiten, Rechte u.v.m. zu managen. Bei Microsoft heißt der Dienst ActiveDirectory (AD), bei unixoiden Betriebssystemen openLDAP. Die Sprache (das Protokoll), mit dem Verzeichnisdienste angesprochen werden, nennt sich LDAP.

Beispielvision:

Die Schulsekretärin gibt einen neuen Schüler in die Schulverwaltung ein, der die Schule gewechselt hat. Gleichzeitig sind damit ein Account auf dem Schulserver, eine E-Mailadresse und ein WLAN-Zugang angelegt und sämtliche Zugänge und Zugriffsberechtigungen auf der alten Schule deaktiviert. Selbstredend ist unser Schüler damit auch gleich den richtigen Gruppen auf der Lernplattform der Schule zugewiesen, in die Schulstatistik eingepflegt und in der Lehrmittelverwaltung mit den korrekten Attributen versehen (z.B. Geschwisterermäßigung bei der Schulbuchausleihe).

Das ist keine Zauberei und erst recht kein Datenschutzgau, sondern der Grund, warum Verzeichnisdienste erfunden worden sind. Schematisch sieht so etwas so aus:

verzeichnisdienst

Wir fangen mal unten an: In einem Verzeichnisdienst sind verschiedene Institutionen angelegt, die z.B. jeweils Nutzer, Gruppen und z.B. Geräte besitzen. Wir schauen uns mal einen Nutzereintrag an:

---------------------------------------------------------------------
| Objektname: Maik Riecken => Nutzer => Schule => Verzeichnisdienst |
|-------------------------------------------------------------------|
| Attribute:  Name                                                  |
|             Nachname                                              |
|             Benutzername                                          |
|             E-Mailadresse                                         |
|             Passwort (verschlüsselt)                              |
---------------------------------------------------------------------

Maik, der zur Institution „Schule“ gehört, möchte jetzt gerne mit seinem Handy im Rathaus surfen. Ein Accesspoint im Rathaus muss jetzt prüfen, ob Maik das auch darf. Dazu fragt er Maik erstmal nach seinem Nutzernamen und seinem Passwort und gibt beides an einen Vermittlerdienst weiter – im WLAN-Bereich über einen wiederum verschlüsselten Weg oft an einen sogenannten RADIUS-Server. Der RADIUS-Server leitet die Anfrage an den Verzeichnisdienst weiter und bekommt eine 1 oder eine 0 zur Antwort. Ist die Antwort 1, bekommt Maik jetzt Zugriff auf das Internet, ist sie 0, muss er leider weiter UMTS oder LTE nutzen. Der Witz an der Sache ist, dass außer sehr wenigen und darüberhinaus auch noch verschlüsselten Daten nur sehr wenig über das Netz geht (Datenschutz).

Für diese Aufgabe kann man auch theoretisch eine Datenbank wie MySQL nutzen. In der Tat erntet man oft Stirnrunzeln, wenn man Leuten vorschlägt, auf einen Verzeichnisdienst umzusteigen. Eine Datenbank kann die gleichen Aufgaben erledigen – aber:

  1. Für Verzeichnisdienste existieren standardisierte Schemata für Objektklassen
  2. Für Verzeichnisdienste existieren genau wegen dieser Schemata in sehr vielen Produkten standardisierte Schnittstellen (Moodle, Owncloud, WordPress, Drupal, Joomla! – fast jedes größere Projekt unterstützt LDAP und damit Single-Sign-On = ein Passwort für alles). Ich kann plattformübergreifend jeden Dienst mit LDAP betreiben, der das LDAP-Protokoll unterstützt. Sogar Apple.
  3. Die Organisation von Institutionen in hierarchischen Bäumen ermöglicht eine sehr granulare und standardisierte Rechtezuweisung, z.B. bekommen Polizei und Schulträger dann nur die Daten, die das jeweilige Landesdatenschutzrecht vorsieht – dafür aber jeweils immer tagesaktuell. Auch die beliebten Schulstatistiken gehören bei entsprechender Implementation der Vergangenheit an und liegen ebenfalls tagesaktuell vor. Niemand kann mehr „einfach so“ Listen mit Daten erstellen, die dem Gebot der Datensparsamkeit nicht genügen – weil es keinen Export mehr gibt und der auch nicht notwendig ist.
  4. Das Protokoll ist „lightweight“ und damit äußerst performant
  5. Wenn man den Verzeichnisdienst als Hauptdatenquelle implementiert, bekommt man über ihn eine Vernetzung verschiedener Applikationen und Institutionen ganz automatisch.

Die Lage in Deutschland sieht leider so aus:

  1. Es gibt kaum Schulverwaltungssoftware, die das kann.
  2. Es ist unklar, wo und von wem ein Verzeichnisdienst betrieben werden kann.
  3. Durch 16 unterschiedliche Datenschutz- bzw. Schulgesetze in den Bundesländern ist es für Anbieter nahezu unmöglich, eine Lösung anzubieten, die sich wirtschaftlich abbilden lässt.
  4. Ein Verzeichnisdienst gehört m.E. generell nicht in die Hand eines Anbieters, sondern ist eine öffentliche Aufgabe – gerade wegen der Kumulation der verschiedensten Daten an einer Stelle – also z.B. in ein kommunales oder Landesrechenzentrum.
  5. Die wenigsten Anbieter sind daran interessiert, standardisierte Schnittstellen anzubieten (oder lassen sich das teuerst vergüten), weil proprietäre Datenhaltung immer ein willkommenes Instrument der Kundenbindung ist – man muss sich nur mal anschauen, welcher Mist (z.B. SCORM in meinen Augen) in der Bildungsindustrie zum „Industrieausstauschstandard“ erklärt wird – obwohl es gut dokumentierte und standardisierte Formate und Protokolle gibt.
  6. Pädagogische und Verwaltungsanforderungen sind nicht immer klar zu trennen. Noten gehören für mich z.B. nicht in einen zentral aufgestellten Dienst.

Wer macht schon sowas in Ansätzen?

Univention ist sehr weit auf diesem Feld und betreut z.B. die Schulverwaltung in Bremen. Die Schleswig-Holsteiner denken Dank des ULD und der Piratenfraktion auch stark in diese Richtung. Ich selbst versuche, diese Lösung immer gleich mit im Blick für die Beratung und Konzeption von Netzwerken zu haben. Sie müssen es jetzt heute nicht können, aber später die Möglichkeit dafür bieten.

 

 

IT-Konzept (technisch)

Wir überarbeiten nach den Ferien unsere komplette IT-Struktur. Ich habe in den letzten Tagen darüber viel nachgedacht und mit Virtualbox fleißig kleine, virtualisierte Netze gebaut. Ziel war es, etwas zu ersinnen, was einerseits technisch für eine Lehrkraft beherrschbar ist, anderseits möglichst viele didaktische Möglichkeiten eröffnet. Zudem spielen natürlich auch Wirtschaftlichkeitsüberlegungen und ökologische Aspekte eine Rolle (man muss es ja dem Schulträger auch vermitteln können). Herausgekommen ist das hier:

Kern ist das LTSP-Projekt. Ein schöner Einstig in das grundsätzliche Prinzip findet sich auf Wikipedia: Man degradiert sämtliche Schülerrechner zu reinen Anzeigegeräten. Festplatten und nicht erforderlichen RAM reißt man heraus, verrammelt das BIOS mit einem Passwort und lässt die Kisten per PXE vom LTSP-Server booten – das muss pro Tag einmal geschehen und dauert kürzer als ein WinXP-Start (Was nicht viel heißen will…).

Damit entfällt sämtliche Turnschuhadministration und auch die empfindlichsten Komponenten von PCs sind eliminiert. Software muss nur noch auf einem Gerät installiert werden und ist dann auf allen Clients verfügbar. Als Anzeigegerät ist ein Pentium I mit 133Mhz und halbwegs brauchbarer Grafikkarte ausreichend. Schön wären natürlich echte ThinClients, am besten in ein LCD-Panel integriert – so dürfte es leise und kühl im PC-Raum werden. Alle Anwendungen laufen auf einem zentralen Server, der natürlich ein Server und kein Spielzeug sein muss (Hexacore, 32GB RAM, RAID10, redundante Netzteile – die 4000-Euro-Klasse halt). Sound kann man bidirektional an die Clients weiterreichen, mit Video klappt es auch, wenn die Anbindung stimmt und man auf HD-Material verzichten mag.

Der Server kann allerdings nur Linux (Ubuntu). Damit kann man surfen, schreiben, Audio bearbeiten u.v.m. – das Wichtigste halt. Die meisten Dienste verlagern sich eh in die Cloud. Es ist nicht schwer, GNOME einen Windows7- oder XP-Look aufzuzwingen – aber das halte ich für eine Art Betrug. Die meisten „Windowsianer“ kommen mit meinem Netbook erstaunlich gut klar und den Desktop kann man ja vorstrukturieren mit netten, einfachen Icons. Mit WINE habe ich bisher zusätzlich fast alle Software zum Laufen gebracht, die auf unseren jetzigen WinXP-Clients vor sich hinvegetiert. Hier sind vor allem mit den Herstellern lizenzrechtliche Fragen zu klären, da es WINE recht egal ist, ob eine Word2010-Instanz 25x von verschiedenen Nutzern gestartet wird…

Dateien lassen sich auf USB-Medien speichern, die LTSP von den Clients durchgereicht bekommt, oder man nutzt NFS (ist bei LTSP leider so) mit festem Quota für jeden Nutzeraccount (gefühlt 1GB, dann würde bei uns noch die 2GB-Platte für die ganze Schulgemeinschaft bei Vollauslastung reichen).

Die Nutzerverwaltung mache ich traditionell über LDAP. Dann kann man den Proxy darüber mit Anmeldung laufen lassen. Außerdem lässt sich das Ding so schön per Skript mit einem kastrierten Export der Schülerdatenbank füttern (inkl. Ordnung nach Klassen) – das Skript gibt es schon für die Anbindung unseres Webangebots. Das ist übrigens der härteste Teil der Geschichte. LDAP hat dafür aber auch den Vorteil, dass es mit RADIUS spricht – ein nettes Spielzeug (man kann in LTSP auch die Clientkonfiguration darüber machen). So meldet man sich per WLAN in der Schule mit den gewohnten Netzwerk-Logindaten an, jeder WLAN-Router kriegt sein eigenes Netz, (dann gehen die IPs so schnell nicht aus) man kann festlegen, wer sich wann anmelden darf (abends braucht man kein Netz, oder?) usw.. Dann noch ein AdHoc-Netz, um das ganze Schulgelände zu bestrahlen… (träum…). Aber das wird eh die Zukunft – mehr als der persönliche Desktop auf dem Schulserver.

Einige Dinge gehen partout nicht unter Linux. Dafür würde ich gerne einen WindowsServer2008RC2 hinstellen, der über 25 Accounts verfügt. Bei der Anmeldung am LTSP kann man sich dann entscheiden, ob man Windows möchte oder nicht und sowohl der Server als auch die Softwarelizenzen sind bei 25 Clients noch überschaubar teuer. Ob man nun einen RDesktop oder die die Ausgabe eines XServers an die Clients weiterleitet, ist wohl egal. Vielleicht lässt sich der WindowsServer sogar virtualisieren, wenn man den LTSP-Server noch dicker… .

Das Schöne an diesem Konzept ist seine Modularität: Man kann klein anfangen und sich dann steigern – allein der LTSP-Server mit seiner Hardware, den braucht man schon. Die Clients sind ja schon da. Wenn man völlig bekloppt sein will, verlegt man alle jetzigen Clients in virtuelle Maschinen und nutzt deren Lizenzen weiter.

Was kostet das Ganze? Im Vollausbau schätze ich eine Summe von 10000,- Euro (ohne Clients und wenn man es selbst macht: LTSP ist in Ubuntu sehr gut vorkonfiguriert und recht schnell aufgesetzt). Wenn man 50 Clients erneuern oder durch Notebooks ersetzen möchte, darf jedes nur 200,- Euro kosten, damit es „billiger“ wird. Für den Anfang tut es auch nur der LTSP-Server und der VLAN-fähige Switch – dann kommt man wohl mit der Hälfte hin und hat recht aktuelle, leicht wartbare Systeme.

Evaluationssystem: Kopplung des LDAP mit Moodle

Vorausgesetzt wird, dass Moodle auf dem gleichen Server wir der eingerichtete und mit Daten befüllte slapd läuft. Schematisch ist diese Anleitung ganz allgemein verwendbar, um Moodle ein einen openLDAP-Server zu koppeln. Die „Bulkuploadleute“ brauchen diese Anleitung nicht…

Zunächst einmal müssen wir sicherstellen, dass die Authentifizierng über openLDAP überhaupt in Moodle aktiviert ist. Dazu klicken Sie im Administrationsmenu

Website-Administration => Nutzer/innen => Authentifizierung => Übersicht

auf das geschlossene Auge bei „LDAP-Server“, so es denn noch geschlossen ist. Durch das Aktivieren der LDAP-Aurhentifizierung bleiben übrigens alle übrigen Authentifizierungsmethoden funktionsfähig. Jetzt erscheint im Menu

Website-Administration => Authentifizierung

ein neuer Eintrag mit dem Namen „LDAP-Server„, den es anzuklicken gilt. Es folgt eine umfangreiche Konfigurationsseite. Ich hangle mich mich jetzt nur durch die Felder hindurch, die geändert oder mit Daten befüllt werden müssen. Alle anderen Felder bleiben jungfräulich. Es werden folgende Angaben aus dem vorherigen Schritt benötigt:

  • Wert der Variablen $organisation (evaluation)
  • Wert der Variablen $domain (schuldomain)
  • Wert der Variablen $tld (tld)

Ich nenne zunächst das Konfigurationsfeld gefolgt von einem Pfeil (=>), hinter dem der einzutragende Inhalt steht.

Weiterlesen

LDAP: Schulfotoseitenzugriff auf Schulöffentlichkeit beschränken

Bilder von Schülerinnen und Schülern sind oft ein Problem – vor allem dann, wenn man sie veröffentlich und das vielleicht sogar noch so tut, dass Namen einem bestimmten Foto zugeordnet werden können. In einigen Bundesländern ist das sogar strikt verboten.

Auch hier kann LDAP abmildern: Man nutzt ein Schul-LDAP als „Zapfstelle“ für eine HTTP-basierte Authentifizierung, die vielen bestimmt bekannt ist (.htaccess).

Mit meinem Lieblingswebserver (lighty) geht das sehr leicht – das auth-Modul muss allerdings aktiviert sein.

server.modules                += ( „mod_auth“ )

auth.backend                 = „ldap“

auth.backend.ldap.hostname   = „127.0.0.1“
auth.backend.ldap.base-dn    = „ou=ldapbaum,dc=foo,dc=tld“
auth.backend.ldap.filter     = „(uid=$)“

$HTTP[„host“] == „subdomain.fuer.fotos“ {
auth.require = (   „“ => (
„method“  => „basic“,
„realm“   => „Anmeldung bitte mit Schulogin und -passwort fuer die Seite „,
„require“ => „valid-user“
)
)
}

… und schon ist nach einem /etc/init.d/lighttpd force-reload der Zugriff auf die Seite http://subdomain.fuer.fotos mit allen Unterseiten nicht mehr ohne Anmeldung möglich, wenn lokal der LDAP-Server oder eine Kopie bzw. Replikation davon mitläuft. So kann sich der der potentielle Kinderschänder nicht mehr ohne Weiteres sein nächstes Opfer anhand des letzten Schwimmwettbewerbsbildes auswählen – es sei denn, er kommt selbst von der Schule (zugegebenermaßen eine sehr düstere Option). Ingesamt nett und simpel.

Wenn man das jetzt noch mit WebDAV und Moodle kombiniert, kann man sogar einzelnen Lehrkräften Schreibrechte in bestimmten Moodleordnern einräumen. Da Lighty reguläre Ausdrücke unterstützt, müsste das sogar recht schmerzfrei gehen. Aber das ist eine andere Geschichte…

1 2