Radiusserver gegen LDAP authentifizieren lassen

Allgemein

Die­ser Ein­trag basiert auf die­ser Ori­gi­nal­an­lei­tung. free­ra­di­us ist ein Authen­ti­fi­zie­rungs­ser­ver, der nach außen das Radi­us­pro­to­koll bereit­stellt. Über die­ses Pro­to­koll kann man sich z.B. an einem WLAN anmel­den, ohne die Zugangs­da­ten für OpenLDAP oder jede belie­bi­ge ande­re Authen­ti­fi­zie­rungs­quel­le zu ken­nen und ver­tei­len zu müs­sen. Wenn ein zen­tra­ler Ver­zeich­nis­dienst kon­fi­gu­riert ist, wer­den z.B. sehr ein­fach Din­ge mög­lich wie ein kreis­wei­tes WLAN. In den Schu­len muss dann ledig­lich ein neu­es WLAN-Netz kon­fi­gu­riert wer­den, wel­ches gegen unse­ren zen­tra­len Radi­us authen­ti­fi­ziert und schon kann ich als Leh­rer der Schu­le A im Netz der Schu­le B z.B. bei Fort­bil­dung das WLAN nutzen.

Radiusschema in OpenLDAP integrieren

Damit die Authen­ti­fi­zie­rung über Radi­us mit alle denk­ba­ren Funk­tio­nen klappt, soll­te man ein neu­es Sche­ma zu OpenLDAP hin­zu­fü­gen. Es funk­tio­niert auch ohne, nur kommt man bei spä­te­ren Erwei­te­rungs­w­üb­schen schnell an Gren­zen. Hier ist ein Sche­ma bereits vor­be­rei­tet (freeradius_schema.ldif), wel­ches free­ra­di­us als Text­da­tei mit­bringt. Es lässt sich direkt über die Kon­so­le in cn=config einspielen.

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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
dn: cn=freeradius,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: freeradius
olcAttributeTypes: {0}( 1.3.6.1.4.1.3317.4.3.1.1 NAME 'radiusArapFeatures' DES
 C '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-
 VALUE )
olcAttributeTypes: {1}( 1.3.6.1.4.1.3317.4.3.1.2 NAME 'radiusArapSecurity' DES
 C '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-
 VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.3317.4.3.1.3 NAME 'radiusArapZoneAccess' D
 ESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGL
 E-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.3317.4.3.1.44 NAME 'radiusAuthType' DESC '
 checkItem: Auth-Type' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115
 .121.1.26 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.3317.4.3.1.4 NAME 'radiusCallbackId' DESC 
 'replyItem: Callback-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.
 115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.3317.4.3.1.5 NAME 'radiusCallbackNumber' D
 ESC 'replyItem: Callback-Number' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4
 .1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.3317.4.3.1.6 NAME 'radiusCalledStationId' 
 DESC 'checkItem: Called-Station-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.
 1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.3317.4.3.1.7 NAME 'radiusCallingStationId'
  DESC 'checkItem: Calling-Station-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.
 6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.3317.4.3.1.8 NAME 'radiusClass' DESC 'repl
 yItem: Class' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.2
 6 )
olcAttributeTypes: {9}( 1.3.6.1.4.1.3317.4.3.1.45 NAME 'radiusClientIPAddress'
  DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SIN
 GLE-VALUE )
olcAttributeTypes: {10}( 1.3.6.1.4.1.3317.4.3.1.9 NAME 'radiusFilterId' DESC '
 replyItem: Filter-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115
 .121.1.26 )
