Wie kann ich eine LDAP-Benutzerauthentifizierung über SSL abwickeln?
Diese FAQ beschreibt welche Schritte notwendig sind um eine LDAP-Benutzerauthentifizierung über das sichere HTTPS Protokoll abzuwickeln. Voraussetzung dafür ist, dass Sie bereits als Portal-Manager eine LDAP-Benutzerverwaltung eingerichtet haben.
Allgemeines
Bei einer Benutzerauthentifizierung gegenüber den zentralen LDAP-Server der Universität Freiburg ist es sehr wichtig das die übermittelten Formulardaten nicht unverschlüsselt übertragen werden. Ein potentieller Angreifer könnte versuchen durch eine Man-in-the-middle attack sensitive Daten, wie beispielsweise den Benutzername und das Passwort abzufangen. Dieses kann durch abfangen der POST-Daten beim anmelden am Portal mit anschließender Auswertung der Variablen __ac_name und __ac_password erfolgen.
Die folgenden Abschnitte erklären wie Sie eine Authentifizierung über HTTPS absichern können. Um eine hohes Maß an Sicherheit zu gewährleisten, empfehlen wir Ihnen alle Anpassungen vorzunehmen.
Anmelde-Link konfigurieren
Zunächst sollten Sie den Link Anmelden unter der Navigation ändern, damit das Login-Formular bereits über HTTPS geladen wird. Gehen Sie dazu in das ZMI --> portal_membership --> Tab: Actions und ändern Sie den Eintrag mit der Id login wie im unteren Screenshot ab: | |
Bestätigen Sie diese Änderung in dem Sie am Ende der Seite auf die Schaltfläche Save klicken. Ab jetzt wird der Benutzer bereits beim klicken auf den Anmelde-Link auf das SSL gesicherte Formular weitergeleitet. Im nächsten Abschnitt wollen wir sicherstellen, dass der User nicht durch eine manuelle Änderung der URL in der Adressleiste des Browsers die gesicherte Verbindung vorzeitig verlässt. |
SSL für Login-Form erzwingen
Damit die zu übermittelnden POST-Daten des Anmelde-Formulars stets über HTTPS übertragen werden, muß das Controller Page Template login_form angepasst werden. Gehen Sie dazu in das ZMI --> portal_skins --> plone_login --> login_form und klicken Sie auf Customize. Ersetzen Sie etwa bei Zeile 67 den Ausdruck "python:context.absolute_url()+'/'+template.id" durch "context/getLoginAction".
<form tal:attributes="action context/getLoginAction"
method="post"
id="<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
metal:use-macro="here/main_template/macros/master"
i18n:domain="plone">
Anschließend legen Sie im ZMI --> portal_skins --> custom ein neues Python-Script (Add Scipt (Python)) mit der Id getLoginAction an. Das Skript sollte folgenden Inhalt enthalten (passen Sie jeweils den Platzhalter <portalname> in NEEDS_HTTP an Ihre Bedürfnisse an):
## Script (Python) "getLoginAction"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=return the action for logging in, taking into account https
portal_url = context.portal_url()
NEEDS_HTTPS = ['http://portal.uni-freiburg.de/<portalname>',
'http://<portalname>.uni-freiburg.de']
for url_start in NEEDS_HTTPS:
if portal_url.startswith(url_start):
portal_url = portal_url.replace('http://', 'https://')
return portal_url + '/login_form'
Nun werden alle POST-Daten beim Anmeldevorgang über HTTPS gesendet. Für den Benutzer ist dieser Vorgang völlig transparent, d.h. hat der User eine ungesicherte HTTP Verbindung so wird der Wechsel auf HTTPS in der Adressleiste des Browsers gar nicht sichtbar.
Optional: Absicherung des Login-Portlets
Der folgende Schritt ist nur notwendig falls Sie das Login-Portlet in Ihrem Portal verwenden. Analog zu der oberen Vorgehensweise muß das Page Template portlet_login angepasst werden. Gehen Sie dazu in das ZMI --> portal_skins --> plone_portlets --> portlet_login und klicken Sie auf Customize. Ersetzen Sie etwa in Zeile 36 "string:${portal_url}/login_form" durch "context/getLoginAction"
<dd class="portletItem odd">
<form action="login_form"
name="loginform"
method="post"
tal:attributes="action context/getLoginAction">
Nach abspeichern der Änderungen wird auch im Login-Portlet alle POST-Daten SSL verschlüsselt übertragen.