Wirtschaft, Partnerschaft, Lobbyismus und Schule

Wir versetzen uns einmal in die Lage eines CEO

 

  1. Da gibt es mit der Digi­ta­li­sie­rung der Gesell­schaft eine Ent­wick­lung, um die kein staat­li­ches Bil­dungs­sys­tem her­um­kommt, wenn eine Volks­wirt­schaft auf Dau­er wach­sen und damit Din­ge wie Wohl­stand und sozia­len Frie­den ermög­li­chen soll.
  2. Da gibt es ein Bil­dungs­sys­tem mit immensen Inves­ti­ti­ons­stau auf dem Gebiet der Digi­ta­li­sie­rung, sowohl finan­zi­ell als in Berei­chen wie Informationsmanagement.
  3. Da gibt es Schu­len, die auf Wunsch des Dienst­herrn zuneh­mend selbst­stän­dig sein sol­len, die aber von den per­so­nel­le Res­sour­cen her oft opti­mier­bar auf­ge­stellt sind.
  4. Da gibt es ein Schul­sys­tem, dass von sei­ner Grund­struk­tur preu­ßisch-hier­ar­chisch struk­tu­riert und damit an Vor­ga­ben von oben gebun­den ist.
  5. Da gibt es eine Kon­kur­renz­si­tua­ti­on vie­ler unter­schied­li­cher Anbieter.
  6. Da gibt es ein teu­res, meist pro­vi­si­ons­ba­sier­tes Ver­triebs­sys­tem, das vor­wie­gend auf die Belan­ge der Wirt­schaft aus­ge­rich­tet ist und Schu­le von innen nicht kennt.
  7. Da gibt es Ent­schei­dungs­trä­ger, die tech­nisch manch­mal nur wenig qua­li­fi­ziert sind und die nicht in aus­rei­chen­dem Maße auf ein neu­tra­les Bera­tungs­sys­tem zurück­grei­fen können.
  8. Da gibt es einen immens vola­ti­len Markt, was die Pro­gres­si­on tech­ni­scher Ent­wick­lun­gen, Pro­dukt­fol­gen und Ansprü­che der Kun­den angeht.

 

Was ist die Natur wirtschaftlicher Player in einer sozialen Marktwirtschaft?

 

  1. Wenn sie nicht wach­sen, gehen sie unter oder wer­den von Kon­kur­ren­ten geschluckt.
  2. Wenn sie für ihre Pro­duk­te kei­nen Allein­stel­lungs­raum schaf­fen (meist weni­ger durch Fea­tures als viel­mehr durch Tup­per­par­ty­ver­mark­tungs­kon­zep­te, s.u.) wer­den sie kei­nen ver­läss­li­chen Absatz generieren.
  3. Wenn sie kei­nen Gewinn machen, bestehen sie nicht am Markt und eben­so ihre Mit­ar­bei­ter, für die sie eine Ver­ant­wor­tung tragen.
  4. Wenn Sie kei­ne guten Pro­duk­te haben, die sich an den Bedürf­nis­sen ihrer Kun­den ori­en­tie­ren, bestehen sie nicht am Markt.
  5. Wenn sie nicht die hier­ar­chi­schen Struk­tu­ren des Schul­sys­tems für sich selbst und ihren Absatz nut­zen und poli­ti­sche Lob­by­ar­beit betrei­ben, fal­len sie gegen­über ihren Kon­kur­ren­ten zurück. Das sieht man sehr hübsch an der Stel­lung der lob­by­lo­sen Open­So­ur­ce-Pro­duk­te im deut­schen Bildungsystem.

Ich fin­de bis­her dar­an nichts Böses oder Ver­werf­li­ches. Wirt­schaft ver­hält ent­spre­chend der Regeln einer Markt­wirt­schaft, womit dann ja auch gleich ein Schlüs­sel gefun­den wäre, das Gan­ze im Sin­ne demo­kra­ti­scher Grund­sät­ze zu steu­ern: Dafür gibt es einen Rah­men in Form von Geset­zen bzw. im Schul­sys­tem in Form von Erlassen.

TTIP ist nun der genia­le Schach­zug, auch die­se mög­li­che staat­li­che Ein­fluss­nah­me auf die eige­ne Pro­dukt­po­li­tik zu eli­mi­nie­ren – das wäre aber eine eige­ne Geschichte.

Wie reagiert Wirtschaft in diesem Umfeld?

 

