Mit der Version 4.1 von Univention Corporate Server integriert Univention einen Dienst in Univention Corporate Server, der Benutzern und Administratoren gleichermaßen das Leben erleichtert: die Univention Self-Service-Module. Sie erlauben es Benutzern selbständig (ohne Administratorunterstützung) ihre gespeicherten Passwörter zu verändern.

Bisher haben wir zwei Module umgesetzt: Passwort ändern und Passwort zurücksetzen. Bei „Passwort ändern“ handelt es sich um eine Webseite, auf der Benutzer ihr (abgelaufenes) Passwort ändern können, wenn sie sich noch an ihr bestehendes Passwort erinnern. Bei „Passwort zurücksetzen“ können Benutzer, die ihr Passwort vergessen haben, auf einer Webseite veranlassen, dass ihnen ein Schlüssel (Token) an eine zuvor hinterlegte Adresse geschickt wird. Beide Module sind einfach über die Übersichtsseite des UCS Servers erreichbar.

Die Univention Self-Service-Module können über das App Center auf Servern in den Rollen „Domänencontroller Master“ und „Domänencontroller Backup“ installiert werden. Nach der Installation können die Module einzeln aktiviert oder deaktiviert werden. Um z. B. das Modul „Passwort zurücksetzen“ zu deaktivieren, wird an der Kommandozeile Folgendes ausgeführt:
univention-self-service-modules disable passwordreset

Wie gewohnt, gibt die Option „–help“ eine Auskunft über weitere Optionen.

App-Hersteller können Self-Service für ihre Applikationen anbieten

Für Hersteller von Apps interessant: Wenn sich ein Benutzer mit einem abgelaufenen Passwort an ihrer App anmeldet, kann die App diesem einen Link zu einer entsprechenden Webseite anbieten, um sein Passwort zu erneuern. Dieser Link ist als Univention Configuration Registry (UCR) Variable gespeichert:
ucs/web/overview/entries/service/passwordchange/link
bzw., um Deutsch als Sprache voreinzustellen:
ucs/web/overview/entries/service/passwordchange/link/de

Kontakt sollte hinterlegt werden

Administratoren, die das Modul „Passwort zurücksetzen“ einsetzen möchten, sollten ihre Benutzer darauf hinweisen, dass sie ihre Kontaktdaten auf der Webseite hinterlegen, da sie für ein eventuelles Zurücksetzen ihres Passworts ihr aktuelles Passwort benötigen. Benutzer ohne abgespeicherten Kontakt können den Dienst später nicht verwenden, wenn sie ihr Passwort vergessen. Die Daten können vom Administrator im Benutzer-Modul der Univention Management Console im Tab „Passwort-Wiederherstellung“ eingesehen werden.

Konfigurationen für Zurücksetzen der Passwörter

UCS - Passwort Reset RequestWährend für den einfachen Passwortwechsel (Modul „passwordchange“) nichts eingestellt werden muss, ist das Modul um Passwörter zurückzusetzen („passwordreset“) so gestaltet worden, dass es für möglichst viele verschiedene Umgebungen angepasst werden kann. So können Berechtigungen, Länge der Schlüssel (Token) und die Art ihres Versands eingestellt werden. Im Auslieferungszustand von UCS ist nur der Versand des Tokens via E-Mail aktiviert.

Um alle relevanten UCR-Variablen zu sehen, suchen sie nach „self-service“:
ucr search --brief self-service
Die Option --brief bewirkt eine kompaktere Darstellung, da die Beschreibungen der Variablen nicht mit ausgedruckt werden.

Berechtigungen vergeben

Die UCR-Variablen umc/self-service/passwordreset/blacklist/* und umc/self-service/passwordreset/whitelist/* können verwendet werden, um Benutzern und Gruppen den Zugriff auf den Dienst zu erlauben. In der Standardeinstellung ist es allen Benutzern, die in der Gruppe „Domain Users“, nicht aber in den Gruppen „Administrators“ oder „Domain Admins“ sind, erlaubt, den Dienst zu nutzen.
ucr search umc/self-service/passwordreset/.*list

Schlüssellängen einstellen

Die Länge des zu versendenden Schlüssels (Token) kann pro Versandmethode eingestellt werden. In eine SMS passen nicht nur weniger Zeichen als in eine E-Mail, der Token muss vermutlich auch abgetippt werden. Ein langer Token in einer E-Mail kann von Benutzern kopiert oder ein Link angeklick werden. Ein Token ist immer nur eine Stunde lang gültig und verfällt dann automatisch. Die Standardlängen der Token sind in den Beschreibungen der UCR-Variablen zu finden:
ucr search umc/self-service/passwordreset/.*/token_length

