Datenschutz Dude steckt im Chaos aus klassischen CAPTCHAs, während Agentin Cipher neben einem klaren Formular und einem eigenen ALTCHA/GateCHA-Symbol den Ausweg zeigt.

Irgend­wann steht man vor der immer glei­chen Wahl. Goog­le reCAPTCHA ein­bau­en und damit jeden For­mu­lar­be­su­cher erst ein­mal bei einem exter­nen Dienst vor­bei­schi­cken. Oder hCaptcha, Cloud­fla­re Turn­sti­le, was gera­de sonst noch so auf dem Markt her­um­steht oder die Web-Agen­tur gera­de so in der Emp­feh­lungs­schub­la­de “Haben wir schon immer bei Kun­den instal­liert” hat. Unter­schied­li­che Logos, ähn­li­che Idee: Ein Dritt­an­bie­ter soll ent­schei­den, ob da ein Mensch ein Kon­takt­for­mu­lar aus­füllt oder ein Bot mit zu viel Tagesfreizeit.

Tech­nisch kann das funk­tio­nie­ren. Daten­schutz­recht­lich zieht man sich damit aber schnell eine klei­ne Kara­wa­ne an Fol­ge­fra­gen ins Haus. Wel­che Daten flie­ßen beim Laden des For­mu­lars? Was ver­ar­bei­tet der Anbie­ter? Ist ein Auf­trags­ver­ar­bei­tungs­ver­trag erfor­der­lich? Wie sieht es mit Dritt­land­trans­fers aus? Muss der Dienst erst nach einer Ein­wil­li­gung gela­den wer­den? Und war­um steht auf der Web­site jetzt ein Coo­kie-Ban­ner, obwohl man eigent­lich nur ver­hin­dern woll­te, dass das Kon­takt­for­mu­lar für Via­gra-Ange­bo­te, SEO-Wun­der und angeb­li­che Erb­schaf­ten aus Über­see miss­braucht wird?

Wir hat­ten dar­auf schon lan­ge kei­ne beson­de­re Lust mehr. Kein Con­sent-Popup nur wegen eines CAPTCHA. Kei­ne Daten­schutz­er­klä­rung, die sich sei­ten­lang mit einem Dienst beschäf­tigt, der im Kern eine recht schlich­te Fra­ge beant­wor­ten soll: Bist du ein Mensch oder ein Bot? Aber ewig ohne die­sen Schutz online zu sein, ist auch zeit- und ner­ven­auf­rei­bend. Denn unge­schütz­te For­mu­la­re sind ein gefun­de­nes Bot-Fres­sen. Die Ant­wort dar­auf muss aber nicht zwin­gend über die Infra­struk­tur eines gro­ßen US-Anbie­ters lau­fen. Und sie muss auch nicht bedeu­ten, dass Besu­cher erst Bus­se, Ampeln und Zebra­strei­fen sor­tie­ren dür­fen, bis das For­mu­lar end­lich abge­schickt wer­den kann. Der Dude: “Und gehört jetzt die Klin­gel im angren­zen­den Bild­be­reich mit zum Fahr­rad oder doch nicht?”

Der Aus­weg heißt ALTCHA – und ist erfreu­lich unspektakulär

ALTCHA ist ein Open-Source-CAPTCHA, das einen ande­ren Ansatz ver­folgt als die übli­chen Ver­däch­ti­gen. Kei­ne Bil­der­rät­sel, kei­ne heim­li­che Aus­wer­tung von Maus­be­we­gun­gen und kein exter­ner Dienst, der beim Besuch des For­mu­lars schon ein­mal tech­nisch mit am Tisch sitzt. Statt­des­sen bekommt der Brow­ser eine klei­ne Rechen­auf­ga­be. Das Prin­zip nennt sich Pro­of of Work. Wer bei dem Begriff jetzt an Mining-Far­men, Gra­fik­kar­ten­prei­se und Leu­te denkt, die in der Gara­ge Kryp­to­wäh­run­gen schür­fen: kei­ne Sor­ge. Hier geht es um eine win­zi­ge Auf­ga­be, die ein nor­ma­ler Brow­ser im Hin­ter­grund in kur­zer Zeit löst.