Von „Wirt­schaft“ kom­me ich in mei­nem Umfeld fast nur über Ver­trieb­ler und ihren rhe­to­ri­schen Tak­ti­ken in Kon­takt. Ich bin bei ihnen mitt­ler­wei­le nicht mehr so ger­ne gese­hen. Daher mögen mei­ne Beob­ach­tun­gen sehr stark ein­ge­färbt sein, aber viel­leicht erkennt ihr das eine oder ande­re wieder.

Wirt­schaft will Tupperpartys

Man möch­te sein Pro­dukt auf Ver­an­stal­tun­gen, auf der Ent­schei­dungs­trä­ger anwe­send sind, mög­lichst exklu­siv prä­sen­tie­ren und nicht in Kon­kur­renz zu Mit­be­wer­bern. „Herr Riecken, das mit ihren finan­zi­el­len Beden­ken las­sen Sie mei­ne Sor­ge sein. Ich stel­le den Ent­schei­dungs­trä­gern das Pro­dukt mit sei­nen ins­be­son­de­re inves­ti­ven Vor­tei­len ger­ne allei­ne dem Gre­mi­um vor!“

Es kom­men ins­be­son­de­re Leh­rer nach einer sol­chen Tup­per­par­ty manch­mal total begeis­tert an und allein auf Grund­la­ge die­ser Begeis­te­rung wird dann z.B. ein Pro­gramm oder ein Gerät beschafft, mit dem man über Jah­re arbei­tet. Das ist lei­der auch bei Schul­bü­chern oft nicht anders.

Mit mir gibt es kei­ne Tup­per­par­tys. Es wer­den immer min­des­tens drei Mit­be­wer­ber zu einer Ver­an­stal­tung eingeladen.

Ich ver­su­che, die pro­vi­si­ons­ba­sier­te Ver­triebs­struk­tur nach Mög­lich­keit zu ver­mei­den. Wir vor Ort stre­ben an, nach Son­die­rung des Mark­tes stan­dar­di­sier­te Leis­tungs­be­schrei­bun­gen zu erstel­len, mit denen die Ent­schei­der nach den vor­ge­ge­be­nen Richt­li­ni­en for­mal sau­ber aus­schrei­ben kön­nen. Der güns­tigs­te gewinnt.

Stan­dar­di­sie­rung kann man trotz­dem errei­chen. Auch in einer for­mal kor­rek­ten Leis­tungs­be­schrei­bung las­sen sich Allein­stel­lungs­merk­ma­le eines Her­stel­lers sau­ber unter­brin­gen. Das klingt wie ein fie­ser Trick. Es macht aber kaum Sinn, z.B. für eine Regi­on zig ver­schie­de­ne WLAN-Sys­te­me zu beschaf­fen und den Sup­port­auf­wand dafür in die Höhe zu treiben.

Wirt­schaft will weg vom Kaufmodell

Micro­soft ver­mie­tet sei­ne Soft­ware, Ado­be auch, Aero­Hi­ve will für die Nut­zung sei­nes Hive­ma­na­gers jähr­lich Koh­le sehen (man kann den Hive­ma­na­ger jedoch auch selbst kos­ten­frei betrei­ben, wenn man das tech­ni­sche Know-How dafür hat), Lern­platt­for­men und Schul­netz­werk­lö­sun­gen wer­den nach Schü­ler­an­zahl jähr­lich abge­rech­net. Der Trend geht weg von der ein­ma­li­gen Anschaf­fung hin zu ver­läss­lich gene­rier­ten Umsät­zen. Da muss man sehr genau rech­nen – gera­de bei Lern­platt­for­men kann man für die jewei­li­ge Jah­res­ge­bühr oft hoch­wer­ti­ge Free­lan­cer vol­le zwei Mona­te für die Betreu­ung eines Open­So­u­re­pro­duk­tes bezah­len. Auch bei Micro­soft soll­te man sehr genau hin­schau­en, weil deren Lizen­sie­rungs­mo­dell mitt­ler­wei­le eigent­lich einen eige­nen Stu­di­en­gang erfordert.

Wirt­schaft will lang­fris­ti­ge Kundenbindung

Auch das ist ange­sichts der oft immensen Inves­ti­tio­nen, die zur Ent­wick­lung eines Pro­duk­tes not­wen­dig sind, zunächst wenig ver­wun­der­lich. Man kann Kun­den auf ver­schie­de­ne Art und Wei­se an sich bin­den: Zum einen durch kon­ti­nu­ier­li­che Qua­li­tät, zum ande­ren aber auch dadurch, dass ich den Wech­sel zu einem ande­ren Anbie­ter erschwe­re. Jeder, der schon ein­mal den DSL-Anbie­ter gewech­selt hat, weiß wie das u.U. aus­se­hen kann. Allein die Scheu vor mög­li­cher­wei­se auf­tre­ten­den Pro­ble­men bewegt zumin­dest mich hin und wie­der des lie­ben Frie­dens wil­len doch bei mei­nem Anbie­ter zu bleiben.

