OpenLDAP automatisch installieren und einrichten

Ich habe heu­te ein Script geschrie­ben, wel­ches OpenLDAP auf Debi­an­sys­te­men auto­ma­tisch instal­lie­ren und auch gleich für ppo­li­cy kon­fi­gu­rie­ren kann. Wer sowas schon­mal von Hand gemacht hat, weiß um die Schwie­rig­kei­ten. Es soll­te auf den meis­ten Debi­an­de­ri­va­ten funk­tio­nie­ren (ent­wi­ckelt habe ich auf stretch), ist aber leicht anpass­bar, da ich alle Ein­zel­schrit­te in Funk­tio­nen 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

Eigent­lich muss man oben nur ein ande­res Pass­wort set­zen und am Ende das „cle­anldap“ aus­kom­men­tie­ren. Da das Gan­ze noch „Work in Pro­gress“ ist, feh­len noch eini­ge Funktionen:

  1. Kon­fi­gu­ra­ti­on für TLS
  2. Inte­gra­ti­on des freeradius-Schemas
  3. Ver­nünf­ti­ge ACLs nach Abschluss der Instal­la­ti­on setzen

Ja, ich ste­he in die­sem Jahr ziem­lich auf LDAP …

Medien in der Schule vorhalten

Es gibt sie noch. Die Rega­le mit den Video­kas­set­ten aus grau­er Vor­zeit, die immer wie­der uner­laubt im Unter­richt her­hal­ten müs­sen, wenn es um das Zei­gen vor­geb­lich legen­dä­rer Ver­fil­mun­gen lite­ra­ri­scher Klein­ode geht um eigent­lich nur bewei­sen zu kön­nen, dass der Film eh nicht an das Ori­gi­nal her­an­kommt – stimmt ja auch: Die Hälf­te des Films ist durch Bild­stö­run­gen und Ton­aus­set­zer sowie­so nicht zu sehen.

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

Dann kam die DVD. End­lich ohne Schwie­rig­kei­ten zu bestimm­ten Kapi­teln sprin­gen oder sogar Wie­der­ho­lungs­schlei­fen pro­gram­mie­ren. Das Inter­face des DVD-Play­ers sah auch ähn­lich aus wie das des VHS-Rekor­ders und der Fern­se­her dar­über ist noch ein Fern­se­her – kennt man also. Dumm nur, dass extern gela­ger­te Sicher­heits­ko­pien von Ori­gi­nal-CDs, natür­lich mit allen Vor­führ­rech­ten, in stun­den­lan­ger Klein­ar­beit am hei­mi­schen PC gefer­tigt, in man­chen Play­ern ein­fach nicht lau­fen woll­ten. DVD‑R, DVD+R, DVD-RW, DVD+RW, DVD-RAM – frisst er es oder frisst er es nicht?  Film oder Stil­l­ar­beit – das ist hier die Frage!

Wäre es nicht schön…

  • … wenn ich frei wäh­len könn­te, mit wel­chem Gerät ich eine Datei abspiele?
  • … wenn unter­schied­li­che Gerä­te zur Wie­der­ga­be in einer Schu­le zur Ver­fü­gung stünden?
  • … wenn ich mei­ne Datei­en auch mit ande­ren tei­len könnte?
  • … wenn ande­re gleich­zei­tig zeit­ver­setzt die glei­che Datei abspie­len könnten?
  • … wenn ich das Inter­face vor­ge­be und nicht so eine blö­der, lang­haa­ri­ger Administrator?

Mit digi­ta­len Medi­en geht das erst­mal prin­zi­pi­ell. Man braucht aber immer sowas wie einen Com­pu­ter für die Wie­der­ga­be. Dabei funk­tio­niert das mit den DVD-Play­ern doch ganz gut.

DLNA als Lösungsansatz

DLNA (manch­mal auch upnp) ist eine klas­si­sche Midd­le­wa­re­lö­sung: Ein Ser­ver küm­mert sich um das Auf­fin­den und Indi­zie­ren von Medi­en und kom­mu­ni­ziert mit ver­schie­de­nen End­ge­rä­ten, Pro­gram­men oder Apps („Cli­ents“) z.B.

  • ein Note­book mit Win­dows Media Player
  • ein Handy/Tablet mit ent­spre­chen­der App
  • ein Bea­mer mit ein­ge­bau­tem DLNA-Client
  • ein Flach­bild­fern­se­her
  • eine Strea­ming­box, z.B. eine WD-Live

Nicht umsonst habe ich exem­pla­risch auf eine WD-Live ver­wie­sen: Man kann so eine Kis­te ein­fach mit in den Fern­seh­wa­gen packen, sie fühlt sich an wie ein grö­ßen­wahn­sin­ni­ger SAT-Recei­ver, den man von zu Hau­se kennt (und meist bedie­nen kann, da Fern­se­hen ja eine weit ver­brei­te­te Kul­tur­tech­nik darstellt).

Mit DLNA steu­ern nerdi­ge Men­schen schon heu­te ihre Hifi-Kom­po­nen­ten z.B. vom iPad aus, da DLNA auch die Steue­rung von Play­ern („Ren­de­rern“) über das Netz­werk zulässt. Man kann die Fern­be­die­nung der Strea­ming­box oder das eige­ne Han­dy neh­men – ganz nach Wunsch und Gewohnheit.

Sehr vie­le Gerä­te sind DLNA-fähig, z.B. bestimm­te exter­ne Fest­plat­ten, sodass man sich um die Kon­fi­gu­ra­ti­on nicht zu küm­mern braucht: Die Plat­te (nach­voll­zieh­ba­re Ord­ner­struk­tur vor­aus­ge­setzt) mit Medi­en befül­len, ins Schul­netz­werk ein­bin­den und schon kann es losgehen.