Für ech­te Besu­che­rin­nen und Besu­cher fällt das prak­tisch nicht auf. Für Bots, die zehn­tau­send For­mu­la­re pro Minu­te ver­sen­den wol­len, wird die Sache dage­gen deut­lich teu­rer. Genau das ist der Zweck der Übung: Nicht bewei­sen, dass ein Mensch beson­ders mensch­lich aus­sieht, son­dern auto­ma­ti­sier­te Mas­sen­an­fra­gen unat­trak­tiv machen. ALTCHA kann voll­stän­dig selbst betrie­ben wer­den. Der Chall­enge-Ser­ver stellt Auf­ga­ben bereit und prüft die ein­ge­reich­ten Ant­wor­ten. Es ist also kein SaaS-Dienst, bei dem man sich in das nächs­te Dash­board eines Dritt­an­bie­ters ein­log­gen und am Ende des Monats eine Rech­nung für sei­ne eige­nen For­mu­lar­auf­ru­fe zah­len darf oder eben mit den per­so­nen­be­zo­ge­nen Daten sei­ner Web­sei­ten­be­su­cher dafür bezahlt.

Der ent­schei­den­de Vor­teil: Die tech­ni­sche Ver­ar­bei­tung kann auf der eige­nen Infra­struk­tur blei­ben. Kei­ne Ein­bin­dung eines exter­nen CAPTCHA-Anbie­ters, kei­ne zusätz­li­chen Skrip­te von dort und kei­ne Daten­über­mitt­lung nur des­halb, weil jemand eine Nach­richt über ein Kon­takt­for­mu­lar schi­cken möch­te. Das macht die Welt nicht auto­ma­tisch daten­schutz­frei. Auch ein selbst betrie­be­ner Ser­ver ver­ar­bei­tet Ver­bin­dungs­da­ten und unter Umstän­den IP-Adres­sen. Aber man weiß wenigs­tens, wo die Daten ver­ar­bei­tet wer­den, wie der Dienst kon­fi­gu­riert ist und wer im Zwei­fel zustän­dig ist. Das ist in der Daten­schutz­pra­xis schon deut­lich mehr wert als die übli­che Ant­wort: „Das macht halt Google.“

War­um wir GateCHA statt der Roh-Biblio­thek genom­men haben

ALTCHA lie­fert die eigent­li­chen Bau­stei­ne. Das genügt, wenn man für eine ein­zel­ne Web­site ein CAPTCHA inte­grie­ren will und kei­ne Scheu vor etwas eige­ner Ent­wick­lungs­ar­beit hat. Sobald meh­re­re Web­auf­trit­te an einem zen­tra­len CAPTCHA-Dienst hän­gen sol­len, wird es aber schnell etwas weni­ger char­mant. Dann braucht man eine sau­be­re Tren­nung zwi­schen den ein­zel­nen Web­sites, eine Schlüs­sel­ver­wal­tung, Schutz gegen miss­bräuch­li­che Anfra­gen und idea­ler­wei­se einen Ort, an dem man auch in sechs Mona­ten noch nach­voll­zie­hen kann, was da eigent­lich ein­ge­rich­tet wur­de. Genau dafür gibt es GateCHA.

GateCHA ist eine schlan­ke, unter MIT-Lizenz ange­bo­te­ne Ser­ver­soft­ware rund um das ALT­CHA-Pro­to­koll. Es bringt ein Dash­board, einen Log­in und – für uns ent­schei­dend – getrenn­te API-Keys pro Web­site mit. Jede Web­site erhält ihren eige­nen Schlüs­sel. Die­ser Schlüs­sel kann auf kon­kre­te Domains beschränkt wer­den. Wenn ein Pro­jekt Pro­ble­me macht oder ein Key aus­ge­tauscht wer­den muss, bleibt der Rest davon unberührt.

Dazu kom­men Rate-Limits pro Key und eine adap­ti­ve Schwie­rig­keit. Wenn eine Quel­le auf­fäl­lig vie­le Anfra­gen stellt, kann GateCHA die Rechen­auf­ga­be für die­se Quel­le anhe­ben. Ein nor­ma­ler Besu­cher merkt davon im Ide­al­fall nichts. Ein Bot merkt es schon. Und zwar in Form von mehr Rechen­auf­wand, was bei auto­ma­ti­sier­ter Mas­se genau die rich­ti­ge Spra­che ist.

Der prak­ti­sche Vor­teil für Men­schen, die nicht aus jedem CAPTCHA ein Platt­form­pro­jekt machen wol­len: GateCHA kommt als fer­tig kom­pi­lier­te Bina­ry. Kein Docker-Zir­kus, kei­ne Abhän­gig­keits­samm­lung, kein Kuber­netes-Clus­ter für ein Kon­takt­for­mu­lar. Her­un­ter­la­den, aus­führ­bar machen, kon­fi­gu­rie­ren, star­ten. Ganz fer­tig ist es damit natür­lich nicht – irgend­was ist immer –, aber erstaun­lich nah dran.