Wenn ich als Schu­le viel Con­tent bei irgend­wem gebun­kert und auf­ge­baut habe, ist die­ser jemand gesetzt – für Jah­re, alles ande­re wäre unrea­lis­tisch. Das weiß ein Anbie­ter und kann das z.B. indi­rekt nut­zen, indem er dafür sorgt, dass Inhal­te und Struk­tu­ren in pro­prie­tä­ren For­ma­ten vor­lie­gen oder der Zugriff auf eine Platt­form nicht über gän­gi­ge Web­stan­dards, son­dern z.B. neben dem Brow­ser ledig­lich mit einer spe­zi­el­len App mög­lich ist.

Spezielle Probleme in Deutschland für Anbieter

Deutsch­land hat eini­ge Spe­zi­fi­ka, die mir als Anbie­ter die Haa­re zu Ber­ge ste­hen las­sen wür­den. So exis­tiert ein aus­ge­präg­tes Bewusst­sein hin­sicht­lich des Daten­schut­zes – gele­gent­lich auch als Abwehr­kon­zept gegen­über neu­en Tech­no­lo­gien. Es gibt durch­aus schon Anbie­ter, die mir vor­ge­wor­fen haben, ich wür­de markt­be­hin­dernd bera­ten, wenn ich Schu­len auf gel­ten­de Daten­schutz­ge­set­ze ver­wei­se und z.B. Din­ge wie Ein­wil­li­gungs­er­klä­run­gen und Ver­trä­ge zur Auf­trags­da­ten­ver­ar­bei­tung zum Kri­te­ri­um für die Aus­wahl eines Pro­dukts mache.

Wei­ter­hin gibt es in Deutsch­land ein weit­aus enge­res Neu­tra­li­täts­ge­bot als in ande­ren Län­dern: Staat­li­che Schu­len haben nur sehr ein­ge­schränk­te Mög­lich­kei­ten, Koope­ra­tio­nen mit der Wirt­schaft ein­zu­ge­hen, um ihre zum Teil chro­ni­sche Unter­fi­nan­zie­rung zu kom­pen­sie­ren. Anbie­ter ver­su­chen, die­ses Pro­blem zu umge­hen, indem wirt­schaft­li­che Ver­ei­ne gegrün­det wer­den, die teil­wei­se als gemein­nüt­zig aner­kannt sind und so auch eini­ger­ma­ßen „sau­ber“ durch die Poli­tik beför­dert wer­den kön­nen. Die­se Kon­struk­te sind aber nötig, weil die Rege­lun­gen in Deutsch­land eben sehr eng sind.

In Deutsch­land wird zusätz­lich digi­ta­le Tech­no­lo­gie oft­mals nicht als Chan­ce, son­dern mehr als Bedro­hung der eige­nen Lebens- und Unter­richts­pra­xis begrif­fen. Schu­le müs­se sich „dem all­ge­mei­nen Trend ent­ge­gen­stel­len“ und „Alter­na­ti­ven zum digi­ta­len All­tag bie­ten“. Gleich­zei­tig wer­den die Kom­mu­ni­ka­ti­ons­struk­tu­ren durch immer neue Auf­ga­ben von Schu­le kom­ple­xer und ana­lo­ge For­men wie schwar­ze Bret­ter kom­men mehr und mehr an Gren­zen. „Dann auch noch umstel­len auf Digitalzeugs?“.

In Deutsch­land gibt es an Schu­len zuhauf Lokal­prin­zen wie mich, die Sys­te­me auf­ge­baut haben und betreu­en, obwohl es nicht deren Auf­ga­be ist. Nur ver­traut man dem Lokal­prin­zen natür­lich weit mehr als einer Fir­ma, die am Tele­fon nur „Fach­chi­ne­sisch und arro­gant redet“ (das sind oft die rück­ge­mel­de­ten Erfah­run­gen). Der Lokal­prinz ist greif­bar, man ist u.U. nicht mit allem zufrie­den, aber man weiß, was man hat und was nicht. Leh­rer grei­fen nicht ger­ne zum Tele­fon, um sich hel­fen zu las­sen – das wäre ein Ein­ge­ständ­nis von Unvollkommenheit.