Drei Versandmethoden für Token

Der Versand der Token kann mit verschiedenen Methoden erfolgen. In der Standardeinstellung ist nur „E-Mail“ aktiviert.
ucr search umc/self-service/passwordreset/.*/enabled

Die Konfiguration, die für den Versand per E-Mail, SMS oder beliebige andere Methoden benötigt wird, erkläre ich im folgenden Abschnitt:

Versand des Tokens per E-Mail

Für den Versand per E-Mail muss ein Mail-Server konfiguriert werden. Dessen Name oder IP-Adresse wird in der UCR-Variablen umc/self-service/passwordreset/email/server gespeichert. Der Mail-Server muss die E-Mails ohne Passwort annehmen und weiterleiten können. Standardmäßig geht das nur auf „localhost“. Das Mailsystem muss ausgehende E-Mails direkt oder über ein Mail-Relay zustellen. Nähere Hinweise zur Konfiguration eines Mail-Relays finden sich im Kapitel 13.8.1 des UCS-Handbuchs.

Die zu versendende Nachricht wird aus einer Textdatei erzeugt. Mit der UCR-Variablen
umc/self-service/passwordreset/email/text_file kann bestimmt werden, welche dafür verwendet wird. Um den Text anzupassen, sollte die Datei mit dem Standardtext von /usr/share/pyshared/univention/management/console/modules/passwordreset/sending/email_body.txt irgendwohin kopiert und editiert werden. Der Pfad zur neuen Datei wird dann in der UCR-Variablen gesetzt.
Vor dem Versand werden folgende Zeichenketten in dem Text ersetzt:

*{username}: Der Benutzer, der sein Passwort zurücksetzen möchte.
*{token}: Zu versendender Token.
*{link}: Link zur „Passwort Zurücksetzen“-Webseite.
*{tokenlink}: Link zur „Passwort Zurücksetzen“-Webseite mit Benutzername und Token vorausgefüllt.

UCS - Passwort Reset Request

Versand des Token via SMS

Leider gibt es keinen Standard für SMS-Gateways im Internet. Das Self-Service-Modul wurde deshalb so gestaltet, dass die Einbindung externer Programme möglichst einfach ist. Zu diesem Zweck können folgende UCR-Variablen konfiguriert werden:
ucr search umc/self-service/passwordreset/sms

* umc/self-service/passwordreset/sms/command: Das Programm, das zum Versand einer SMS vom Self-Service-Modul aufgerufen wird, z. B. /usr/local/sbin/send_sms. Alle benötigten Daten werden in Umgebungsvariablen übergeben.
* umc/self-service/passwordreset/sms/country_code: Nationale Vorwahl, die möglicherweise einer Handynummer vorangestellt werden muss, z. B. „49“. Wenn Ihre SMS-Software dies nicht benötigt, geben Sie trotzdem eine Zahl an.
* umc/self-service/passwordreset/sms/password_file: Eine Textdatei mit Namen und Passwort für den von Ihnen verwendeten SMS-Dienst, z. B. /etc/sip-password.txt. Die Datei sollte genau eine Zeile beinhalten: Username:Passwort. Wenn Ihre SMS-Software dies nicht benötigt, erstellen Sie bitte trotzdem solch eine Datei.

Dem aufgerufenen Progamm werden Daten in den folgenden Umgebungsvariablen übergeben:
* selfservice_username: Der Benutzer, der sein Passwort zurücksetzen möchte.
* selfservice_address: Handynummer des Benutzers.
* selfservice_token: Zu versendender Token.
* sms_country_code: Inhalt von umc/self-service/passwordreset/sms/country_code.
* sms_username: Das, was in umc/self-service/passwordreset/sms/password_file vor dem Doppelpunkt steht.
* sms_password: Das, was in umc/self-service/passwordreset/sms/password_file nach dem Doppelpunkt steht.