Der Ser­ver steht. Fast überall.

Unser Daten­schutz Dude betreibt unse­re Instanz auf einem Uber­space-Account. Dort las­sen sich eige­ne Diens­te ohne Root-Rech­te im Benut­zer­kon­text betrei­ben. Eine eige­ne Sub­do­main mit Zer­ti­fi­kat ist eben­falls schnell davor geschal­tet. Das ist aber kei­ne Uber­space-Spe­zia­li­tät. Das Grund­prin­zip funk­tio­niert auf prak­tisch jedem (klei­nen) vSer­ver oder in einer vor­han­de­nen Ser­ver­um­ge­bung der Haus-IT:

  1. GateCHA auf dem eige­nen Ser­ver bereitstellen.
  2. Den Dienst dau­er­haft über sys­temd, Super­vi­sor oder eine ver­gleich­ba­re Lösung betreiben.
  3. Einen Rever­se Pro­xy davorschalten.
  4. Eine eige­ne Sub­do­main ein­rich­ten, zum Bei­spiel ‘captcha​.eure​-domain​.de‘.
  5. Not­wen­di­ge Zer­ti­fi­ka­te, z.B. Let’s Encrypt aktivieren.
  6. Für jede ange­schlos­se­ne Web­site einen eige­nen API-Key erstellen.
  7. Das GateCHA-Wid­get (in die­sem Fall nicht das ALT­CHA-Wid­get) im Front­end ein­bin­den und die Lösung beim For­mu­lar­ver­sand ser­ver­sei­tig prüfen.

Das klingt län­ger, als es ist. Wer ohne­hin mit Ser­vern, SSH und Rever­se Pro­xies arbei­tet, hat den grund­sätz­li­chen Teil an einem Nach­mit­tag ste­hen. Ein­schließ­lich der unver­meid­li­chen Vier­tel­stun­de, in der man eine Feh­ler­mel­dung anstarrt, obwohl eigent­lich nur eine Varia­ble oder eine Domain fehlt. Zwei Ein­stel­lun­gen ver­die­nen dabei beson­de­re Aufmerksamkeit:

Ers­tens: ‘GATECHA_​SECRET_​KEY‘ soll­te dau­er­haft gesetzt sein und einen Neu­start über­le­ben. Fehlt der Schlüs­sel oder ändert er sich bei jedem Start, ver­liert der Dienst den zuge­hö­ri­gen Zustand. Das ist unge­fähr so prak­tisch wie ein digi­ta­les Tür­schloss, das nach jedem Strom­aus­fall ver­gisst, wel­che Schlüs­sel es kennt.

Zwei­tens: Läuft GateCHA hin­ter einem Rever­se Pro­xy – und das wird bei einem öffent­lich erreich­ba­ren Dienst meist der Fall sein –, muss der Dienst den Pro­xy kor­rekt berück­sich­ti­gen. Andern­falls sieht GateCHA womög­lich nur die IP-Adres­se des Rever­se Pro­xys. Sämt­li­che Besu­cher lan­den dann im sel­ben Rate-Limit-Topf.

Das schützt zuver­läs­sig gegen Spam. Aller­dings auch gegen ech­te Besu­cher. Der Daten­schutz Dude nennt das dann eine sehr kon­se­quen­te Verfügbarkeitsreduktion. 🙂

Die Domain muss wirk­lich exakt stimmen

Im Dash­board bekommt jede Web­site ihren eige­nen API-Key. Für die­sen Key wird außer­dem hin­ter­legt, wel­che Domain ihn ver­wen­den darf. Und hier ist „exakt“ nicht als freund­li­cher Vor­schlag gemeint. ‘eure​-domain​.de‘ und ‘www​.eure​-domain​.de‘ sind zwei ver­schie­de­ne Hosts. Wer per Wei­ter­lei­tung kon­se­quent auf ‘www‘ umstellt, beim GateCHA-Key aber nur die Domain ohne ‘www‘ ein­trägt, bekommt eine höf­li­che, aber ein­deu­ti­ge Ableh­nung. Dann heißt es bei­spiels­wei­se: ‘Domain not allowed‘.