Und zuletzt haben wir in Deutsch­land ein merk­wür­di­ges Finan­zie­rungs­kon­strukt: Lehr­kräf­te wer­den durch das Land, Sach­mit­tel durch den Trä­ger finan­ziert – da ste­hen sich schon unter­schied­li­che Inter­es­sen gegen­über. Nun sind die­se bei­den Berei­che aber nicht zu tren­nen. Beschaf­fung von Soft­ware und Gerä­ten ist immer auch mit päd­ago­gi­schen Fra­gen ver­knüpft. Wer hier als Anbie­ter nicht die Belan­ge bei­der Sei­ten erkennt und nutzt, wird es schwer haben, im Markt Fuß zu fas­sen. Daher heu­ern vie­le Anbie­ter jetzt Lehr­kräf­te an, um ihre Pro­duk­te in den Schu­len zu plat­zie­ren. Die­se erhal­ten für ihre Arbeit natür­lich eine Ver­gü­tung und sind oft an unter­neh­mens­in­ter­ne Kom­mu­ni­ka­ti­ons­richt­li­ni­en gebun­den. Kei­ne gute Vor­aus­set­zung für Neutralität.

Wer löst es wie?

An vie­len Stel­len passt für mich der struk­tu­rel­le Rah­men nicht. Hier ist Poli­tik gefor­dert, an neur­al­gi­schen Punk­ten Klar­heit zu schaf­fen, etwa min­des­tens dafür zu sor­gen, dass es für Anbie­ter und Schu­len kla­re Check­lis­ten oder rechts­si­che­re Mus­ter­ver­trä­ge gibt, wie daten­schutz­kon­form gear­bei­tet wer­den kann.

Ich fürch­te bloß, dass von die­ser Sei­te nicht viel zu erwar­ten und das genau die­se Leer­stel­le ursäch­lich für das ist, was oft als „Lob­by­is­mus an Schu­len“ beklagt wird.

Was soll denn ein Anbie­ter ande­res machen, als sub­ver­si­ve, krea­ti­ve Wege zu fin­den, um an die poten­ti­ell lukra­ti­ve Kun­den­grup­pe zu kom­men, die sich in den Schu­len findet?

Ein neu­tra­les Bera­tungs­sys­tem als Schnitt­stel­le zwi­schen Anbie­tern und Schu­le kann auch viel bewe­gen. Ich mer­ke bloß bei mir selbst immer wie­der, wie sehr ich pri­va­te Vor­lie­ben und Abnei­gun­gen bestimm­ten Pro­duk­ten und Dienst­leis­tun­gen gegen­über aktiv bekämp­fen muss, um wirk­lich neu­tral zu blei­ben oder eben in Fäl­len, wo ich das ein­fach nicht bin, ein­fach an Per­so­nen abzu­ge­ben, die in dem Bereich ver­sier­ter oder ggf. auch schlicht begeis­ter­ter sind.

Ich könn­te mir vor­stel­len und mei­ne, es auf Twit­ter auch immer wie­der mit­zu­be­kom­men, dass es Kol­le­gen gibt, die auch wie ich genau damit rin­gen oder den inne­ren Kon­flikt zuguns­ten einer Prä­fe­renz auch schon ganz ent­schie­den haben.

Fazit

 

Für mich ist Lob­by­is­mus pri­mär in den Struk­tu­ren von Schu­le bereits ange­legt. Wenn man dafür sen­si­bi­li­sie­ren möch­te, sehe ich den Ball bei der Kul­tus­po­li­tik. Ich habe viel Ver­ständ­nis dafür, wie Anbie­ter zur­zeit agie­ren (müs­sen) und Hoch­ach­tung vor vie­len, die ich ken­nen ler­nen durf­te, die sich trotz­dem mit Herz­blut und Ver­bes­se­rungs­wil­len als Part­ner von Schu­le ver­ste­hen – und so auch agie­ren, aber natür­lich ger­ne auch mal die teu­ers­te Lösung ver­kau­fen, die dann zwar super läuft, aber von der Dimen­sio­nie­rung und der Kos­ten­ef­fi­zi­enz in mei­nen Augen nicht unbe­dingt immer das Opti­mum darstellt.

Social Messenger sind der Untergang

Ges­tern bin ich wie­der mit der vol­len Band­brei­te der Hilf­lo­sig­keit gegen­über den Eigen­dy­na­mi­ken kon­fron­tiert wor­den, die ent­ste­hen, wenn sich jün­ge­re Schü­le­rin­nen und Schü­ler auf Whats­App bewegen.

  • Belei­di­gun­gen
  • ver­än­der­te Bil­der unlieb­sa­mer Mitschüler
  • Ent­haup­tungs­vi­de­os
  • […]
  • Ich kann nichts dafür“-Behauptungen (In der Schü­ler­vor­stel­lungs­welt kann man sich ja schließ­lich nicht dage­gen weh­ren, in Whats­App-Grup­pen auf­ge­nom­men zu werden)

