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 …

Medien in der Schule vorhalten

Es gibt sie noch. Die Regale mit den Videokassetten aus grauer Vorzeit, die immer wieder unerlaubt im Unterricht herhalten müssen, wenn es um das Zeigen vorgeblich legendärer Verfilmungen literarischer Kleinode geht um eigentlich nur beweisen zu können, dass der Film eh nicht an das Original herankommt – stimmt ja auch: Die Hälfte des Films ist durch Bildstörungen und Tonaussetzer sowieso nicht zu sehen.

www.ml-media.martinlietz.de / pixelio.de

Dann kam die DVD. Endlich ohne Schwierigkeiten zu bestimmten Kapiteln springen oder sogar Wiederholungsschleifen programmieren. Das Interface des DVD-Players sah auch ähnlich aus wie das des VHS-Rekorders und der Fernseher darüber ist noch ein Fernseher – kennt man also. Dumm nur, dass extern gelagerte Sicherheitskopien von Original-CDs, natürlich mit allen Vorführrechten, in stundenlanger Kleinarbeit am heimischen PC gefertigt, in manchen Playern einfach nicht laufen wollten. DVD-R, DVD+R, DVD-RW, DVD+RW, DVD-RAM – frisst er es oder frisst er es nicht?  Film oder Stillarbeit – das ist hier die Frage!

Wäre es nicht schön…

  • … wenn ich frei wählen könnte, mit welchem Gerät ich eine Datei abspiele?
  • … wenn unterschiedliche Geräte zur Wiedergabe in einer Schule zur Verfügung stünden?
  • … wenn ich meine Dateien auch mit anderen teilen könnte?
  • … wenn andere gleichzeitig zeitversetzt die gleiche Datei abspielen könnten?
  • … wenn ich das Interface vorgebe und nicht so eine blöder, langhaariger Administrator?

Mit digitalen Medien geht das erstmal prinzipiell. Man braucht aber immer sowas wie einen Computer für die Wiedergabe. Dabei funktioniert das mit den DVD-Playern doch ganz gut.

DLNA als Lösungsansatz

DLNA (manchmal auch upnp) ist eine klassische Middlewarelösung: Ein Server kümmert sich um das Auffinden und Indizieren von Medien und kommuniziert mit verschiedenen Endgeräten, Programmen oder Apps („Clients“) z.B.

  • ein Notebook mit Windows Media Player
  • ein Handy/Tablet mit entsprechender App
  • ein Beamer mit eingebautem DLNA-Client
  • ein Flachbildfernseher
  • eine Streamingbox, z.B. eine WD-Live

Nicht umsonst habe ich exemplarisch auf eine WD-Live verwiesen: Man kann so eine Kiste einfach mit in den Fernsehwagen packen, sie fühlt sich an wie ein größenwahnsinniger SAT-Receiver, den man von zu Hause kennt (und meist bedienen kann, da Fernsehen ja eine weit verbreitete Kulturtechnik darstellt).

Mit DLNA steuern nerdige Menschen schon heute ihre Hifi-Komponenten z.B. vom iPad aus, da DLNA auch die Steuerung von Playern („Renderern“) über das Netzwerk zulässt. Man kann die Fernbedienung der Streamingbox oder das eigene Handy nehmen – ganz nach Wunsch und Gewohnheit.

Sehr viele Geräte sind DLNA-fähig, z.B. bestimmte externe Festplatten, sodass man sich um die Konfiguration nicht zu kümmern braucht: Die Platte (nachvollziehbare Ordnerstruktur vorausgesetzt) mit Medien befüllen, ins Schulnetzwerk einbinden und schon kann es losgehen.

DLNA-Server senden per UDP. Es ist ihnen schnurzpiepe, ob die Daten auf der Gegenseite ankommen, weil Streaming nunmal zeitkritisch ist und Fehlerkorrektur da nur stört oder das ganze Medium dann stockt – kennt man von YouTube-Videos bei schmaler Anbindung.

DLNA-Server selbst gemacht

Mediatomb ist ein freier DLNA-Server, der oft zum Einsatz kommt. Er lässt sich auf allen Debianderivaten (auch bei IServ…) mit einem