Die Feh­ler­mel­dung stimmt. Die eige­ne ers­te Ver­mu­tung meis­tens nicht. Bevor man anfängt, Java­Script, DNS, TLS-Zer­ti­fi­ka­te oder die Mond­pha­sen zu über­prü­fen, hel­fen drei Fragen:

  • Unter wel­cher Domain wird das For­mu­lar tat­säch­lich im Brow­ser aufgerufen?
  • Gibt es eine Wei­ter­lei­tung zwi­schen ‘www‘ und der Domain ohne ‘www‘?
  • Ist genau die end­gül­ti­ge Ziel-Domain beim betref­fen­den API-Key hinterlegt?

Fragt mich, woher ich das weiß. 🙂

Das Gan­ze ist kein (aus­schließ­li­ches) WordPress-Feature

Vie­le Anlei­tun­gen zu ALTCHA enden unge­fähr dort, wo das Word­Press-Plug­in instal­liert wur­de. Das ist ver­ständ­lich. Word­Press ist weit ver­brei­tet, und fer­ti­ge Inte­gra­tio­nen sind ange­nehm, wenn es schnell gehen soll. Der inter­es­san­te Teil beginnt aber dahin­ter: Der Chall­enge-Ser­ver spricht HTTP. Er lie­fert eine Chall­enge aus und nimmt spä­ter eine gelös­te Ant­wort zur Prü­fung ent­ge­gen. Das kann nicht nur Word­Press. Das kann jedes Sys­tem, das HTTP-Anfra­gen ver­ar­bei­ten kann.

Für Word­Press gibt es pas­sen­de Plug­ins, die das Wid­get in For­mu­la­re, Kom­men­ta­re oder Log­in-Sei­ten ein­hän­gen. Wer eine sta­ti­sche HTML-Sei­te betreibt, bin­det das Front­end-Wid­get direkt ein. Wer ein eige­nes For­mu­lar in PHP, Node.js oder einer ande­ren Umge­bung hat, prüft die Ant­wort beim Abschi­cken auf der Ser­ver­sei­te. Damit wird aus einem CAPTCHA kei­ne Plug­in-Lösung für genau eine Web­site, son­dern eine klei­ne eige­ne Infrastruktur:

  • Zehn oder mehr Web­sites kön­nen den­sel­ben Chall­enge-Ser­ver nutzen.
  • Jede Web­site bekommt ihren eige­nen API-Key.
  • Jede Domain bleibt getrennt konfigurierbar.
  • Die Ver­wal­tung bleibt an einer Stelle.
  • Ein Wech­sel des CMS zwingt nicht dazu, den Spam-Schutz gleich mit auszutauschen.

Das ist der eigent­li­che Charme dar­an. Man baut nicht noch einen wei­te­ren Dienst in eine ein­zel­ne Web­site ein. Man betreibt einen über­schau­ba­ren Bau­stein, den ver­schie­de­ne eige­ne Pro­jek­te nut­zen können.

Daten­schutz­freund­lich heißt nicht: Augen zu und durch

Ein selbst gehos­te­tes ALTCHA mit GateCHA kann daten­schutz­recht­lich sehr viel ange­neh­mer sein als ein CAPTCHA, das schon beim Laden des For­mu­lars Daten an einen gro­ßen exter­nen Anbie­ter schickt. Das bedeu­tet insbesondere:

  • Kein exter­ner CAPTCHA-Dienst muss tech­nisch ein­ge­bun­den werden.
  • Es ent­ste­hen kei­ne zusätz­li­chen Daten­flüs­se zu die­sem frem­den Dienst.
  • Die Infra­struk­tur und Kon­fi­gu­ra­ti­on lie­gen in der eige­nen Kontrolle.
  • Log­da­ten, Spei­cher­dau­er und Zugriffs­rech­te kön­nen selbst bestimmt werden.
  • Daten­schutz­in­for­ma­tio­nen las­sen sich an die tat­säch­lich ein­ge­setz­te Tech­nik anpas­sen, statt einen frem­den Dienst mög­lichst tap­fer unter dem Stich­wort “Trans­pa­renz” zu erklären.

Aber: Selbst­ho­s­ting ist kein Daten­schutz-Zau­ber­wort. Wer GateCHA auf einem gemie­te­ten Ser­ver betreibt, soll­te den Hos­ting-Anbie­ter daten­schutz­recht­lich ein­ord­nen und gege­be­nen­falls einen Auf­trags­ver­ar­bei­tungs­ver­trag abschlie­ßen. Wer IP-Adres­sen oder Sicher­heits­er­eig­nis­se pro­to­kol­liert, soll­te fest­le­gen, wel­che Daten wofür gebraucht wer­den und wann sie wie­der gelöscht wer­den. Wer ein Dash­board betreibt, soll­te die­ses nicht mit dem Pass­wort ‘Sommer2026!‘ absi­chern, nur weil es doch „nur ein CAPTCHA“ ist.