Die­se Din­ge schei­nen sich nach mei­nen Beob­ach­tun­gen vor alle in den jün­ge­ren Klas­sen­stu­fen der Sekun­dar­stu­fe I zu häu­fen. Die reflex­ar­ti­gen Reak­tio­nen auf Vor­komm­nis­se sehen zunächst so aus:

  1. Han­dy weg­neh­men. Die dür­fen Whats­App erst ab 16 nutzen!“
  2. Han­dy ver­bie­ten. Die kön­nen damit nicht umgehen!“
  3. Medi­en­päd­ago­gen ein­la­den, der denen das mal sagt!“
  4. Eltern in die Pflicht neh­men. Die sind unver­ant­wort­lich, Kin­dern ein Smart­phone zu kaufen!“
  5. Nun sag‘ mal Maik, was soll ich denn jetzt machen? Du bist doch Medi­en­fuz­zi. Alles Schei­ße mit die­sem Digitalzeugs!“

Han­deln wir das mal alles in der Kür­ze ab, die es sach­lo­gisch verdient:

Zu 1.)

Net­ter Ver­such. Das Han­dy gehört uns nicht und umfasst den Pri­vat­be­reich der SuS. Das ist so auf der Ebe­ne wie: „Ich ver­bie­te dir, nicht alters­ge­rech­te Fil­me in dei­ner Frei­zeit zu schauen!“

Zu 2.)

Net­ter Ver­such. Das Han­dy gehört uns nicht und umfasst den Pri­vat­be­reich der SuS. Das ist so auf der Ebe­ne wie: „Ich ver­bie­te dir, dich in dei­ner Frei­zeit mit Han­nes und Tim zu tref­fen. Die haben einen schlech­ten Ein­fluss auf dich!“

Zu 3.)

Net­ter Ver­such. Und bequem. Dann macht der das halt (wenn er dann mal Zeit hat). Ich nen­ne sowas medi­en­päd­ago­gi­sches Fei­gen­blatt: „Wir haben was getan – wir haben jeman­den ein­ge­la­den! Wenn dann kei­ner kommt, tja, kön­nen wir auch nichts dafür!“

Zu 4.)

Völ­lig rich­tig. Wenig bis so gar nicht rea­lis­tisch. Eltern hal­ten das mit dem Han­dy oft so: Wir kau­fen dir eines. Wir ken­nen uns damit eh nicht aus. Das Erstau­nen ist dann rie­sig, wenn dann mit dem Gerät Din­ge gesche­hen, die unschön sind. Dann ist das Inter­net schuld. Oder wahl­wei­se die Schu­le, die ja nichts dage­gen macht. Mein Bild: Sie schi­cken ein vier­jäh­ri­ges Kind mit dem Rad bei Dun­kel­heit quer durch die Stadt und sind dann völ­lig über­rascht, wenn es umge­nie­tet wird. Die­ser Scheiß­ver­kehr ist dann schuld!“ (sonst müss­te man sich ja selbst sei­ner Ver­ant­wor­tung stellen …)

Zu 5.)

Die Situa­ti­on ist sehr kom­plex. Das Sys­tem der Betei­lig­ten und der Ursa­chen auch. Wer hier ein ein­fa­che Ant­wort erwar­tet, ver­kennt die Kom­ple­xi­tät völ­lig. Bes­ten­falls ver­la­gert er das Pro­blem schlicht vor­der­grün­dig aus dem Wahr­neh­mungs­be­reich von Schu­le. Lei­der wird das immer wie­der in die Schu­le zurück­schwap­pen. mit dem Unter­schied, dass man dann noch sehr viel weni­ger über die Vor­gän­ge in der „Par­al­lel­welt“ weiß,

Maik, du Klug­schei­ßer, ich will Lösungen! 

Lösung 1:

Wo Ver­bo­te nicht grei­fen, kom­me ich um Ver­hand­lun­gen und päd­ago­gi­sche Ver­ein­ba­run­gen nicht her­um. Es gibt an Schu­len Gre­mi­en, die die ein­zel­nen Grup­pen ver­tre­ten. Es gibt eine Schü­ler- und eine Eltern­ver­tre­tung. Wenn ich ziel­of­fen hier zu Ver­ein­ba­run­gen kom­me, die den Han­dy­ge­brauch inner­halb der Schu­le regeln, habe ich eine grö­ße­re Chan­ce, dass die­se Ver­ein­ba­run­gen ein­ge­hal­ten und durch demo­kra­tisch ver­han­del­te Sank­tio­nen not­falls auch durch­ge­setzt wer­den. Zusätz­lich ist das u.U. eine Chan­ce, Demo­kra­tie prak­tisch zu leben und es ist eine Chan­ce, ins­be­son­de­re Eltern und Schü­lern auf Augen­hö­he zu begeg­nen. Die­se Gre­mi­en müs­sen ja ihrem „Wahl­volk“ Ent­schei­dun­gen ver­mit­teln. Und ins­be­son­de­re Eltern kön­nen ja schon mehr als Kaf­fee und Kuchen bei Ver­an­stal­tun­gen zu spen­den. Die­se Idee schei­tert oft an dem dafür not­wen­di­gen Para­dig­men­wech­sel: Schu­le ist ja von ihrem Wesen her hier­ar­chisch organisiert.

Lösung 2:

Wo in der Gesell­schaft bekom­men SuS vor­ge­lebt, wie man z.B. sozia­le Medi­en sinn­voll und reflek­tiert nutzt? Wo in Schu­le bekom­men SuS gezeigt, wel­che Poten­tia­le für das eige­ne Ler­nen in Social­me­dia steckt? Wenn ich Schu­len Por­tal­lö­sun­gen mit zar­ten Social­me­dia­funk­tio­nen emp­feh­le, kommt sehr oft: „Aber die­sen Chat, den müs­sen wir drin­gend abschal­ten, da pas­siert nur Mist, wer soll das kon­trol­lie­ren!“ Wenn da „Mist“ pas­siert, ist das m.E. ein Geschenk, weil es in einem geschütz­ten Raum ent­steht und päd­ago­gisch auf­ge­ar­bei­tet wer­den kann. Wir brau­chen mehr sol­chen „Mist“, der auf Sys­te­men von Schu­len geschieht, weil wir ihm dort ohne irgend­wel­chen Anzei­gen und rich­ter­li­chen Anord­nun­gen begeg­nen kön­nen – die Daten haben wir ja selbst und idea­ler­wei­se auch kla­re Rege­lun­gen, wann die­se von wem wie ein­ge­setzt wer­den dürfen.

Lösung 3:

Kein Unter­richt über Medi­en, son­dern Unter­richt mit Medi­en. Das erfor­dert ein schul­wei­tes Medi­en­kon­zept und es wird erstau­nen, wie viel sich sogar ganz ohne WLAN und Tablets in die­sem Bereich machen lässt. Über­ra­schen­der­wei­se sind bestimm­te Wer­te und Lebens­er­fah­run­gen auch in Zei­ten von Social­me­dia noch gültig.

Lei­der wird die Umset­zung die­ser Erkennt­nis genau wie damals der Buch­druck eine Alpha­be­ti­sie­rung erfor­dern und zwar vor allem eine digi­ta­le Alpha­be­ti­sie­rung von Lehr­kräf­ten. Und das Lesen fällt man­chem leich­ter und man­chem schwe­rer. Wenn ich aber an den Poten­tia­len und Mög­lich­kei­ten teil­ha­ben möch­te und wenn ich hand­lungs­fä­hig sein will, kom­me ich nicht dar­um her­um, ler­nen zu müs­sen. NIcht nur wegen der SuS, son­dern vor allem aus Ego­is­mus: Digi­ta­ler Analpha­be­tis­mus führt direkt in die Anhän­gig­keit von ande­ren und in die Unsouveränität.

 

 

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.

Bastard Operator from Hell (BOFH)

Als Admi­nis­tra­tor schwelgt man hin und wie­der in All­machts­fan­ta­sien. Wenn man sei­ne User soweit erzo­gen hat, dass sie die vage Mög­lich­keit ver­wer­fen, der Admi­nis­tra­tor sei fehl­bar und statt­des­sen de Feh­ler bei sich selbst suchen, hat man eini­ges erreicht. Man ist Zau­be­rer, geni­al und die User wun­dern sich, wie ein ein­zel­ner Mensch so viel hin­be­kom­men kann. Aber es ist kei­ne Zau­be­rei – es ist infor­ma­ti­sche Grund­bil­dung, bzw. basiert darauf.