Werden vom angegebenen Programm weitere Programme gestartet, sollten sicherheitshalber die Umgebungsvariablen mit Passwort und Token gelöscht werden, da Umgebungsvariablen an Kindprozesse vererbt werden.

Ich würde mich freuen, wenn Sie Probleme und Tipps zur Implementierung als Kommentare hier im Blog hinterlassen oder mit uns von Univention und anderen UCS Nutzern in unserem Forum diskutieren.

Selbstdefinierter Versandprozess

Es werden auch andere Versandmethoden als E-Mail und SMS unterstützt. Genau wie beim SMS-Versand wird ein Programm zum Versand gestartet. Zur Konfiguration stehen folgende UCR-Variablen zur Verfügung:
ucr search umc/self-service/passwordreset/external

* umc/self-service/passwordreset/external/command: Das zum Versand aufzurufende Programm – wie bei SMS, z. B. „/usr/local/sbin/send_with_jabber“.
* umc/self-service/passwordreset/external/method: Bezeichnung, die intern zur Unterscheidung der Module verwendet wird, z. B. „xmpp“. Darf nicht „email“ oder „mobile“ heißen.
* umc/self-service/passwordreset/external/method_label: Die Bezeichnung der Methode, wie sie auf der Webseite angezeigt wird, z. B. „Jabber“.
* umc/self-service/passwordreset/external/udm_property: Name des Attributes des Benutzermoduls aus dem der Kontakt ausgelesen werden soll, z. B. „description“.

Das E-Mail-Modul verwendet PasswordRecoveryEmail, das SMS-Modul PasswordRecoveryMobile. Um alle bekannten Attribute gelistet zu bekommen, kann folgendes Programm ausgeführt werden:
udm users/user

Dem aufgerufenen Progamm werden wie beim SMS-Modul Daten in den folgenden Umgebungsvariablen übergeben:
* selfservice_username: Der Benutzer, der sein Passwort zurücksetzen möchte.
* selfservice_address: Handynummer des Benutzers.
* selfservice_token: Zu versendender Token.

Der Sicherheitshinweis bzgl. des Vererbens von Umgebungsvariablen gilt auch hier.

Feedback Wanted!

Ich hoffe, dass ich Ihnen mit diesem Artikel einige nützliche Hinweise zu dem Einsatz der neuen Self-Service-Module geben konnte. Wir UCS Entwickler sind überzeugt, dass wir den Einsatz und die Administration von UCS Domänen mit den Self-Service-Modulen weiter vereinfachen konnten. Gerne würden wir von Ihren Erfahrungen, die Sie damit machen, hören und erfahren, in welcher Form Sie die Services einsetzen und natürlich auch, wie Ihre Benutzer sie annehmen.

UCS Core Edition jetzt kostenfrei einsetzen!

Zum Downloadbereich

Daniel Tröder ist Open Source Software Engineer und kümmert sich zur Zeit besonders intensiv um die Weiterentwicklung des Mail-Stacks von UCS.

Was ist Ihre Meinung? Hinterlassen Sie einen Kommentar!