Und natür­lich gilt auch hier: Updates ein­spie­len, Zer­ti­fi­ka­te sau­ber kon­fi­gu­rie­ren, Zugrif­fe beschrän­ken, Schlüs­sel getrennt ver­wal­ten und Ver­ant­wort­lich­kei­ten fest­le­gen. Ein klei­ner Dienst ist nicht auto­ma­tisch ein unwich­ti­ger Dienst. Gera­de öffent­li­che Schnitt­stel­len sind für Angrei­fer häu­fig inter­es­san­ter, als man beim ers­ten Kaf­fee des Tages vermutet.

Was am Ende übrig bleibt

Kein Con­sent-Ban­ner nur wegen eines CAPTCHA. Kei­ne zusätz­li­che Daten­schutz­er­klä­rung über die Daten­ver­ar­bei­tung eines exter­nen CAPTCHA-Diens­tes. Kei­ne monat­li­che Rech­nung, die mit den For­mu­lar­auf­ru­fen wächst. Kei­ne Abhän­gig­keit davon, dass ein Anbie­ter sei­ne Prei­se, Nut­zungs­be­din­gun­gen oder tech­ni­sche Ein­bin­dung mor­gen plötz­lich neu erfin­det. Und kein Captcha-Ser­vice gegen Bezah­lung mit den Daten der eige­nen Web­sei­ten­be­su­cher. Statt­des­sen gibt es einen klei­nen, eige­nen Dienst, der genau eine Auf­ga­be erfüllt: auto­ma­ti­sier­ten Miss­brauch von For­mu­la­ren erschwe­ren, Bots das digi­ta­le Leben schwermachen.

ALTCHA und GateCHA sind kei­ne Uni­ver­sal­lö­sung. Bei hohem Schutz­be­darf, kom­ple­xen Betrugs­mus­tern oder gro­ßem Angriffs­druck braucht es mög­li­cher­wei­se zusätz­li­che Maß­nah­men. Rate-Limi­ting auf Anwen­dungs­ebe­ne, WAF-Regeln, E‑Mail-Vali­die­rung, Miss­brauch­ser­ken­nung und gut abge­si­cher­te For­mu­la­re ver­schwin­den nicht, nur weil irgend­wo eine Pro­of-of-Work-Chall­enge läuft. Für den nor­ma­len Schutz von Kon­takt­for­mu­la­ren, Kom­men­ta­ren, Log­in-Berei­chen oder klei­ne­ren APIs ist der Ansatz aber aus­ge­spro­chen attrak­tiv. Weni­ger exter­ne Abhän­gig­kei­ten, weni­ger unnö­ti­ge Daten­flüs­se und eine Lösung, die sich für meh­re­re eige­ne Web­pro­jek­te wie­der­ver­wen­den lässt.

Man soll­te nur wis­sen, was man tut. Denn ein eige­ner Ser­ver ist kein Deko-Ele­ment. Er braucht Updates, Back­ups, kla­re Zustän­dig­kei­ten, Moni­to­ring und jeman­den, der im Zwei­fel nach­voll­zie­hen kann, war­um das Kon­takt­for­mu­lar gera­de alle Besu­cher für Bots hält. Ob die­se Per­son intern sitzt oder extern beauf­tragt ist, ist zweit­ran­gig. Haupt­sa­che, sie exis­tiert – und sie weiß, dass der Dienst da ist. Dann ist ein selbst gehos­te­tes CAPTCHA kei­ne wag­hal­si­ge Bas­tel­idee, son­dern eine sau­be­re, kon­trol­lier­ba­re und daten­schutz­freund­li­che Infrastrukturentscheidung.

Oder, um es mit dem Daten­schutz Dude zu sagen: “Weni­ger Con­sent-Thea­ter ist gut. Ein Ser­ver, den nie­mand betreut, ist nur das nächs­te Thea­ter­stück – dies­mal ohne Ein­tritts­kar­te und mit deut­lich schlech­te­ren Kritiken.”

PS: Der Anbie­ter hin­ter ALTCHA bie­tet auch gehos­te­te Bezahl­va­ri­an­ten an. Um die­se geht es expli­zit nicht.

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Über a.s.k. Daten­schutz e.K.
Nächs­te Termine
  • Keine Termine
Mit­glied­schaf­ten