Die­se Situa­ti­on ist eine ihrer Struk­tur nach auto­ri­tä­re und basiert auf Wis­sens- und Kom­pe­tenz­un­ter­schie­den. Die­se Struk­tur ist sehr, sehr gefähr­lich und nicht umsonst hat auch an Schu­len der Gesetz­ge­ber Instan­zen erson­nen, die die Arbeit von Admi­nis­tra­to­ren kon­trol­lie­ren soll­ten – z.B. Daten­schutz­be­auf­trag­te oder Schul­lei­tun­gen. Wahr­schein­li­cher scheint mir, das vie­le Admi­nis­tra­to­ren an Schu­len im Prin­zip Stake­hol­der in ideel­len Macht­po­si­tio­nen sind, deren Ein­fluss in den nächs­ten Jah­ren expan­die­ren wird. Auch das ist ein Pro­blem. Vor allem auch für die Schul­ent­wick­lung, für die ich ohne IT-gestütz­te Ver­fah­ren kei­nen Frei­raum sehe.

Ich arbei­te daher in mei­nem Land­kreis mit an einem Pro­jekt, die­ses Pro­blem zu ent­schär­fen durch Struk­tu­ren, die nicht auf dem Prin­zip der ideel­len Macht basie­ren. Ich arbei­te im Prin­zip mit dar­an, mich selbst in der Funk­ti­on eines Admi­nis­tra­tor abzuschaffen.

Wenn ich sehr böse wäre, könn­te ich viel­leicht ver­sucht sein, fol­gen­de Din­ge zu tun (in jeder Geschich­te sind Feh­ler eingebaut).

Akt 1:

Das Ende der Som­mer­fe­ri­en naht. Ich habe kei­nen Bock auf Unter­richt. Mal über­le­gen. Ach, da gibt es ja die Schul­buch­aus­lei­he, die mitt­ler­wei­le kom­plett IT-gestützt arbei­tet. Ohne Bücher kein Unter­richt. Kli­cke­di­kli­cke­dik­lack – ein­fach mal ein MyS­QL-State­ment, wel­ches die Daten­bank von der Kon­so­le aus zer­fetzt. Hihi.

Der Anruf dau­ert nicht lan­ge: „Wir kön­nen über­haupt kei­ne Daten mehr abru­fen und ver­wal­ten! – Die SuS brau­chen ihre Bücher, drin­gend“ Ich so: „Oh. Da hat wohl die Fest­plat­te einen ihrer Schreib­feh­ler gemacht, die sta­tis­tisch ja immer auf­tre­ten. Da reicht ja schon ein Meson aus dem Welt­all.“ Sie so: „Aha, UND JETZT?“ Ich: „Oach, ich rufe mal den Chef an, damit der mich für zwei Tage frei­stellt, damit ich das wie­der fli­cken kann, das ist ja schon inte­gral für die Schule.“

Zwei Tage spä­ter habe ich den neu­en Ego­shoo­ter durch und spie­le dann inner­halb von fünf Minu­ten eine der Siche­run­gen ein. Natür­lich wird mir für mei­nen Ein­satz auf der nächs­ten Dienst­ver­samm­lung über­schwäng­lich gedankt. Man, ich sah aber auch echt gerä­dert nach den zwei durch­ge­zock­ten Näch­ten aus.

Akt 2:

Boah, was geht mir der Koor­di­na­tor da auf den Sack mit sei­ner Pene­tranz, was das Aus­fül­len die­ser idio­ti­schen Kurs­hef­te angeht. Na, dann wol­len wir mal sei­ne Pen­si­on etwas kür­zen. Sein häus­li­ches WLAN strahlt in kla­rer Win­ter­nacht recht weit in die Natur. Mal schnell einen klei­ne Raspi mit Akku vor sei­nem Haus in die Bota­nik gewor­fen und den WLAN-Schlüs­sel bru­teforcen. Lang­wei­lig. Dau­ert nicht mal zwei Tage. Jetzt noch die MAC-Adres­se sei­nes Rech­ners abfi­schen, ein wenig MAC-Spoo­fing und schon habe ich sei­ne IP, unter der ich dann mal ein­schlä­gi­ges Mate­ri­al auf den Schul­ser­ver in sei­nen Account lade – das mit dem Pass­wort war nicht wei­ter schwie­rig, weil er den Datei- und Mai­l­aus­tausch über unver­schlüs­sel­te Ver­bin­dun­gen abwickelt.

Mit betre­te­ner Mie­ne klop­fe ich zwei Tage spä­ter beim Chef. Das Moni­to­ring hät­te rou­ti­ne­mä­ßig die Datei­grö­ßen über­prüft und sei dabei auf eine HD-Datei gesto­ßen, die … Dau­er­te kei­ne Woche, dann saß der Kna­be beim Dienst­herrn. Sprach sich natür­lich auch im Ort her­um. Hat sich dann irgend­wann ver­set­zen las­sen. Die Ehe hat es wohl überlebt.