olcAttributeTypes: {11}( 1.3.6.1.4.1.3317.4.3.1.10 NAME 'radiusFramedAppleTalk
 Link' DESC 'replyItem: Framed-AppleTalk-Link' EQUALITY caseIgnoreIA5Match SYN
 TAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {12}( 1.3.6.1.4.1.3317.4.3.1.11 NAME 'radiusFramedAppleTalk
 Network' DESC 'replyItem: Framed-AppleTalk-Network' EQUALITY caseIgnoreIA5Mat
 ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {13}( 1.3.6.1.4.1.3317.4.3.1.12 NAME 'radiusFramedAppleTalk
 Zone' DESC 'replyItem: Framed-AppleTalk-Zone' EQUALITY caseIgnoreIA5Match SYN
 TAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {14}( 1.3.6.1.4.1.3317.4.3.1.13 NAME 'radiusFramedCompressi
 on' DESC 'replyItem: Framed-Compression' EQUALITY caseIgnoreIA5Match SYNTAX 1
 .3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {15}( 1.3.6.1.4.1.3317.4.3.1.14 NAME 'radiusFramedIPAddress
 ' DESC 'replyItem: Framed-IP-Address' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.
 6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {16}( 1.3.6.1.4.1.3317.4.3.1.15 NAME 'radiusFramedIPNetmask
 ' DESC 'replyItem: Framed-IP-Netmask' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.
 6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {17}( 1.3.6.1.4.1.3317.4.3.1.16 NAME 'radiusFramedIPXNetwor
 k' DESC 'replyItem: Framed-IPX-Network' EQUALITY caseIgnoreIA5Match SYNTAX 1.
 3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {18}( 1.3.6.1.4.1.3317.4.3.1.17 NAME 'radiusFramedMTU' DESC
  'replyItem: Framed-MTU' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.
 115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {19}( 1.3.6.1.4.1.3317.4.3.1.18 NAME 'radiusFramedProtocol'
  DESC 'replyItem: Framed-Protocol' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1
 .4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {20}( 1.3.6.1.4.1.3317.4.3.1.19 NAME 'radiusFramedRoute' DE
 SC 'replyItem: Framed-Route' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1
 466.115.121.1.26 )
olcAttributeTypes: {21}( 1.3.6.1.4.1.3317.4.3.1.20 NAME 'radiusFramedRouting' 
 DESC 'replyItem: Framed-Routing' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4
 .1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {22}( 1.3.6.1.4.1.3317.4.3.1.46 NAME 'radiusGroupName' DESC
  '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {23}( 1.3.6.1.4.1.3317.4.3.1.47 NAME 'radiusHint' DESC '' E
 QUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE 
 )
olcAttributeTypes: {24}( 1.3.6.1.4.1.3317.4.3.1.48 NAME 'radiusHuntgroupName' 
 DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {25}( 1.3.6.1.4.1.3317.4.3.1.21 NAME 'radiusIdleTimeout' DE
 SC 'replyItem: Idle-Timeout' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1
 466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {26}( 1.3.6.1.4.1.3317.4.3.1.22 NAME 'radiusLoginIPHost' DE
 SC 'replyItem: Login-IP-Host' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.
 1466.115.121.1.26 )
olcAttributeTypes: {27}( 1.3.6.1.4.1.3317.4.3.1.23 NAME 'radiusLoginLATGroup' 
 DESC 'replyItem: Login-LAT-Group' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.
 4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {28}( 1.3.6.1.4.1.3317.4.3.1.24 NAME 'radiusLoginLATNode' D
 ESC 'replyItem: Login-LAT-Node' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.
 1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {29}( 1.3.6.1.4.1.3317.4.3.1.25 NAME 'radiusLoginLATPort' D
 ESC 'replyItem: Login-LAT-Port' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.
 1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {30}( 1.3.6.1.4.1.3317.4.3.1.26 NAME 'radiusLoginLATService
 ' DESC 'replyItem: Login-LAT-Service' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.
 6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {31}( 1.3.6.1.4.1.3317.4.3.1.27 NAME 'radiusLoginService' D
 ESC 'replyItem: Login-Service' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1
 .1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {32}( 1.3.6.1.4.1.3317.4.3.1.28 NAME 'radiusLoginTCPPort' D
 ESC 'replyItem: Login-TCP-Port' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.
 1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {33}( 1.3.6.1.4.1.3317.4.3.1.29 NAME 'radiusPasswordRetry' 
 DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SING
 LE-VALUE )
olcAttributeTypes: {34}( 1.3.6.1.4.1.3317.4.3.1.30 NAME 'radiusPortLimit' DESC
  'replyItem: Port-Limit' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.
 115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {35}( 1.3.6.1.4.1.3317.4.3.1.49 NAME 'radiusProfileDn' DESC
  '' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SING
 LE-VALUE )
olcAttributeTypes: {36}( 1.3.6.1.4.1.3317.4.3.1.31 NAME 'radiusPrompt' DESC ''
  EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALU
 E )
olcAttributeTypes: {37}( 1.3.6.1.4.1.3317.4.3.1.50 NAME 'radiusProxyToRealm' D
 ESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGL
 E-VALUE )
olcAttributeTypes: {38}( 1.3.6.1.4.1.3317.4.3.1.51 NAME 'radiusReplicateToReal
 m' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 S
 INGLE-VALUE )
olcAttributeTypes: {39}( 1.3.6.1.4.1.3317.4.3.1.52 NAME 'radiusRealm' DESC '' 
 EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE
  )
olcAttributeTypes: {40}( 1.3.6.1.4.1.3317.4.3.1.32 NAME 'radiusServiceType' DE
 SC 'replyItem: Service-Type' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1
 466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {41}( 1.3.6.1.4.1.3317.4.3.1.33 NAME 'radiusSessionTimeout'
  DESC 'replyItem: Session-Timeout' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1
 .4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {42}( 1.3.6.1.4.1.3317.4.3.1.34 NAME 'radiusTerminationActi
 on' DESC 'replyItem: Termination-Action' EQUALITY caseIgnoreIA5Match SYNTAX 1
 .3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {43}( 1.3.6.1.4.1.3317.4.3.1.35 NAME 'radiusTunnelAssignmen
 tId' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
  )
olcAttributeTypes: {44}( 1.3.6.1.4.1.3317.4.3.1.36 NAME 'radiusTunnelMediumTyp
 e' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {45}( 1.3.6.1.4.1.3317.4.3.1.37 NAME 'radiusTunnelPassword'
  DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SIN
 GLE-VALUE )
olcAttributeTypes: {46}( 1.3.6.1.4.1.3317.4.3.1.38 NAME 'radiusTunnelPreferenc
 e' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {47}( 1.3.6.1.4.1.3317.4.3.1.39 NAME 'radiusTunnelPrivateGr
 oupId' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.
 26 )
olcAttributeTypes: {48}( 1.3.6.1.4.1.3317.4.3.1.40 NAME 'radiusTunnelServerEnd
 point' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.
 26 )
olcAttributeTypes: {49}( 1.3.6.1.4.1.3317.4.3.1.41 NAME 'radiusTunnelType' DES
 C '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {50}( 1.3.6.1.4.1.3317.4.3.1.42 NAME 'radiusVSA' DESC '' EQ
 UALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {51}( 1.3.6.1.4.1.3317.4.3.1.43 NAME 'radiusTunnelClientEnd
 point' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.
 26 )
olcAttributeTypes: {52}( 1.3.6.1.4.1.3317.4.3.1.53 NAME 'radiusSimultaneousUse
 ' DESC 'checkItem: Simultaneous-Use' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SIN
 GLE-VALUE )
olcAttributeTypes: {53}( 1.3.6.1.4.1.3317.4.3.1.54 NAME 'radiusLoginTime' DESC
  '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-V
 ALUE )
olcAttributeTypes: {54}( 1.3.6.1.4.1.3317.4.3.1.55 NAME 'radiusUserCategory' D
 ESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGL
 E-VALUE )
olcAttributeTypes: {55}( 1.3.6.1.4.1.3317.4.3.1.56 NAME 'radiusStripUserName' 
 DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {56}( 1.3.6.1.4.1.3317.4.3.1.57 NAME 'dialupAccess' DESC ''
  EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALU
 E )
olcAttributeTypes: {57}( 1.3.6.1.4.1.3317.4.3.1.58 NAME 'radiusExpiration' DES
 C 'checkItem: Expiration' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466
 .115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {58}( 1.3.6.1.4.1.3317.4.3.1.59 NAME 'radiusCheckItem' DESC
  'checkItem: $GENERIC$' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.1
 15.121.1.26 )
olcAttributeTypes: {59}( 1.3.6.1.4.1.3317.4.3.1.60 NAME 'radiusReplyItem' DESC
  'replyItem: $GENERIC$' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.1
 15.121.1.26 )
olcAttributeTypes: {60}( 1.3.6.1.4.1.3317.4.3.1.61 NAME 'radiusNASIpAddress' D
 ESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGL
 E-VALUE )
olcAttributeTypes: {61}( 1.3.6.1.4.1.3317.4.3.1.62 NAME 'radiusReplyMessage' D
 ESC 'replyItem: Reply-Message' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1
 .1466.115.121.1.26 )
olcObjectClasses: {0}( 1.3.6.1.4.1.3317.4.3.2.1 NAME 'radiusprofile' DESC '' S
 UP top AUXILIARY MUST cn MAY ( radiusArapFeatures $ radiusArapSecurity $ radi
 usArapZoneAccess $ radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $
  radiusCalledStationId $ radiusCallingStationId $ radiusClass $ radiusClientI
 PAddress $ radiusFilterId $ radiusFramedAppleTalkLink $ radiusFramedAppleTalk
 Network $ radiusFramedAppleTalkZone $ radiusFramedCompression $ radiusFramedI
 PAddress $ radiusFramedIPNetmask $ radiusFramedIPXNetwork $ radiusFramedMTU $
  radiusFramedProtocol $ radiusCheckItem $ radiusReplyItem $ radiusFramedRoute
  $ radiusFramedRouting $ radiusIdleTimeout $ radiusGroupName $ radiusHint $ r
 adiusHuntgroupName $ radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLAT
 Node $ radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $ radi
 usLoginTCPPort $ radiusLoginTime $ radiusPasswordRetry $ radiusPortLimit $ ra
 diusPrompt $ radiusProxyToRealm $ radiusRealm $ radiusReplicateToRealm $ radi
 usServiceType $ radiusSessionTimeout $ radiusStripUserName $ radiusTerminatio
 nAction $ radiusTunnelClientEndpoint $ radiusProfileDn $ radiusSimultaneousUs
 e $ radiusTunnelAssignmentId $ radiusTunnelMediumType $ radiusTunnelPassword 
 $ radiusTunnelPreference $ radiusTunnelPrivateGroupId $ radiusTunnelServerEnd
 point $ radiusTunnelType $ radiusUserCategory $ radiusVSA $ radiusExpiration 
 $ dialupAccess $ radiusNASIpAddress $ radiusReplyMessage ) )
olcObjectClasses: {1}( 1.3.6.1.4.1.3317.4.3.2.2 NAME 'radiusObjectProfile' DES
 C 'A Container Objectclass to be used for creating radius profile object' SUP
  top STRUCTURAL MUST cn MAY ( uid $ userPassword $ description ) )

Ein­ge­spielt wird es mit:

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f freeradius_schema.ldif

Die Objekt­de­fi­ni­tio­nen geben durch ihren Namen schon einen Hin­weis dar­auf, was noch alles mög­lich ist. Inter­net­pro­vi­der set­zen des­we­gen oft genau auf die­ses Protokoll.

Freeradius für die Nutzung von LDAP konfigurieren

Falls noch nicht gesche­hen, muss free­ra­di­us zunächst instal­liert wer­den. Bei Debi­an und sei­nen Deri­va­ten tut es ein Einzeiler:

1
apt-get install freeradius

Jetzt sind eini­ge Kon­fi­gu­ra­ti­ons­da­tei­en zu bearbeiten: 

/etc/freeradius/modules/ldap
1
2
3
4
5
6
7
8
server = "localhost"
identity = "cn=admin,dc=domain,dc=tld"
password = <secret>
basedn = "ou=test,dc=domain,dc=tld"
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
base_filter = "(objectclass=radiusprofile)"
access_attr = "dialupAccess"
password_attribute = userPassword

dc=domain,dc=tld ist natür­lich an den eige­nen LDAP anzu­pas­sen. Der Bin­du­ser unter „iden­ti­ty“ muss Lese­zu­griff auf Attri­bu­te des Radi­us-Sche­mas haben. Die­se müs­sen in der Regel extra gewährt / kon­fi­gu­riert wer­den, eigent­lich soll­te man das nicht so ger­ne über den Haupt­ad­min des Bau­mes lösen.

/etc/freeradius/sites-enabled/default & /etc/freeradius/sites-enabled/inner-tunnel

Vor fol­gen­de Zei­len in bei­den Datei­en die Kom­men­tar­zei­chen ent­fer­nen (Abschnitt aut­ho­ri­ze / authen­ti­ca­te):

1
2
3
4
ldap
Auth-Type LDAP {
   ldap
}

Jetzt kann man bei­de Diens­te neu starten:

1
2
service slapd restart
service freeradius restart

Testen des Einstellungen

Nun kann man über­prü­fen, ob das Log­in gegen LDAP funktioniert:

1
radtest "test_ldap_user" "test_ldap_passwort" localhost 18120 "secret"

secret fin­det man in /etc/freeradius/clients.conf in der Sek­ti­on „local­host“. Wenn man von wei­te­ren IPs aus authen­ti­fi­zie­ren möch­te, muss man ein­fach für jeden Rech­ner einen neu­en Block anle­gen. Vor­kon­fi­gu­riert ist bei Debi­an und Deri­va­ten für local­host „testing123“. Wenn alles klappt, soll­te die Aus­ga­be etwa so aussehen:

1
2
3
4
5
6
7
Sending Access-Request of id 213 to 127.0.0.1 port 1812
	User-Name = "<test_ldap_user>"
	User-Password = "<test_ldap_passwort>"
	NAS-IP-Address = 127.0.0.1
	NAS-Port = 18120
	Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=213, length=20

Wich­tig ist das Access-Accept packet am Schluss. Klappt es aus irgend­wel­chen Grün­den nicht, gibt es ein Access-Reject packet.

OpenLDAP ab 2.4 installieren und einrichten

Vorweg

Mir ist kei­ne Quel­le im Netz bekannt, die die Ein­rich­tung von OpenLDAP wirk­lich umfas­send dar­stellt – schon gar nicht auf Deutsch. Die­se Infor­ma­tio­nen hier sind aus allen mög­li­chen Ecken zusam­men­ge­klaubt – selbst die meis­ten Bücher zu OpenLDAP emp­fin­de ich als sehr wenig hilfreich.

Grundinstallation

Hin­weis: domain.tld muss man natür­lich immer an den eige­nen openLDAP anpassen.

Zuerst instal­lie­ren wir die Bina­ries, in Debi­an und sei­nen Abkömm­lin­gen (Ubun­tu, Mint etc.) z.B. so:

1
apt-get install slapd ldap-utils

Die Instal­la­ti­ons­rou­ti­ne von Debi­an legt dabei nur eine sehr rudi­men­tä­re Kon­fi­gu­ra­ti­on an, sodass etwas Nach­ar­beit von­nö­ten ist. Bei ande­ren Dis­tri­bu­tio­nen ken­ne ich mich nicht so gut aus. Ein

1
dpkg-reconfigure slapd

ermög­licht uns hier die Ein­ga­be einer kor­rek­ten Basis-DN (auf die muss unser SSL-Zer­ti­fi­kat aus­ge­stellt sein), meist sowas wie

  • dc=domain, dc=tld

und zusätz­lich defi­nie­ren wir dabei ein Root­pass­wort für den LDAP-User

  • cn=admin,dc=domain,dc=de

.

Handling von OpenLDAP

Ab Debi­an Squeeze spei­chert der OpenLDAP-Ser­ver sei­ne Kon­fi­gu­ra­ti­on in einem inter­nen LDAP-Baum und nicht mehr in einem Kon­fi­gu­ra­ti­ons­file. Das macht die Pfle­ge auf den ers­ten Blick erheb­lich auf­wän­di­ger, weil man an die­sen Baum in der Stan­dard­kon­fi­gu­ra­ti­on nur umständ­lich über Kon­so­len­tools her­an­kommt. Zudem kann eine feh­ler­haf­te Daten­bank dazu füh­ren, dass der OpenLDAP nach einer Kon­fi­gu­ra­ti­ons­än­de­rung gar nicht mehr hochkommt.
Nur der Root­be­nut­zer des Sys­tems kommt immer auch direkt an die Daten. Man kann sich die bestehen­den Inhalt nur als root anzei­gen las­sen mit:

1
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config"

Neue Ein­trä­ge kön­nen über *.ldif-Files hin­zu­ge­fügt werden:

1
ldapmodify/ldapadd -Y EXTERNAL -H ldapi:/// -f
Hinweis zu Ubuntu 14.04 LTS

Der Instal­ler setzt den Account­na­men für den Benut­zer mit Zugriff auf den cn=config-Baum stan­dard­mä­ßig auf: cn=admin,dc=domain,dc=tld. Dann macht man Befol­gen die­ser Anlei­tung ein lan­ges Gesicht. Um das auf den Stan­dard zu ändern, benö­tigt man nur für Ubun­tu 14.04 LTS noch eine klei­ne Ände­rung (change_admin.ldif):

1
2
3
4
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,cn=config

Obli­ga­to­risch:

1
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f change_admin.ldif

Sicherheit

OpenLDAP-Verbindungen per TLS absichern

Vor­weg: Hier kann ganz viel schief­ge­hen, obwohl ich die­ses Kapi­tel mit am wich­tigs­ten fin­de. Wenn OpenLDAP aus irgend­wel­chen Grün­den die Zer­ti­fi­kat­files nicht frisst, kann man mit der Kon­fi­gu­ra­ti­on von vor­ne begin­nen oder man hat vor­her ein Back­up der alten Daten­bank gemacht. Des­we­gen über­sprin­ge ich die­sen Schritt ger­ne und bin­de den OpenLDAP ein­fach nicht an öffent­lich erreich­ba­re Netz­werk­de­vices. Wenn man das machen muss, führt aus Daten­schutz­grün­den aber kein Weg an die­ser Pro­ze­dur hier vor­bei. LDAP ist genau wie FTP ein Klar­text­pro­to­koll, dass ohne Trans­port­ver­schlüs­se­lung auf dem gesam­ten Daten­weg offen­liegt und gera­de in WLAN-Umge­bun­gen sehr leicht belauscht wer­den kann.
Gene­rell gibt es zwei Mög­lich­kei­ten, wie man an kos­ten­lo­se Zer­ti­fi­ka­te kom­men kann. Wosign oder Start­S­SL. Es gibt diver­se Tuto­ri­als im Netz zur Nut­zung die­ser Diens­te. Von Let­sen­crypt wür­de ich im Kon­text von OpenLDAP eher abra­ten. Start­S­SL und WoSign sind mitt­ler­wei­le Geschich­te. Wenn es kos­ten­los sein soll, führt kein Weg an let­sen­crypt vor­bei. Man muss dann dafür sor­gen, dass OpenLDAP nach jedem Cert­up­date neu gestar­tet wird, also alle drei Mona­te mindestens.

Man hat am Ende des Zer­ti­fi­zie­rungs­pro­zes­ses in der Regel drei Datei­en vorliegen:

  1. domain.tld-crt.pem (ent­hält das Zertifikat)
  2. domain.tld-key.pem (ent­hält den pri­va­ten Schlüssel)
  3. ca_chain.pem (ent­hält die Zer­ti­fi­zie­rungs­chain der CA)

domain.tld ist dabei der Wur­zel­baum des openLDAP. Ich habe die Datei­en nach /etc/ldap/ssl gelegt. Bes­ser auf­ho­ben sind sie in /etc/ssl/cert – dann muss slapd Lese­rech­te dort bekommen.

Fol­gen­de Datei (tls_ldap.ldif) anlegen:

1
2
3
4
5
6
7
8
9
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/ssl/ca_chain.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/domain.tld-key.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/domain.tld-crt.pem

… und über die Kon­so­le einspielen:

1
ldapadd -Y EXTERNAL -H ldapi:/// -f tls_ldap.ldif

oder auch

1
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls_ldap.ldif

Ich bin zusätz­lich ein Freund davon, siche­re Ver­bin­dun­gen zu erzwin­gen. Cli­ents, die das nicht wol­len oder kön­nen, sol­len bit­te draußenbleiben.

Fol­gen­de Datei (force_tls.ldif) anlegen:

1
2
3
4
dn: olcDatabase={1}hdb,cn=config
changetype:  modify
add: olcSecurity
olcSecurity: tls=1

Und wie­der einspielen:

1
ldapadd -Y EXTERNAL -H ldapi:/// -f force_tls.ldif

oder auch

1
ldapmodify -Y EXTERNAL -H ldapi:/// -f force_tls.ldif

Jetzt noch in /etc/default/slapd nach­schau­en, ob die Ser­vices stim­men (ldaps über Port 639 gilt als ver­al­tet und soll­te nicht mehr ver­wen­det wer­den). In der Regel steht da so etwas:

1
SLAPD_SERVICES="ldap://0.0.0.0:389/ ldapi:///"

Wenn man meh­re­re NICs besitzt, kann man natür­lich statt 0.0.0.0 auch die IP einer spe­zi­fi­schen Netz­werk­kar­te ange­ben oder den OpenLDAP nur an local­host (127.0.0.1) binden.

Ein

1
service slapd restart

bringt Auf­klä­rung, ob das Gan­ze funk­tio­niert hat. Theo­re­tisch ist das nicht not­wen­dig, da OpenLDAP durch das neue Ver­fah­ren ohne Kon­fi­gu­ra­ti­ons­da­tei qua­si live im Betrieb gepatcht wird. Jetzt soll­te der OpenLDAP Ver­bin­dun­gen von außen nur noch ver­schlüs­selt akzep­tie­ren. Von der Kon­so­le aus ( ldapi:/// ) klappt das nach wie vor auch nor­mal. Wir ver­trau­en uns ja schon selbst.

Bruteforce erschweren

Ein offe­ner LDAP-Ser­ver ist anfäl­lig für bru­te-force Atta­cken – zumal gera­de im Schul­be­reich vie­le unsi­che­re Pass­wör­ter im Umlauf sein dürf­ten. Durch das ppolicy.schema kann man z.B. nach eini­gen fehl­ge­schla­ge­nen Log­ins den Account für eine Wei­le auto­ma­tisch sper­ren. openLDAP bringt das dafür not­wen­di­ge Sche­ma in /etc/ldap/schema/ppolicy.ldif schon mit.

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
dn: cn=ppolicy,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: ppolicy
olcAttributeTypes: {0}( 1.3.6.1.4.1.42.2.27.8.1.1 NAME 'pwdAttribute' EQUALITY
  objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.42.2.27.8.1.2 NAME 'pwdMinAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.42.2.27.8.1.3 NAME 'pwdMaxAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.42.2.27.8.1.5 NAME 'pwdCheckQuality' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.42.2.27.8.1.6 NAME 'pwdMinLength' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.42.2.27.8.1.7 NAME 'pwdExpireWarning' EQUA
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.42.2.27.8.1.8 NAME 'pwdGraceAuthNLimit' EQ
 UALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.42.2.27.8.1.9 NAME 'pwdLockout' EQUALITY b
 ooleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {9}( 1.3.6.1.4.1.42.2.27.8.1.10 NAME 'pwdLockoutDuration' E
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {10}( 1.3.6.1.4.1.42.2.27.8.1.11 NAME 'pwdMaxFailure' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {11}( 1.3.6.1.4.1.42.2.27.8.1.12 NAME 'pwdFailureCountInter
 val' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE
 )
olcAttributeTypes: {12}( 1.3.6.1.4.1.42.2.27.8.1.13 NAME 'pwdMustChange' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {13}( 1.3.6.1.4.1.42.2.27.8.1.14 NAME 'pwdAllowUserChange'
 EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {14}( 1.3.6.1.4.1.42.2.27.8.1.15 NAME 'pwdSafeModify' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {15}( 1.3.6.1.4.1.4754.1.99.1 NAME 'pwdCheckModule' DESC 'L
 oadable module that instantiates "check_password() function' EQUALITY caseExa
 ctIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.4754.2.99.1 NAME 'pwdPolicyChecker' SUP top
  AUXILIARY MAY pwdCheckModule )
olcObjectClasses: {1}( 1.3.6.1.4.1.42.2.27.8.2.1 NAME 'pwdPolicy' SUP top AUXI
 LIARY MUST pwdAttribute MAY ( pwdMinAge $ pwdMaxAge $ pwdInHistory $ pwdCheck
 Quality $ pwdMinLength $ pwdExpireWarning $ pwdGraceAuthNLimit $ pwdLockout $
  pwdLockoutDuration $ pwdMaxFailure $ pwdFailureCountInterval $ pwdMustChange
  $ pwdAllowUserChange $ pwdSafeModify ) )

Ein­ge­spielt wird das Sche­ma mit:

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ppolicy.ldif

Das Sche­ma ppolicy.ldif selbst defi­niert nur Objek­te für das ent­spre­chen­de Modul, was jetzt noch gela­den wer­den muss, wofür wir eine Datei policy_module.ldif mit fol­gen­dem Inhalt anlegen:

1
2
3
4
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la

Und das alte Spiel:

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f policy_module.ldif

Jetzt brau­chen wir noch eine Abla­ge (policy_context.ldif) für die ver­schie­de­nen Regelsätze:

1
2
3
4
dn: ou=policies,dc=domain,dc=tld
objectClass: organizationalUnit
objectClass: top
ou: policies
1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f policy_context.ldif

Und als nächs­tes eine Default-Poli­cy (default_policy.ldif):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dn: cn=default,ou=policies,dc=domain,dc=tld
objectClass: top
objectClass: device
objectClass: pwdPolicy
cn: default
pwdAttribute: 2.5.4.35
pwdMaxAge: 15552000
pwdInHistory: 3
pwdMinLength: 6
pwdMaxFailure: 3
pwdLockout: TRUE
pwdLockoutDuration: 1800
pwdGraceAuthNLimit: 3
pwdMustChange: TRUE
pwdAllowUserChange: TRUE
pwdSafeModify: TRUE

In die­sen Bei­spiel wird nach drei fehl­ge­schla­ge­nen Log­in­ver­su­chen ( pwd­Max­Fail­ure: 3 ) das Log­in für 1800 Sekun­den ( pwd­Lock­out­Du­ra­ti­on: 1800 ) gesperrt. Das soll­te kleb­rig genug sein.

Muss ich es noch schreiben?

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f default_policy.ldif

Da OpenLDAP ja so fluf­fig und intui­tiv ist, brau­chen wir jetzt noch ein Over­lay (policy_overlay.ldif), dass dem OpenLDAP sagt, dass statt des nor­ma­len Log­in­hand­lings jetzt immer auch die Default-Poli­cy gel­ten soll:

1
2
3
4
5
6
7
dn: olcOverlay=ppolicy,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=domain,dc=tld
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: TRUE

Ihr wisst, was jetzt kommt:

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f policy_overlay.ldif

Damit hät­ten wir grund­sätz­lich ver­schlüs­sel­te Ver­bin­dun­gen erzwun­gen und zusätz­lich Bru­teforce-Angrif­fe erschwert. Bleibt noch eines zu tun:

Anonymous-Bind verbieten

Stan­dard­mä­ßig erlaubt openLDAP einen soge­nann­te anony­mous bind, d.h. man erhält lesend Zugriff auch ohne die Ein­ga­be eines Pass­wor­tes. Die­se lesen­de Zugriff ist sehr ein­ge­schränkt, z.B. gibt es kei­nen Zugriff auf bestimm­te Objekt­klas­sen oder gar Pass­wort­hash­es. Mir ist die Vor­stel­lung trotz­dem nicht geheu­er, dass sich u.a. Nut­zer­na­men auf die­sem Weg aus­le­sen las­sen. Daher ver­wen­de ich für den lesen­den Zugriff einen sepa­ra­ten User, der sich mit Pass­wort authen­ti­fi­zie­ren muss, ansons­ten aber nicht mehr Rech­te als beim anony­mous bind hat. Des­we­gen unter­bin­den wir das mit einer neu­en Datei noanonymous.ldif:

1
2
3
4
5
6
7
dn: olcDatabase={1}hdb,cn=config
add: olcRequires
olcRequires: authc
 
dn: olcDatabase={-1}frontend,cn=config
add: olcRequires
olcRequires: authc

Und jetzt kommt etwas ande­res, weil wir einen bereits bestehen­den Daten­bank­ein­trag aktualisieren:

1
ldapmodify -Y EXTERNAL -H ldapi:/// -f noanonymous.ldif

Nach dem Ein­spie­len der letz­ten Ände­rung hat man ohne Authen­ti­fi­zie­rung auch über die Kon­so­le kei­nen Zugriff mehr auf den Haupt­baum des OpenLDAP (dc=domain, dc=tld) – die war bis­her auch sowas wie „anonym“ aus Sicht des LDAP. Man muss dann aus­wei­chen auf eine ande­re Befehls­zei­le (cn=config ist davon nicht betroffen):

1
ldapadd -x -D cn=admin,dc=domain,dc=tld -W -f

Danach wird man zur Ein­ga­be des Admin­pass­wor­tes auf­ge­for­dert und kann so den Haupt­baum beschrei­ben und verändern.

Optionale Arbeiten

Performancetuning

Die­se Datei ( index.ldif )

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
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: cn pres,sub,eq
-
add: olcDbIndex
olcDbIndex: sn pres,sub,eq
-
add: olcDbIndex
olcDbIndex: uid pres,sub,eq
-
add: olcDbIndex
olcDbIndex: displayName pres,sub,eq
-
add: olcDbIndex
olcDbIndex: default sub
-
add: olcDbIndex
olcDbIndex: uidNumber eq
-
add: olcDbIndex
olcDbIndex: gidNumber eq
-
add: olcDbIndex
olcDbIndex: mail,givenName eq,subinitial
-
add: olcDbIndex
olcDbIndex: dc eq

ein­spie­len mit

1
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f index.ldif
Benutzer für die Administration von cn=config einrichten

Wenn man sau­ch den cn=config-Baum auch über kom­for­ta­ble­re Frontends wie phplda­pad­min oder LAM ver­wal­ten möch­te, muss man das Objekt cn=admin, cn=config noch um wei­te­re Ein­trä­ge ergän­zen. Zunächst erzeu­gen wir uns über die Kon­so­le ein Passwort:

1
slappasswd -h {SSHA}

Wir erhal­ten einen Hash zurück, den wir in die Zwi­schen­ab­la­ge kopie­ren. Jetzt erstell­ten wir ein ldif-File (manager.ldif):

1
2
3
4
5
6
7
8
9
10
11
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}
 
# auskommentieren, wenn wir den Zugriff von root  auf cn=config 
# ohne Passwort sperren wollen. Sollte als Fallback besser erhalten bleiben
 
#dn: olcDatabase={0}config,cn=config
#changetype: modify
#delete: olcAccess
1
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f manager.ldif

Wenn wir jetzt in phplda­pad­min (ab Ver­si­on 1.2.2) oder lam als Base-DN cn=config ver­wen­den und als Log­in cn=admin, cn=config, kön­nen wir cn=config auch gra­fisch verwalten.

Quel­le: https://wiki.debian.org/PhpLdapAdmin

War doch ganz einfach oder?

OpenLDAP ist extrem sper­rig, aber eine her­vor­ra­gen­de Authen­ti­fi­zie­rungs­mög­lich­keit, da im Gegen­satz zu Daten­bank­sys­te­men die Struk­tur hoch­gra­dig stan­dar­di­siert sowie mus­ter­gül­tig objekt­ori­en­tiert ist und sich OpenLDAP so recht schnell in belie­bi­ge Anwen­dun­gen inte­grie­ren lässt – fast alle ernst­zu­neh­men­den Online­tools unter­stüt­zen die Authen­ti­fi­zie­rung über LDAP. OpenLDAP dien­te nicht umsonst nicht als Vor­la­ge für die LDAP-Funk­tio­nen von Samba4 – weil es eben so sper­rig ist.

Neues Jahr, neue Zielgruppen

Die­ses Blog ist ja rela­tiv breit auf­ge­stellt, was die The­men angeht. Erst­mals habe ich auch etwas an ande­rer Stel­le ver­öf­fent­licht und dabei sehr viel dar­über gelernt, wie man Lese­rin­nen und Leser nicht ver­grault – da bie­tet so man­cher Arti­kel hier doch eini­gen Optimierungsbedarf.

Word­Press hat den ent­schei­de­nen Vor­teil, dass es rela­tiv such­ma­schi­nen­freund­lich auf­ge­stellt ist. Da hier mitt­ler­wei­le eini­ges an Inhal­ten vor­han­den ist, wer­de ich dem­nächst ein paar Din­ge ver­än­dern – für die treu­en Feed­le­ser soll­te dabei alles beim Alten bleiben.

  1. Die Sei­te selbst wird sich mehr in Rich­tung eines Online­ma­ga­zins ent­wi­ckeln. Vie­le Arti­kel aus den ver­gan­ge­nen Jah­ren kann ich so etwas pro­mi­nen­ter prä­sen­tie­ren – man sieht schon etwas im Hea­der der Sei­te oder als Wid­get. Da wer­de ich aber noch viel expe­ri­men­tie­ren. Viel­leicht kann ich den einen oder ande­ren so etwas län­ger auf der Sei­te halten.
  2. Ich möch­te ver­su­chen im Zuge von Punkt 1 mehr mit Bil­dern zu arbei­ten. Das lockert die Tex­te ggf. etwas auf und macht es dem Lesen­den u.U. leich­ter, dem teil­wei­se doch recht mini­ma­lis­ti­schen Kau­der­welsch zu fol­gen. Ich wer­de dazu Bil­der unter CC0-Lizenz nut­zen, etwa von Pix­a­bay oder Jay Man­tri.
  3. Ich wer­de mei­ne Inhal­te alle­samt nach und nach hier im Blog zusam­men­zie­hen. Wun­dert euch also nicht, wenn hier dem­nächst auch viel Tech­nik­kram aus mei­nen Admi­nis­tra­ti­ons­er­fah­rung und der Ardui­no-AG hier hin­ein­dif­fun­diert. Wenn ich das Ver­öf­fent­li­chungs­da­tum fri­sie­re, soll­te da eigent­lich nicht so viel in den Feed hineinwirken.
  4. Uneins bin ich mir noch, ob ich mich über Twit­ter hin­aus in sozia­len Netz­wer­ken enga­gie­ren soll­te. Mich machen die meis­ten Sachen und Dis­kus­sio­nen dort nicht beson­ders glück­lich. Mei­ne Twit­ter­welt besteht ja fast aus­schließ­lich aus der Edu-Welt-Fil­ter­bla­se, die ich sehr berei­chernd fin­de, die aber auch eine recht geschlos­se­ne ist.

Die­ses Blog bekommt sei­ne meis­ten Besu­cher über Such­ma­schi­nen, naja, eigent­lich über eine Such­ma­schi­ne. Die­se „belohnt“ Sei­ten mit Inhal­ten mit hohen Plat­zie­run­gen. Jeder neue Inhalt pro­fi­tiert damit von den bestehen­den, ist also u.U. in einem Wiki wie bis­her nicht gut aufgehoben.

Ich weiß, dass es nicht „statt­haft“ ist, so zu den­ken und zu schrei­ben – Geld gibt es aber kei­nes für die­ses Blog und Kom­men­ta­re oder direk­te Rück­mel­dun­gen auch eher wenig, d.h. ich möch­te ger­ne schau­en, wie ich moti­viert bei der Sache blei­ben kann und da blei­ben neben den altru­is­ti­schen, idea­li­sier­ten Ansät­zen eigent­lich nur nack­te Zahlen.

 

 

Lernplattformen

Vorbemerkung:

Ich äuße­re hier mei­ne Sicht und mei­ne Mei­nung zum The­ma Lern­platt­for­men, die sich allein auf mei­nem per­sön­li­chen Erfah­rungs­wis­sen grün­det. Auch ich ken­ne Schu­len, an denen es mit einer Lern­platt­form gut läuft und auch ich den­ke, dass in bestimm­ten Kon­stel­la­tio­nen eine Lern­platt­form ggf. hilf­reich für Schul­ent­wick­lung sein kann.

Warum ich Lernplattformen sehr kritisch sehe

Lern­platt­for­men wie Mood­le, Comm­sy oder auch kom­mer­zi­el­le Vari­an­ten wie its­lear­ningWeb­wea­ver, Goog­le Class­room und iTu­nes U stel­len eine vir­tu­el­le Lern­um­ge­bung bereit.

Das Prin­zip ist fast immer gleich: Ein zen­tra­les Log­in ermög­licht Zugriff auf bestimm­te Funk­tio­nen, die sich grup­pie­ren und struk­tu­rie­ren las­sen, z.B. kann ich inner­halb von Mood­le soge­nann­te Kur­se anbie­ten, die diver­se Funk­tio­nen bereit­stel­len, etwa ein Forum, Arbeits­ma­te­ria­li­en, ein­ge­bet­te­te Medi­en, Online­tests u.v.m.. Die­se Kur­se kann ich tei­len, expor­tie­ren, wie­der­ver­wer­ten, gemein­sam mit ande­ren Lehr­kräf­ten ent­wi­ckeln. Dar­über­hin­aus wer­den zuneh­mend Kura­ti­ons­tools ein­ge­setzt, etwa bei iTu­nes U: Ich kann ähn­lich wie bei paper.li Web­in­hal­te auf einer spe­zi­el­len Sei­te zusam­men­stel­len – qua­si ein Web­quest auf multimedial.

Das hört sich erst­mal pri­ma an. Ich war in Deutsch­land lan­ge Zeit sehr aktiv in der Mood­le­sze­ne und hat­te als Bera­ter Zugriff auf zahl­rei­che Test­in­stal­la­tio­nen kom­mer­zi­el­ler Pro­duk­te. Ich bin kein Maß­stab, weil ich zen­tra­li­sier­te Din­ge für die Arbeit mit digi­ta­len Medi­en nicht mehr benö­ti­ge, aber kei­ne der Test­stel­lun­gen und kei­ne mei­ner Test­in­stal­la­tio­nen in den letz­ten Jah­ren hat mich in irgend­ei­ner Wei­se dazu gebracht, Spaß oder Freu­de bei der Arbeit mit dem jewei­li­gen Sys­tem zu empfinden.

Das ist ja auch nicht zwin­gend not­wen­dig, aber dazu kam, dass auch der für mich sehr typi­sche prag­ma­ti­sche Zugang auf kei­ner der Lern­platt­for­men mög­lich war: Sie kos­te­ten mich ein­fach nur Zeit durch die kom­pli­zier­te Bedie­nung, die vor­ge­ge­be­nen Struk­tu­ren, das oft haar­sträu­ben­de Datei­ma­nage­ment, die pro­prie­tä­ren Schnitt­stel­len – und ich hal­te mich selbst für einen mit­tel­mä­ßig begab­ten Anwen­der (das ist etwas völ­lig ande­res als ein Tech­ni­ker oder Admi­nis­tra­tor). Es gibt eine Rei­he von Wer­be­aus­sa­gen zu Lern­platt­for­men, die ich im Fol­gen­den ein­mal aufs Korn neh­men möchte:

1. Eine Lernplattform bietet schulweit einen geschützten Raum mit klar definierter Benutzerführung

Das stimmt von einem tech­no­lo­gi­schen Stand­punkt aus. Hypo­the­tisch bie­tet sie das. „Schul­weit“ bedeu­tet für mich, dass alle Lehr­kräf­te in die­se Platt­form ein­ge­wie­sen sind und regel­mä­ßig im Unter­richt mit ihr arbei­ten. Nur so ent­wi­ckeln sich Rou­ti­nen im All­tag. Tat­säch­lich höre ich von Schu­len, in denen Lern­platt­for­men „ein­ge­führt“ sind, ganz oft ganz ande­re Din­ge. „Schul­weit“ bedeu­tet in der Rea­li­tät oft genug „drei oder vier beson­ders akti­ve Lehr­kräf­te mit ihren Lerngruppen“.

Schul­weit“ ist eine Hal­tung, die schon vor­han­den sein muss, bevor eine Lern­platt­form ihr unter­stüt­zen­des Poten­ti­al über­haupt ent­wi­ckeln kann.

Ein­fach mal machen“ führt oft genug ledig­lich dazu, dass eine Lern­platt­form 1:1 die Struk­tu­ren an einer Schu­le abbil­det – somit ist sie für mich dann zwar ein tol­les Bera­tungs­in­stru­ment, aber oft genug sehr bald für die Schu­le selbst eine zusätz­li­che Belastung.

Man sieht das recht hübsch an den Dis­kus­sio­nen im deut­schen Forum auf moodle.org. Immer noch dre­hen sich gefühlt 90% der Fra­gen um Sper­ren, Ein­schrän­ken, Bewer­tungs­ras­ter fein­tu­nen und ähn­li­che Dinge.

Wenn ich ver­su­che, in Rich­tung  „schul­weit“ zu bera­ten, kommt selt­sa­mer­wei­se am Schluss oft eben nicht die Ent­schei­dung für eine Lern­platt­form dabei her­aus, son­dern erst­mal sowas in die Rich­tung wie Datei­aus­tausch, Ter­mi­ne, E‑Mail – also typi­sche Cloud­funk­tio­nen. Danach ent­wi­ckelt es sich oft eher von dem Grund­kon­strukt „Lern­platt­form“ weg.

2. Eine Lernplattform bietet erweiterte Möglichkeiten der Zusammenarbeit zwischen Lehrkräften durch z.B. Austausch von Materialien, Aufgabenstellungen und Medien

Das stimmt von einem tech­no­lo­gi­schen Stand­punkt aus. Hypo­the­tisch bie­tet sie das. Ich kann z.B. bestimm­te Struk­tu­ren expor­tie­ren und im nächs­ten Jahr wie­der­ver­wen­den. Wenn ich einen Kurs zum The­ma „Pro­gram­mie­ren mit Ardui­no“ erstellt habe, kann ich die­sen dar­über­hin­aus mit ande­ren Lehr­kräf­ten tei­len. Bei Mood­le kann ich sogar im glei­chen Kurs mit ver­schie­den Grup­pen gleich­zei­tig arbei­ten, ohne dass die­se Grup­pen sich gegen­sei­tig sehen. Ich kann das. Was ist mit mei­nem Kol­le­gen, der nicht ein­mal weiß, wie er das Bild des Note­books auf den Bea­mer bekommt? Der wird schon an der Anmel­dung und der Ein­rich­tung eines Kur­ses in Mood­le schei­tern – ande­re Sys­te­me sind da aber tat­säch­lich ent­schie­den intuitiver.

Wer dar­über­hin­aus schon ein­mal einen Kurs in einer Lern­platt­form gebaut hat, weiß, dass das oft Stun­den dau­ert – für mich völ­lig inef­fi­zi­ent. Zudem will ich ja gera­de nicht nur Inhal­te bereit­stel­len, son­dern ich möch­te mich z.B. im Fach Deutsch mit mei­nem Fach­wis­sen mit den von SuS erstell­ten Inhal­ten aus­ein­an­der­set­zen und sie selbst dar­über ins Gespräch bringen.

Wenn ich hin­ge­gen Inhal­te bereit­stel­len muss (z.B. im Fach Che­mie), dann tue ich das doch nicht auf einer pro­prie­tä­ren Lern­platt­form mit ihren für mich extremst ein­ge­schränk­ten Im- und Export­funk­tio­nen. Mei­ne Inhal­te sind für mich als Leh­rer eine essen­ti­el­le Res­sour­ce, mit der ich mich nicht an ein For­mat bin­den möch­te, was ich nicht selbst kon­trol­lie­ren kann. Wenn eine Schu­le z.B. jah­re­lang bei Anbie­ter x auf Lern­platt­form y gear­bei­tet und der Anbie­ter dann z.B. die Preis­struk­tur mas­siv ändert (das ist kein hypo­the­ti­sches Set­ting, son­dern das kommt vor!) – sage ich dann als Schu­le: „Och, jetzt ist zwar die Arbeit von Jah­ren im Sys­tem, aber den Preis, nö, den zah­le ich nicht und wechs­le jetzt zu Anbie­ter z!“

Mei­ner Mei­nung nach unter­schät­zen vie­le Anbie­ter genau die­sen Aspekt, weil er sel­ten so klar for­mu­liert wird, aber intui­tiv bei vie­len Lehr­kräf­ten eine sehr gro­ße Rol­le spielt. Dazu kommt die Angst, dass Mate­ria­li­en durch die digi­ta­le Prä­senz auf ein­mal auch beur­teil- und eva­lu­ier­bar wer­den. Das kann man kri­ti­sie­ren und doof fin­den. Die Angst bleibt trotzdem.

3. Eine Lernplattform ist ein zentrales Instrument zur Organisation von Kommunikationsprozessen an Schulen und schafft so Transparenz

Das stimmt von einem völ­lig ver­al­te­ten tech­no­lo­gi­schen Stand­punkt aus. Meist funk­tio­nie­ren Lern­platt­for­men so, dass man sich über eine Web­ober­flä­che ein­log­gen muss, um dann auf eine Art Dash­board zu kom­men, was alle rele­van­ten Infor­ma­tio­nen für mich anzeigt. Oder es gibt eine geson­der­te App für ein Mobil­ge­rät (Han­dy, Tablet), die das für mich erle­digt. In mei­ner Welt (und in der Welt der Mobil­ge­rä­te über­haupt) fin­det Daten­aus­tausch aber recht anders statt:

  • E‑Mail über imaps
  • Ter­mi­ne über CalDAVs
  • Datei­en über WebDAVs
  • Nach­rich­ten über XMPP (mit Ende-zu-Ende-Verschlüsselung)
  • Kon­takt­da­ten über CardDAVs
  • Inhal­te über XML
  • […]

Das sind alles offe­ne Protokolle/Formate, wie sie jeder von uns täg­lich nutzt ohne es zu wis­sen, weil irgend­ei­ne App das erle­digt, die wir ent­we­der vom Her­stel­ler des Betriebs­sys­tem über­neh­men oder aber selbst bestim­men. Her­stel­ler von Lern­platt­for­men nei­gen zum über­wie­gen­den Teil dazu, die­se offe­nen, frei­en und ver­schlüs­sel­ten Stan­dards durch irgend­et­was zu erset­zen, das nur zu ihrer jewei­li­gen Lern­platt­form passt.

Schlachtung meiner Thesen durch Anbieter

In der Kom­mu­ni­ka­ti­on mit Anbie­tern, wer­den der­ar­ti­ge The­sen von mir nicht geschlach­tet, son­dern in einer ganz bestimm­ten Art und Wei­se gekontert.

  • pro­prie­tä­re For­ma­te sind für die Kon­sis­tenz der Daten not­wen­dig. Zudem sind tech­nisch kei­ne über­grei­fen­den Aus­tausch­for­ma­te mög­lich (PS: Das XML-For­mat von Mood­le oder Word­Press zeigt, dass das wohl schon irgend­wie geht)
  • die Schul­kul­tur, die zu der von mir gefor­der­ten „schulweit“-Lösung not­wen­dig ist, kann sich ja evo­lu­tio­när durch Unter­stüt­zung mit einer Lern­platt­form bil­den – ohne gin­ge es ja gar nicht – das sei ja gera­de die Ver­ant­wor­tung der Schu­le (PS: Da liegt der Kern der Arbeit, bei dem eine Lern­platt­form gera­de nicht unterstützt)
  • für die meis­ten Schu­len sind die durch Lern­platt­for­men gebo­te­nen Kom­mu­ni­ka­ti­ons­er­wei­te­run­gen schon Quan­ten­sprün­ge gegen­über der bis­he­ri­gen Kom­mu­ni­ka­ti­ons­kul­tur (PS: Die Sache wäre wesent­lich nie­der­schwel­li­ger zu bewerk­stel­li­gen ohne den Umweg über Weboberflächen)
  • Lern­platt­for­men las­sen sich durch Zusatz­tools her­vor­ra­gend ergän­zen und in ihren Mög­lich­kei­ten erwei­tern – Mood­le etwa durch das schü­ler­zen­trier­te Maha­ra (PS: Die Inte­gra­ti­on der dabei ent­ste­hen­den Inhal­te in die ursprüng­li­che Lern­platt­form ist dann meist eher recht rudi­men­tär implementiert)
  • Lern­platt­for­men haben als Mit­tel zur Orga­ni­sa­ti­on von instruk­ti­ven Lern­pro­zes­sen eine wich­ti­ge Rolle

Ich sehe das viel zu nega­tiv, weil ich immer mit der „Kun­den­bin­dungs­po­ten­ti­al­bril­le“ auf die ver­schie­de­nen Ange­bo­te schaue: Ein Anbie­ter ist auf Wert­schöp­fung ange­wie­sen – dar­an ist über­haupt nichts Verwerfliches.

Ich hal­te die Kun­den­bin­dung aber auch für ein Motiv, eben z.B. kei­ne anbie­ter­über­grei­fen­den Im- und Export­stan­dards zu imple­men­tie­ren – natür­lich wird das nie­mand so offen nach außen kommunizieren.

 

Wie soll man es denn sonst machen?

Das wäre eine eige­ner Arti­kel. Des­we­gen hier nur zwei Thesen:

  • Identity‑, Grup­pen- und Rol­len­ma­nage­ment gehö­ren nicht in eine Lern­platt­form, son­dern öffent­lich orga­ni­siert. Durch ACLs wird fest­ge­legt, was die Lern­platt­form (oder die jewei­li­ge Appli­ka­ti­on) lesen/sehen darf und was nicht und wel­che Rol­le wer wo im Sys­tem erhält.
  • Die zen­tra­le Ver­wal­tung des Iden­ti­ty­ma­nage­ments gibt jeder Lehr­kraft bzw. jeder Schu­le die Mög­lich­keit, die Tools ein­zu­set­zen, die sie für ihren Unter­richt für not­wen­dig hält: Lern­platt­form, Blog, Wiki, Video­kon­fe­renz­soft­ware – alles wer­den ledig­lich „Apps“, die dar­an anbind­bar sind – auf Knopf­druck instal­liert, mit Nut­zern befüllt.

PS: Das geht alles schon und ist auch schon so umge­setzt – aller­dings eher auf Firmenebene.

Netzneutralität und die Telekom

Weit­ge­hend unbe­ach­tet von vie­len Inter­net­nut­zern tobt im Hin­ter­grund gera­de ein Kampf zwi­schen Rechen­zen­trums­be­trei­bern und der deut­schen Tele­kom als größ­tem Anbie­ter von Internetanschlüssen.

Was ver­kauft die Telekom?

Die Tele­kom ver­kauft i.d.R. an Pri­vat­kun­den soge­nann­te asym­me­tri­sche Inter­net­zu­gän­ge, d.h. man kann z.B. Fil­me sehr schnell aus dem Netz strea­men, jedoch z.B. Fotos zu sei­nen Foto­dienst nur lang­sa­mer hoch­la­den, z.B. hat man bei VDSL50 einen Down­stream von 50Mbit/s und einen Upstream von 10Mbits/s. Bei den mobil­funk­ba­sier­ten Pro­duk­ten sieht das ähn­lich aus. Natur­ge­mäß laden die Tele­kom­kun­den damit mehr Daten aus dem Netz her­un­ter als herauf.

Das hat zu einen tech­ni­sche Grün­de, weil man so mehr Kun­den einen guten Down­load bie­ten kann, zum ande­ren auch einen stra­te­gi­schen: Wäre jeder Haus­halt gut sym­me­trisch an das Inter­net ange­bun­den, bestün­de irgend­wann kaum noch eine Not­wen­dig­keit, sei­ne Web­sei­te bei einem Pro­vi­der hos­ten zu las­sen und zudem wäre das eige­ne Netz dann sehr schnell voll mit angreif­ba­ren Ser­vern, die nicht pro­fes­sio­nell gewar­tet werden.

Wie kom­men die Daten aus dem Inter­net zur Telekom?

Net­ze ver­schie­de­ner Anbie­ter wer­den an bestimm­ten Stel­len über Kno­ten­punk­te gekop­pelt, damit z.B. Daten US-ame­ri­ka­ni­scher Anbie­ter wie You­Tube, Goog­le oder Micro­soft auch im Netz der Tele­kom ankom­men. Übli­cher­wei­se wer­den die Kno­ten ent­spre­chend des Bedar­fes der End­kun­den aus­ge­baut. Wenn mehr Men­schen z.B. HD- oder gar 4K-Inhal­te anschau­en möch­ten, muss einer­seits der­je­ni­ge, der die Fil­me anbie­tet, bes­ser an das übri­ge Inter­net ange­bun­den sein, ande­rer­seits muss der Kno­ten­punkt zur Tele­kom auch über aus­rei­chend Kapa­zi­tät ver­fü­gen – das Rohr muss also dick genug sein – das kos­tet Geld.

Und wo tobt jetzt der Kampf?

Die Tele­kom baut ihre Kno­ten­punk­te zu ande­ren Anbie­tern mitt­ler­wei­le nicht mehr dem Bedarf ent­spre­chend aus, z.B. zum Rechen­zen­trum von Hetz­ner, ein grö­ße­rer Play­er im deut­schen Rechen­zen­trums­markt. Ange­bo­te, die Hetz­ner gehos­tet sind, lau­fen damit gera­de zur Prime­time nur noch sehr lang­sam über die Telekomleitungen.

Die Tele­kom sagt: Jahaa! Wenn du Hetz­ner Daten per­for­mant zu uns schie­ben willst, dann musst du dafür extra bezah­len, so ein dickes Rohr kos­tet halt Geld! Bri­san­ter­wei­se lau­fen die ent­spre­chen­den Ange­bo­te der Tele­kom schnell durch die Lei­tun­gen (z.B. Enter­tain). Die meis­ten Rechen­zen­trums­be­trei­ber bezah­len anstands­los dann Geld an die Tele­kom und geben die Kos­ten an ihre Kun­den weiter.

Hetz­ner macht das auch, aber anders: Hetz­ner sagt dem Kun­den: „Wenn du Daten schnell zur Tele­kom schie­ben willst, zahlst du dafür einen Auf­preis, weil nur die Tele­kom so han­delt – alle ande­ren Anbie­ter bau­en ihre Kno­ten­punk­te ja aus!“ – Hetz­ner geht es nach eige­ner Aus­sa­ge dar­um, auf die Pro­ble­ma­tik der Poli­tik der Tele­kom auf­merk­sam zu machen und geht dabei auch das Risi­ko ein, Kun­den zu verlieren.

Mit Ange­bo­ten von You­Tube, Goog­le, Net­flix etc. macht die Tele­kom das nicht bzw. ist anzu­neh­men, dass da wohl für die „digi­ta­le Über­hol­spur“ auch Geld fließt. Die Tele­kom kas­siert damit dop­pelt: Ein­mal von den Kun­den für den Inter­net­an­schluss, der ohne unge­brems­ten Zugriff zum Inter­net ja irgend­wo blöd ist und zum zwei­ten von den Anbie­tern, die das Inter­net zu Inter­net und damit das Pro­dukt der Tele­kom zum Pro­dukt machen.

Die Tele­kom sagt: Jahaa, ihr Anbie­ter! Ihr lie­fert ja viel mehr Daten an unser Netz als wir an euer. Das ist kein Tei­len mehr, das ist Tran­sit.

Wir erin­nern uns an die­ser Stel­le dar­an, dass die Tele­kom asym­me­tri­schen Anschlüs­se ver­kauft. Und es wäre ja doof, wenn die tele­kom­ei­ge­nen Ange­bo­te dann super lau­fen, aber der Steam­ing­dienst aus Pusemuckel ruckelt. Für den Schlicht­kun­den ist dann klar: Dann kau­fe ich doch das Telekomprodukt!

Die Tele­kom sagt dann: Jahaa, du Strea­ming­sdienst aus Pusemuckel, kannst ja extra zah­len! (nun­ja, sie haben es dann hin­ter­her ja gar nicht so gemeint …).

Die Pro­ble­ma­tik

Die Tele­kom bestimmt somit, wel­che Diens­te in ihrem Netz per­for­mant lau­fen und wel­che nicht. Das hat mit Netz­neu­tra­li­tät und frei­em Inter­net ganz wenig zu tun. Es sind die Kun­den der Tele­kom, wel­che Daten anfor­dern und die Tele­kom muss m.E. schau­en, wie sie da kos­ten­de­ckend arbei­tet. Da sie ihre End­kun­den nicht die Preis­er­hö­hun­gen ver­schre­cken will, ver­sucht sie es halt anders. Jeder soll­te sich über­le­gen, ob ein sol­ches Gebah­ren unter­stüt­zens­wert ist.

PS: Ich bin Hetz­ner- und Kabeldeutschlandkunde.

1 21 22 23 24 25 148