Zum Inhalt

Apache & mod_mellon (SAML)

Primär geht es in diesem Artikel darum ein Verzeichnis auf einem Apache Webserver zu mit einer Authentifizierung mittels SAML zu schützen. Dazu richte ich mir eine kleine VM mit Centos bei Hetzner ein. Konfiguriere dort auch eine Domain, welche dann mit einem SSL-Zertifikat von LetsEncrypt gesichert wird. Die Authentifizerung an SAML über nimmt das Modul mod_mellon.

Auf der Seite des Saml IDP Provider verwende ich Keycloak.

1. Vorbereitung

Zu nächst loggen wir und bei Hetzner ein und erstellen uns dort eine VM, für erste Versuche reicht das Model CX11. Idealer Weise habt Ihr bei Hetzner ein SSH-KEY hinterlegt, welches ihr gleich mit einbinden könnt. Für den Rechnernamen, verwendet Ihr am besten den Hostteil des FQDN, also eurer Domain. Als OS verwende ich Centos 8.

Sobald Ihr den Server erstellt habt, sollte im Dashboard die IP des Servers stehen. Und das Login via SSH sollte auch schon funktionieren. Nun wechselt Ihr in den DNS-Bereich bei Hetzner. Und legt einen A-Record in eurer Domain für euren Host an. Das ganze sollte natürlich mit jedem anderen DNS-Anbieter auch gehen.

Nun solltet Ihr relativ schnell auch via FQDN auf euren Server zugreifen können.

2. Installation der nötigen Packages

Zu nächst müssen wir das EPEL Repository einbinden, in diesem befindet sich dann auch der Letsencrypt Client Certbot.

$ dnf install epel-release

Nachdem das erfolgreich war, können wir auch schon die nötigen Packages installieren

$ dnf install certbot python3-certbot-apache mod_ssl mod_auth_mellon

3. Anlegen eines vhosts

Die Installation der Packages sollte relativ schnell gegangen sein. Als nächstes müssen wir einen VirtualHost für unsere Domain anlegen. Wir wechseln dazu in das Verzeichnis /etc/httpd/conf.d

$ cd /etc/httpd/conf.d

und erstellen eine vhost-Datei mit dem Namen unserer Domain.

$ vi jira3_devops_schmid_de.conf

Und konfigurieren dort einen Virtual-Host welcher nicht SSL verwendet.

1
2
3
4
5
<VirtualHost jira3.devops-schmid.de:80>
ServerName jira3.devops-schmid.de
ServerAdmin info@it-schmid.com
DocumentRoot /var/www/html
</VirtualHost>

Im Verzeichnis /var/www/html legen wir uns eine einfache index.html Datei an.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TechBlog</title>
</head>
<body>
<h1>Willkommen</h1>
</body>
</html>

Als nächstes starten wir den WebServer neu.

$ systemctl restart httpd

3. Erstellen eines Letsencrypt Zertifikats

Nun sollte unser WebServer unter http://jira3.devops-schmid.de erreichbar sein. Jetzt erstellen wir uns ein Letsencrypt Zertifikat für unseren FQDN und konfigurieren den WebServer. Diese Aufgabe übernimmt für uns das Program certbot, welches wir am Anfang installiert haben.

$ certbot --apache

Rufen wir das Kommando auf, werden uns mehrer Fragen zu Terms,Registrierung und zum Zertifikat selbst gestellt. Als erstes wird nach der E-Mail Adresse gefragt. Unter dieser seit ihr bzw eure Domain bei Letsencrypt registriert. Da die Zertifikate nur eine gültigkeit von 3 Monaten haben, werden Ihr auf dieser Adresse auch über den Ablauf informiert. Natürlich kann das Zertifikat, dann auch erneuert werden. Die nächsten beiden Fragen müssen wir mit Y/Yes beantworten.

Als nächstes erkennt Certbot, dass wir ein oder mehrer VirtualHosts haben. Wir müssen hier nur die richtige Domain wählen. In meinem Fall gibt es nur eine Domain. Jetzt wird das Zertifikat erstellt und der WebServer konfiguriert. Am Ende werden uns noch Informationen zum Zertifikat und wie lang diese gültig ist angezeigt.

 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
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): info@it-schmid.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: yes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: jira3.devops-schmid.de
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for jira3.devops-schmid.de
Performing the following challenges:
http-01 challenge for jira3.devops-schmid.de
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/conf.d/jira3_devops_schmid_de-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/jira3_devops_schmid_de-le-ssl.conf
Redirecting vhost in /etc/httpd/conf.d/jira3_devops_schmid_de.conf to ssl vhost in /etc/httpd/conf.d/jira3_devops_schmid_de-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://jira3.devops-schmid.de
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Subscribe to the EFF mailing list (email: info@it-schmid.com).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/jira3.devops-schmid.de/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/jira3.devops-schmid.de/privkey.pem
   Your certificate will expire on 2021-07-14. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again with the "certonly" option. To non-interactively
   renew *all* of your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Jetzt sollte unsere Seite per https erreichbar sein. In /etc/httpd/conf.d/ wurde unser .conf so umkonfiguriert, dass http auf https umgeleitet wird. Und es wurde eine -le-ssl.conf erstellt, welche den vhost mit SSL beinhaltet.

4. Teil 1: mod_mellon einrichten und konfigurieren