Kommentare

  1. Hier ist ein Beispielprogramm zum Versand von SMS mit dem VoIP-Anbieter Sipgate:

    # ucr set \
    umc/self-service/passwordreset/sms/command=/usr/local/sbin/sipgate_sms.py \
    umc/self-service/passwordreset/sms/country_code=49 \
    umc/self-service/passwordreset/sms/enabled=yes \
    umc/self-service/passwordreset/sms/password_file=/etc/sipgate.pw
    # echo „myaccount:s3cr3t“ > /etc/sipgate.pw
    # chmod 600 /etc/sipgate.pw

    ————— /usr/local/sbin/sipgate_sms.py —————

    #!/usr/bin/python2.7
    # -*- coding: utf-8 -*-

    import os
    import sys
    import xmlrpclib

    env = os.environ

    # create XMLRPC proxy
    xmlrpc_url = „https://{username}:{password}@samurai.sipgate.net/RPC2“.format(username=env[„sms_username“], password=env[„sms_password“])
    rpc_srv = xmlrpclib.ServerProxy(xmlrpc_url)

    # identify myself
    reply = rpc_srv.samurai.ClientIdentify({
    „ClientName“: „Univention Self Service (python xmlrpclib)“,
    „ClientVersion“: „1.0“,
    „ClientVendor“: „https://www.univention.com/“
    })
    print „Login success. Server reply to ClientIdentify(): ‚{}‘.“.format(reply)

    # create text message
    msg = „Password reset token: {token}“.format(token=env[„selfservice_token“])
    if len(msg) > 160:
    raise ValueError(„Message to long: ‚{}‘.“.format(msg))

    # Sipgate wants phone numbers in E.164 format
    num = „“.join(map(lambda x: x if x.isdigit() else „“, env[„selfservice_address“]))
    if num.startswith(„00“):
    num = num[2:]
    elif num.startswith(„0“):
    num = „{}{}“.format(env[„sms_country_code“], num[1:])
    else:
    pass

    # send message
    args = {„RemoteUri“: „sip:%s@sipgate.net“ % num, „TOS“: „text“, „Content“: msg}
    reply = rpc_srv.samurai.SessionInitiate(args)

    if reply.get(„StatusCode“) == 200:
    print „Success sending token to user {}.“.format(env[„selfservice_username“])
    sys.exit(0)
    else:
    print „Error sending token to user {}. Sipgate returned: {}“.format(env[„selfservice_username“], reply)
    sys.exit(1)

  2. Hier ein Beispielprogramm zum Versand von Jabber-Nachrichten mit der „external“ Methode. Es wird das Benutzerattribut „description“ („Beschreibung“) als Adresse ausgelesen:

    # ucr set repository/online/unmaintained=“yes“
    # univention-install sendxmpp
    # ucr set repository/online/unmaintained=“no“

    # cat > /usr/local/sbin/send_jabber < /etc/send_jabber.cfg
    # chmod 0600 /etc/send_jabber.cfg

    # ucr set \
    umc/self-service/passwordreset/external/enabled=’yes‘ \
    umc/self-service/passwordreset/external/command=“/usr/local/sbin/send_jabber“ \
    umc/self-service/passwordreset/external/method=xmpp \
    umc/self-service/passwordreset/external/method_label=Jabber \
    umc/self-service/passwordreset/external/token_length=12 \
    umc/self-service/passwordreset/external/udm_property=description

    ———————————–

    # eval „$(ucr shell)“
    # udm users/user modify –dn „uid=user1,cn=users,$ldap_base“ \
    –set description=“user1@jabber.org“

    ———————————–

    Nun sollte bei einem Benutzer „user1“ die Methode „Jabber“ (../external/method_label) auf der Webseite zur Passwortwiederherstellung auftauchen. Wird diese gewählt, wird „/usr/local/sbin/send_jabber“ (…/external/command) ausgeführt. Dem Skript wird „user1@jabber.org“ als Adressat aus dem Feld „Beschreibung“ des Benutzers (…/external/udm_property) übergeben.

  3. Hallo,
    ich habe mir das heute mal spasseshalber angesehen, leider kriege ich nur einen recht nichtssagenden Fehler:

    [26/Nov/2015:10:59:14] Authentication on UMC at pdc1.ou1.hs42.it failed: {u’status‘: 401, u’message‘: u’Authentisierung ist fehlgeschlagen. Bitte melden Sie sich erneut an.‘}
    [26/Nov/2015:10:59:14] HTTP Traceback (most recent call last):
    File „/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py“, line 664, in respond
    inst.set_response()
    File „/usr/lib/python2.7/dist-packages/cherrypy/_cperror.py“, line 376, in set_response
    message=self._message), ‚utf-8‘)
    File „/usr/lib/python2.7/dist-packages/cherrypy/_cperror.py“, line 382, in get_error_page
    return get_error_page(*args, **kwargs)
    File „/usr/lib/python2.7/dist-packages/cherrypy/_cperror.py“, line 462, in get_error_page
    kwargs[k] = _escape(kwargs[k])
    File „/usr/lib/python2.7/cgi.py“, line 1035, in escape
    s = s.replace(„&“, „&“) # Must be done first!
    AttributeError: ‚dict‘ object has no attribute ‚replace‘

    • Hallo Alexander,
      bei welcher Aktion und auf welcher Seite ist das passiert?
      Wird das im Browser angezeigt oder in einem logfile?
      Stimmte das Passwort tatsächlich nicht, oder passiert das auch mit korrektem username/password?
      Gruß
      Daniel

  4. Es hat ein großes Update des Password Self Service Moduls gegeben:
    * Die Absendeadresse von Token-Emails ist nun über die UCR Variable umc/self-service/passwordreset/email/sender_address einstellbar.
    * Der Name des Servers der in Links in Token-Emails verwendet wird kann über die UCR Variable umc/self-service/passwordreset/email/webserver_address eingestellt werden.
    * Benutzer/innen können sich, zusätzlich zum Username, mit ihrer primären Email-Adresse anmelden.
    * Um Denial of Service Angriffe oder Unkosten durch massenhaften SMS-Versandt abzuwehren, können die UCR Variablen umc/self-service/passwordreset/limit/.* angepasst werden. /usr/lib/univention-self-service/univention-self-service-request-count gibt Auskunft über erreichte Beschränkungen.

  5. Moin.
    Wir haben einen Kunden mit einer recht guten Passwortpolicy. Wenn nun ein Benutzer über das Passwortreset ein nicht richtlinienkonformes Passwort setzen möchte erscheint folgende Fehlermeldung auf der Seite:

    Die Ausführung des Kommandos passwordreset/set_password ist fehlgeschlagen: Traceback (most recent call last): File „/usr/lib/pymodules/python2.7/univention/management/console/base.py“, line 283, in execute function(self, request) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/passwordreset/__init__.py“, line 138, in _decorated return func(self, *args, **kwargs) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/decorators.py“, line 190, in _response return function(self, request) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/decorators.py“, line 318, in _response result = _multi_response(self, request) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/decorators.py“, line 462, in _response return list(function(self, iterator, *nones)) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/decorators.py“, line 284, in _fake_func yield function(self, *args) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/passwordreset/__init__.py“, line 355, in set_password ret = self.udm_set_password(username, password) File „/usr/lib/pymodules/python2.7/univention/management/console/modules/passwordreset/__init__.py“, line 439, in udm_set_password user.modify() File „/usr/lib/pymodules/python2.7/univention/admin/handlers/users/user.py“, line 1565, in modify return super(object, self).modify(*args, **kwargs) File „/usr/lib/pymodules/python2.7/univention/admin/handlers/__init__.py“, line 364, in modify return self._modify(modify_childs,ignore_license=ignore_license) File „/usr/lib/pymodules/python2.7/univention/admin/handlers/__init__.py“, line 839, in _modify ml=self._ldap_modlist() File „/usr/lib/pymodules/python2.7/univention/admin/handlers/users/user.py“, line 2103, in _ldap_modlist raise univention.admin.uexceptions.pwQuality, str(e).replace(‚W?rterbucheintrag‘,’Wörterbucheintrag‘).replace(‚enth?lt‘, ‚enthält‘) pwQuality: is too simple

    Viele Grüße,
    Daniel Rauer (bytemine GmbH)

  6. Hier ist ein Beispielprogramm zum Versand von SMS mit einem Email-to-SMS-Gateway. Falls das Gateway ein Login benötigt sollte „smtp_user:smtp_password“ sinnvoll sein und die Zeile „server.login(env[’sms_username‘], env[’sms_password‘])“ einkommentiert werden.

    # ucr set \
    umc/self-service/passwordreset/sms/command=/usr/local/sbin/email_to_sms.py \
    umc/self-service/passwordreset/sms/country_code=49 \
    umc/self-service/passwordreset/sms/enabled=yes \
    umc/self-service/passwordreset/sms/password_file=/etc/email_to_sms.pw
    # echo „smtp_user:smtp_password“ > /etc/email_to_sms.pw
    # chmod 0600 /etc/email_to_sms.pw

    ————— /usr/local/sbin/email_to_sms.py —————
    #!/usr/bin/python2.7
    # -*- coding: utf-8 -*-

    import os
    import socket
    import smtplib

    MAIL_SERVER_HOST = ‚my.sms.gateway‘
    MAIL_SERVER_PORT = ’25‘

    env = os.environ
    body = ‚Password reset token: {token}‘.format(token=env[’selfservice_token‘])
    if len(body) > 160:
    raise ValueError(‚Message to long: „{}“.‘.format(body))
    # remove all characters except numbers
    num = “.join(map(lambda x: x if x.isdigit() else “, env[’selfservice_address‘]))
    from_addr = ’self-service@{}‘.format(socket.getfqdn())
    to_addr = ’sms{}@{}‘.format(num, MAIL_SERVER_HOST)
    msg = ‚From: {}\r\nTo: {}\r\n\r\n{}‘.format(from_addr, to_addr, body)
    server = smtplib.SMTP(MAIL_SERVER_HOST)
    server.set_debuglevel(1)
    # Falls der SMTP-Server ein Login benötigt:
    # server.login(env[’sms_username‘], env[’sms_password‘])
    server.sendmail(from_addr, to_addr, msg)
    server.quit()

  7. In UCS 4.2 wird es das Skript „univention-self-service-modules“ nicht mehr geben. Das Modul zum Ändern des eigenen Passworts (wenn das alte noch bekannt ist), wird in die UMC integriert. Da es dann z.Z. nur noch ein Modul gibt (password-reset), gibt es vorläufig keinen Bedarf für das Skript.
    Wenn ein neues Modul dazu kommt, wird es eine Ankündigung für den neuen Mechanismus geben.

  8. Hallo Herr Tröder,
    habe fast erfolgreich auf Version ist 4.4-2 errata330 aktualisiert.

    Die Fehlermeldung von Self-service u.a. hatte mich gestört.
    Habe jetzt den E-Mail Dienst auf true gesetzt.( umc/self-service/profiledata/enabled true).
    Im Benutzer xy eine e-Mail adresse eingetragen und bei selfservice benutzer xy passwort vergessen funktioniert schon mal der E-Mail versand und das zurücksetzen.

    Frage:
    Ist es mit Version 4.4 möglich mit Email-to-SMS-Gateway (bin bei IONOS -> 1und1) zu arbeiten?

    Danke für die Antwort im Voraus.

    Gruss Angelo

    Hier noch mal die ERROR Meldungen:
    Module: self-service-acl
    ERROR: Object not found in UDM.

    ERROR: Object not found in UDM.
    Not updating umc/self-service/profiledata/enabled
    Not updating self-service/ldap_attributes
    Calling joinscript 35univention-self-service-master.inst …
    2019-11-12 10:20:53.762539788+01:00 (in joinscript_init)
    No such object (32)
    Matched DN: cn=ldapacl,cn=univention,dc=win,dc=abcona,dc=info
    Setting self-service/ldap_attributes
    Module: kopano-cfg
    Module: self-service-acl
    ERROR: Object not found in UDM.

  9. Hallo Herr Malaguarnera,

    Zum SMS-Gateway: Ich kenne das so, dass der Self-Service eine E-Mail an das Gateway schickt, welches dann den Inhalt an eine der E-Mail-Adresse zugeordneten Mobilnummer per SMS weiterschickt. Das haben Kunden so im Einsatz, ist also grundsätzlich möglich. Das konkrete Tool bei IONOS kennen ich leider nicht genauer.

    Was die Fehlermeldung beim Joinskript angeht: Das verlagern wir besser ins Forum – da sind die Möglichkeiten das zu analysieren deutlich besser (Formatting, Rückfragen, mehr Leute die sich das anschauen und ggf. auch von einer Lösung profitieren) -> https://help.univention.com

  10. Angelo Malaguarnera

    OK und Danke.
    Dachte, das es eine 6 stellige PIN gibt, die ich da eintragen muss und dann erst ein neues Paswort einstellen kann.

    Sodass diese generierte SMS mit der PIN nicht über eine Sim Karte gesendet wird, sondern dieser Text via E-Mail 1234(telefonnummer)@firma.de an meinen Provider gesendet und diese auf SMS weitergeleitet wird.

    Per E-Mail klappt das ja schon mal 🙂

    Gruss
    Angelo

  11. Wer das Sipgate SMS Skript mit „richtigen“ Anführungsstrichen braucht, oder Ansible nutzt kann sich gerne am ADFC-Ansible Repo bedienen:

    https://github.com/ADFC-Hamburg/adfc-ansible/pull/82/files#diff-bca56f823bf502711f767b0d6e4aa0db

  12. Vielen Dank!

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