Akt 3:

Die haben da so ein Bezahl­ter­mi­nal gelie­fert und in der Men­sa auf­ge­stellt. War erst nicht in mei­nem Netz, bis dann raus­kam, dass eini­ge SuS das Ding zum Sur­fen nutz­ten. Jetzt steht das Ding in mei­nem VLAN und mein Chip zum Bezah­len des Mit­tag­essens ist ja chro­nisch leer. Mal ein wenig Wireshark lau­fen las­sen – hm, eine ver­schlüs­sel­te Ver­bin­dung. Oach, ich knal­le dem Gerät ein­fach den Root­key mei­ner eige­nen CA rein und kann so die Kom­mu­ni­ka­ti­on mit Man-in-the-midd­le auf­bre­chen. Was an eini­gen Schwei­zer Schu­len zum Fil­tern des Inter­net­ver­kehrs für SuS genutzt wird, kann ja nicht so böse sein. So. Der Mar­vin lädt gera­de sei­nen Chip auf. Dank der dil­le­tan­ti­schen Umset­zung des Ses­sion­ma­nage­ments kann ich das Geld etwas umlei­ten. Jetzt aber schnell abm­amp­fen, bevor Mar­vins Eltern mer­ken, dass der Bank­ein­zug nicht zur Auf­la­dung des Chips führte. 

Die Geschich­ten machen aber klar, was ein gewief­ter Auto­di­dakt im Prin­zip tun könn­te. Die Opfer sind dem ohne infor­ma­ti­sches Grund­wis­sen wehr­los aus­ge­setzt. Beson­ders bit­ter fin­de ich die zwei­te Geschich­te. Ein Anwalt müss­te ver­su­chen, die „Bewei­se“ zu ent­kräf­ten und es steht die Aus­sa­ge einer „kom­pe­ten­ten Per­son“ und es ste­hen Log­da­tei­en dage­gen – zudem müss­te man erst auf die Idee kom­men, wie die­ser Angriff funk­tio­niert (es ist übri­gens wahr­schein­lich viel leich­ter, das über das Han­dy des Opfers zu machen). Außer­dem hät­te unser Admi­nis­tra­tor wahr­schein­lich sogar auch Zeit, sei­ne Taten noch wei­ter zu verschleiern.

Ich bin der Mei­nung, dass wir infor­ma­ti­sche Grund­bil­dung flä­chen­de­ckend benötigen.

Ich muss doch auch nicht ver­ste­hen, wie der Motor eines Autos funk­tio­niert, um von A nach B zu kommen!“

Das Argu­ment hal­te ich für falsch. Auto­fah­ren betrifft einen Teil­be­reich der Mobi­li­tät – das Digi­ta­le bestimmt mitt­ler­wei­le extrem vie­le Lebensbereich.

Die Stun­den­plä­ne sind doch jetzt schon total voll. Wel­ches Fach soll denn dafür entfallen?“

Kei­nes. Um es mit Gun­ter Dueck zu sagen: „Dafür muss nichts wei­chen, das müs­sen wir jetzt eben auch noch machen!“, weil 

  • Wis­sen und Kom­pe­ten­zen in die­sem Bereich Stand­ort­fak­to­ren für jede Regi­on in Deutsch­land sein werden.
  • Wis­sen und Kom­pe­ten­zen in die­sem Bereich wich­tig für die Teil­ha­be an demo­kra­ti­schen Pro­zes­sen sein wer­den – war­um leh­nen Infor­ma­ti­ker z.B. elek­tro­ni­sche Wah­len vehe­ment oft ab?
  • Infor­mel­le Selbst­be­stim­mung als Grund­recht ohne Wis­sen und Kom­pe­ten­zen in die­sem Bereich ein Witz ist.

Ich fin­de, das reicht auch schon an Begründung.

Noch ein Sei­ten­hieb: Medi­en­kom­pe­tenz erscheint offen­bar eini­gen Play­ern als Ersatz oder Mög­lich­keit, erst­mal „rea­lis­tisch“ zu begin­nen. Ich hal­te Kom­pe­ten­zen ohne soli­de Wis­sens­grund­la­ge für weit­ge­hend sinn­be­freit – Gesprä­che mit Aus­bil­dungs­be­trie­ben und Ver­wal­tun­gen bestär­ken mich in die­ser Annahme.

1 2 3 4 5 10