Ziel des Artikels ist ja, auf dem WebServer einen geschützten Bereich einzurichten und diesen an einen SAML IDP anzubinden. In diesem Abschnitt kommen wir nun genau zu diesem.

Als erstes benötigen wir in /etc/httpd ein Verzeichnis in dem wir unsere SAML Daten, Zertifikate und IDP/SP Metadaten speichern. Dazu legen wird das Verzeichnis /etc/httpd/saml2 an und wechseln in dieses.

$ mkdir /etc/httpd/saml2
$ cd /etc/httpd/saml2

Mellon bringt ein Skript mit, mit welchem das erstellen der Daten relativ einfach funktioniert. Dazu setzen wir zu nächst ein paar EnvVariablen. Gleich in der ersten Zeile gibt es die Variable fqdn, diese muss natürlich an eure FQDN angepasst werden.

1
2
3
4
fqdn="jira3.devops-schmid.de"
mellon_endpoint_url="https://${fqdn}/mellon"
mellon_entity_id="${mellon_endpoint_url}/metadata"
file_prefix="$(echo "$mellon_entity_id" | sed 's/[^A-Za-z.]/_/g' | sed 's/__*/_/g')"

Als nächstes rufen wir das mit geliefert Skript auf:

$ /usr/libexec/mod_auth_mellon/mellon_create_metadata.sh $mellon_entity_id $mellon_endpoint_url
Das Skript erstellt und nun drei Dateien und leifert uns einige SAML spezifische URLs. Als nächstes passen wir unsere -le-ssl.conf im conf.d Verzeichnis an mellon an. Dazu öffnen wir als erstes die Datei und ergänzen die Datei umfolgende Zeilen

 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
<IfModule mod_ssl.c>
<VirtualHost jira3.devops-schmid.de:443>
ServerName jira3.devops-schmid.de
ServerAdmin info@it-schmid.com
DocumentRoot /var/www/html

SSLCertificateFile /etc/letsencrypt/live/jira3.devops-schmid.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/jira3.devops-schmid.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

<Location / >
    MellonEnable info
    MellonEndpointPath /mellon/
    MellonSPMetadataFile /etc/httpd/saml2/https_jira3.devops_schmid.de_mellon_metadata.xml
    MellonSPPrivateKeyFile /etc/httpd/saml2/https_jira3.devops_schmid.de_mellon_metadata.key
    MellonSPCertFile /etc/httpd/saml2/https_jira3.devops_schmid.de_mellon_metadata.cert
    MellonIdPMetadataFile /etc/httpd/saml2/idp_metadata.xml
</Location>

<Location /private >
    AuthType Mellon
    MellonEnable auth
    Require valid-user
</Location>

</VirtualHost>
</IfModule>

Nun legen wir noch ein Verzeichns /private in /var/www/html an. Bei diesem Verzeichnis handelt es sich um unseren geschützen Bereich.

$ mkdir /var/www/html/private

Und erstellen dort ebenfalls eine index.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TechBlog - Sicherheitsbereich</title>
</head>
<body>
<h1>Willkommenim Sicherheitsbereich</h1>
</body>
</html>

Im nächsten Schritt werden wir den Client in Keycloak anlegen.

Aktuell starten wir aber den Apache noch nicht neu, denn wir benötigen nachher noch Informationen aus Keycloak. Bevor wir aber den Client anlegen können brauchen wir noch das File _mellon_metadata.xml aus unserem Verzeichnis /etc/httpd/saml, auf unserem lokalem Rechner. Dazu kopieren wir das File am einfachsten mit scp rüber.

5. Client in Keycloak anlegen

Login Keycloak

Als erstes gehen wir auf unseren Keycloak und melden uns an der Admin Console

Keycloak Login

Auswahl REALM

Dann wählen wir unsere REALM aus

Keycloak REALM

Client anlegen

Wechsel in das Client Menü

Keycloak Client Menu

Und dort klicken wir rechts oben "create" an

Keycloak Client Menu

Jetzt importieren wir unser [fqdn]_mellon_metadata.xml File

Keycloak Client Menu

Nachdem Import sollte unser Form so aussehen, wir speichern das ganze

Keycloak Client Menu

Haben wir das ganze gespeichert sollte uns ein relativ großes Form angezeigt werden.

Keycloak Client Menu

Client konfiguration prüfen

Wichtig sind die Felder "Valid Redirect URL

Keycloak Client Menu

Zuletzt speichern wir das ganze nochmal und wechseln wieder auf unseren Server

Keycloak Client Menu

6. Teil 2: mod_mellon einrichten und konfigurieren

Zurück auf unserem Server, benötigen wir abschließend noch die Meta Informationen des IDP. Dazu rufen wir diese mittel curl ab und speichern diese in unserem /etc/httpd/saml2 Verzeichnis.

curl -k -o /etc/httpd/saml2/idp_metadata.xml <url zum saml idp / Keyclock>/auth/realms/<realm>/protocol/saml/descriptor

Nun können wir unseren WebServer neustarten

systemctl restart httpd

7. Abschließender Test

Jetzt können wir das Login testen. Dazu gehen wir mit einem beliebigen Browser auf https:///, der sollte uns jetzt unsere Seite anzeigen. Als nächsten wechseln wir auf die URL https:///private. Nun sollte uns der Server auf unseren Keycloak umleiten. Dort einmal eingeloggt, sollten wir nun wieder auf https:///private landen und unsere Seite im /private sollte nun angezeigt werden.