DLNA-Ser­ver sen­den per UDP. Es ist ihnen schnurz­pie­pe, ob die Daten auf der Gegen­sei­te ankom­men, weil Strea­ming nun­mal zeit­kri­tisch ist und Feh­ler­kor­rek­tur da nur stört oder das gan­ze Medi­um dann stockt – kennt man von You­Tube-Vide­os bei schma­ler Anbindung.

DLNA-Ser­ver selbst gemacht

Medi­atomb ist ein frei­er DLNA-Ser­ver, der oft zum Ein­satz kommt. Er lässt sich auf allen Debi­an­de­ri­va­ten (auch bei IServ…) mit einem

apt-get install mediatomb

auf die Plat­te holen und funk­tio­niert dann auch schon „out-of-the-box“. Das Web­in­ter­face des Ser­vers ist unter dem Port 49152 zu errei­chen (muss ggf. noch akti­viert wer­den, s.u.) und sieht dann so aus:

Ein Klick oben auf „File­sys­tem“ ermög­licht das Brow­sen durch das Datei­sys­tem des Ser­vers. In die­sem Bei­spiel lie­gen die Medi­en­da­tei­en unter /home/musik. Ein Klick auf das Plus­zei­chen oben rechts sorgt dafür, dass nun die Medi­en des selek­tier­ten Ord­ners in den Kata­log des Medi­en­ser­vers auf­ge­nom­men wer­den. Man kann das auch auto­ma­ti­sie­ren und einen Ord­ner regel­mä­ßig scan­nen las­sen. Dabei liest Medi­atomb natür­lich auch ID-Tags aus und stellt so zusätz­li­che Sor­tier­funk­tio­nen, etwa nach Inter­pret oder Titel bereit. Für unse­re Lösung an der Schu­le habe ich noch fol­gen­de Ver­än­de­run­gen an der Kon­fi­gu­ra­ti­ons­da­tei vor­ge­nom­men, die man bei Debi­an­de­ri­va­ten unter

/etc/mediatomb/config.xml

fin­det:

    <ui enab­led=„yes“ show-tooltips=„yes“>
      <accounts enab­led=„yes“ session-timeout=„30“>
        <account user=„medi­atomb“ pass­word=„geheim“/>
      </accounts>
    </ui>
    <name>Medi­aTomb</name>

Unter <ui> wird die Ober­flä­che ein­ge­schal­tet, der Pass­wort­schutz für das Web­in­ter­face akti­viert und ein Name fest­ge­legt, mit dem sich der Ser­ver beim Cli­ent meldet.

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

Etwas wei­ter unten sor­gen zwei zusätz­li­che Ein­trä­ge dafür, dass Umlau­te und Son­der­zei­chen kor­rekt umge­setzt und an den Cli­ent wei­ter­ge­ge­ben werden.

Wenn man auf einem IServ medi­atomb in einem belie­bi­gen Grup­pen­ver­zeich­nis suchen lässt (bes­ser ist aller­dings eine eige­ne VM oder ein eige­ner phy­si­ka­li­scher Medi­en­ser­ver), kann ich z.B. abends eine Datei ins Schul­netz­werk hoch­la­den, die dann im gesam­ten Netz­werk von belie­bi­gen DLNA-fähi­gen Gerä­ten genutzt wer­den kann – ganz automatisch.

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

Jein. In Nie­der­sach­sen sind vie­le sehr vie­le Medi­en inkl. Schul­funk­sen­dun­gen Lan­des­li­zen­zen erwor­ben wor­den, die nur inner­halb des Schul­net­zes wei­ter­ver­brei­tet wer­den dür­fen. Wei­ter­hin kann ich not­wen­di­ge Band­brei­ten inner­halb des Schul­net­zes um den Fak­tor 10–20 güns­ti­ger garan­tie­ren als über UMTS/LTE und Co. Ich fin­de den Gedan­ken reiz­voll, dass ich auch SuS eine Datei zen­tral nur Ver­fü­gung stel­len kann, die sie dann in ihrem Tem­po mit z.B. dem eige­nen Han­dy nut­zen kön­nen – ein­fach durch eine kur­ze Navi­ga­ti­on im DLNA-Cli­ent, so lan­ge sie im Schul­netz ein­ge­bucht sind. Nicht zu ver­ach­ten fin­de ich, dass jemand, der von einem Video­re­kor­der kommt, sich bei einer Strea­ming­box weit weni­ger umstel­len muss als bei z.B. einer Rech­ner-/Bea­mer­kom­bi­na­ti­on – es ist auch eine Fern­be­die­nung mit Play/Stop/RW/FF/Pause. Die Viel­zahl der ver­wend­ba­ren End­ge­rä­te und Ober­flä­chen (Apps) dürf­te jedem etwas bieten.

Nach­tei­le

DLNA ist für den Con­su­mer­be­reich kon­zi­piert, d.h. es soll­te schnell und unkom­pli­ziert lau­fen. Daher bringt DLNA kei­ne Nut­zer­ver­wal­tung mit. Jeder im Netz­werk kann mit dem DLNA-Ser­ver kom­mu­ni­zie­ren, der des­halb immer auf einer sepa­ra­ten Maschi­ne lau­fen soll­te. Akti­ve Ren­de­rer kön­nen von jedem Cli­ent aus gesteu­ert wer­den: Ich kann als Schü­ler sehen, dass auf dem Fern­se­her im Gebäu­de x gera­de Film y läuft und die­sen stop­pen oder gar durch einen ande­ren Film vom Medi­en­ser­ver erset­zen. Das lässt sich aber mit Fire­wall- und Rou­ting­ein­stel­lun­gen in den Griff bekom­men – oder durch päd­ago­gi­sche Ver­ein­ba­run­gen lösen.