apt-get install mediatomb

auf die Platte holen und funktioniert dann auch schon „out-of-the-box“. Das Webinterface des Servers ist unter dem Port 49152 zu erreichen (muss ggf. noch aktiviert werden, s.u.) und sieht dann so aus:

Ein Klick oben auf „Filesystem“ ermöglicht das Browsen durch das Dateisystem des Servers. In diesem Beispiel liegen die Mediendateien unter /home/musik. Ein Klick auf das Pluszeichen oben rechts sorgt dafür, dass nun die Medien des selektierten Ordners in den Katalog des Medienservers aufgenommen werden. Man kann das auch automatisieren und einen Ordner regelmäßig scannen lassen. Dabei liest Mediatomb natürlich auch ID-Tags aus und stellt so zusätzliche Sortierfunktionen, etwa nach Interpret oder Titel bereit. Für unsere Lösung an der Schule habe ich noch folgende Veränderungen an der Konfigurationsdatei vorgenommen, die man bei Debianderivaten unter

/etc/mediatomb/config.xml

findet:

    <ui enabled=“yes“ show-tooltips=“yes“>
      <accounts enabled=“yes“ session-timeout=“30″>
        <account user=“mediatomb“ password=“geheim„/>
      </accounts>
    </ui>
    <name>MediaTomb</name>

Unter <ui> wird die Oberfläche eingeschaltet, der Passwortschutz für das Webinterface aktiviert und ein Name festgelegt, mit dem sich der Server beim Client meldet.

<import hidden-files=“no“>
    <filesystem-charset>UTF-8</filesystem-charset>
    <metadata-charset>UTF-8</metadata-charset>

Etwas weiter unten sorgen zwei zusätzliche Einträge dafür, dass Umlaute und Sonderzeichen korrekt umgesetzt und an den Client weitergegeben werden.

Wenn man auf einem IServ mediatomb in einem beliebigen Gruppenverzeichnis suchen lässt (besser ist allerdings eine eigene VM oder ein eigener physikalischer Medienserver), kann ich z.B. abends eine Datei ins Schulnetzwerk hochladen, die dann im gesamten Netzwerk von beliebigen DLNA-fähigen Geräten genutzt werden kann – ganz automatisch.

Ja, gibt’s denn dafür nicht das Internet?

Jein. In Niedersachsen sind viele sehr viele Medien inkl. Schulfunksendungen Landeslizenzen erworben worden, die nur innerhalb des Schulnetzes weiterverbreitet werden dürfen. Weiterhin kann ich notwendige Bandbreiten innerhalb des Schulnetzes um den Faktor 10-20 günstiger garantieren als über UMTS/LTE und Co. Ich finde den Gedanken reizvoll, dass ich auch SuS eine Datei zentral nur Verfügung stellen kann, die sie dann in ihrem Tempo mit z.B. dem eigenen Handy nutzen können – einfach durch eine kurze Navigation im DLNA-Client, so lange sie im Schulnetz eingebucht sind. Nicht zu verachten finde ich, dass jemand, der von einem Videorekorder kommt, sich bei einer Streamingbox weit weniger umstellen muss als bei z.B. einer Rechner-/Beamerkombination – es ist auch eine Fernbedienung mit Play/Stop/RW/FF/Pause. Die Vielzahl der verwendbaren Endgeräte und Oberflächen (Apps) dürfte jedem etwas bieten.

Nachteile

DLNA ist für den Consumerbereich konzipiert, d.h. es sollte schnell und unkompliziert laufen. Daher bringt DLNA keine Nutzerverwaltung mit. Jeder im Netzwerk kann mit dem DLNA-Server kommunizieren, der deshalb immer auf einer separaten Maschine laufen sollte. Aktive Renderer können von jedem Client aus gesteuert werden: Ich kann als Schüler sehen, dass auf dem Fernseher im Gebäude x gerade Film y läuft und diesen stoppen oder gar durch einen anderen Film vom Medienserver ersetzen. Das lässt sich aber mit Firewall- und Routingeinstellungen in den Griff bekommen – oder durch pädagogische Vereinbarungen lösen.