Tutorial

Installieren und Konfigurieren von SimpleSAMLphp zur SAML-Authentifizierung unter Ubuntu 18.04

PHPSecurityOpen SourceUbuntu 18.04

Einführung

SimpleSAMLphp ist eine Open-Source-basierte PHP-Authentifizierungsanwendung, die Unterstützung für SAML 2.0 als Dienstanbieter (SP) oder Identitätsanbieter (IdP) bietet.

SAML (Security Assertion Markup Language) ist ein sicheres, XML-basiertes Kommunikationsverfahren zum Austausch von Authentifizierungs- und Autorisierungsdaten zwischen Organisationen und Anwendungen. Häufig wird es zur Implementierung von Web SSO (Single Sign On) verwendet. Dadurch wird vermieden, dass Sie für unterschiedliche Organisationen verschiedene Anmeldeinformationen für Authentifizierung verwalten müssen. Einfach ausgedrückt: Sie können für Zugriff auf verschiedene Anwendungen eine Identität verwenden, z. B. einen Benutzernamen und ein Passwort.

Eine Instanz von SimpleSAMLphp verbindet sich mit einer Authentifizierungsquelle, nämlich einem Identitätsanbieter wie LDAP oder einer Benutzerdatenbank. Sie authentifiziert Benutzer bei dieser Authentifizierungsquelle, bevor sie Zugriff auf Ressourcen gewährt, die bei verknüpften Dienstanbietern verfügbar sind.

In diesem Tutorial installieren Sie SimpleSAMLphp und konfigurieren es für die Verwendung einer MySQL-Datenbank als Authentifizierungsquelle. Sie werden in der MySQL-Datenbank Benutzer und verschlüsselte Passwörter speichern und testen, ob Sie diese Benutzer zur Anmeldung verwenden können.

Voraussetzungen

Schritt 1 — Herunterladen und Installieren von SimpleSAMLphp

Die Installation von SimpleSAMLphp umfasst einige Schritte. Wir müssen die Software selbst sowie einige zusätzliche Komponenten und Voraussetzungen herunterladen. Außerdem müssen wir einige Änderungen an unserer virtuellen Host-Konfiguration vornehmen.

Melden Sie sich bei Ihrem Server an, wenn Sie es noch nicht getan haben.

Laden Sie SimpleSAMLphp von der Website des Projekts herunter. SimpleSAMLphp verbindet immer die letzte stabile Version seiner Software mit derselben URL. Das bedeutet, dass wir die neueste Version erhalten, indem wir Folgendes eingeben:

  • wget https://simplesamlphp.org/download?latest

Dadurch wird eine komprimierte Datei namens download?latest heruntergeladen, die SimpleSAMLphp enthält. Extrahieren Sie den Inhalt mit dem Befehl tar:

  • tar zxf download?latest

Die Dateien werden in einem neuen Verzeichnis namens simplesamlphp-1.x.y extrahiert, wobei x.y die aktuelle Versionsnummer ist. Verwenden Sie den Befehl ls, um die Datei zu identifizieren:

  • ls

Der Dateiname wird angezeigt:

Ouptut
simplesamlphp-1.18.5

Kopieren Sie nun mit dem Befehl cp den Inhalt des Verzeichnisses /var/simplesamlphp. Stellen Sie sicher, dass Sie die Versionsnummer durch die Version ersetzen, die Sie verwenden:

  • sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

Der Wechsel -a sorgt dafür, dass zusammen mit den Dateien und Ordnern auch die Dateiberechtigungen kopiert werden. Der Punkt am Ende der Quelldatei stellt sicher, dass alles im Quellverzeichnis in das Zielverzeichnis kopiert wird (einschließlich versteckter Dateien).

Anmerkung: Wenn Sie die Dateien an einem anderen Ort installieren wollen, müssen Sie mehrere Dateien aktualisieren. Konsultieren Sie die offizielle Installationsdokumentation von SimpleSAMLphp, um Details zu erhalten.

Es gibt einige zusätzliche Softwarepakete, die SimpleSAMLphp benötigt, einschließlich PHP-Erweiterungen für die Arbeit mit XML, Mehrbyte-Zeichenfolgen, curl und LDAP. Außerdem wird memcached benötigt. Installieren Sie diese Pakete mit Ihrem Paketmanager.

Aktualisieren Sie zunächst Ihre Paketliste:

  • sudo apt update

Installieren Sie anschließend die Pakete:

  • sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

Starten Sie Apache nach Abschluss der Installation neu, um die neuen PHP-Erweiterungen zu aktivieren:

  • sudo systemctl restart apache2

Nachdem SimpleSAMLphp nun installiert ist, konfigurieren wir Apache, um die Dateien bereitzustellen.

Schritt 2 — Konfigurieren von Apache zum Bereitstellen von SimpleSAMLphp

Sie haben bereits eine Domäne konfiguriert und auf diesen Server verwiesen sowie einen virtuellen Host so eingerichtet, dass er HTTPS nutzt, indem Sie Apache mit Let’s Encrypt schützen. Verwenden wir das, um SimpleSAMLphp bereitzustellen.

Das einzige SimpleSAMLphp-Verzeichnis, das für das Web sichtbar sein muss, ist /var/simplesamlphp/www. Um es für das Web verfügbar zu machen, bearbeiten Sie die Virtual Host SSL Apache-Konfigurationsdatei für Ihre Domäne.

Wenn Ihre virtuelle Host-Konfigurationsdatei your_domain.conf heißt, hat Let’s Encrypt eine neue Konfigurationsdatei namens your_domain-le-ssl.conf erstellt, die HTTPS-Anfragen für Ihre Domäne behandelt. Öffnen Sie mit dem folgenden Befehl die SSL-Konfigurationsdatei, um sie zu bearbeiten. Stellen Sie sicher, dass Sie your_domain durch den tatsächlichen Namen der Datei ersetzen:

  • sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf

Die Datei sollte ungefähr wie folgt aussehen, auch wenn die tatsächliche Datei möglicherweise mehr deskriptive Kommentare aufweist:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName your_domain

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Die Direktive ServerName legt die Basisdomäne fest, die mit dieser Definition des virtuellen Hosts übereinstimmen sollte. Das sollte der Domänenamen sein, für den Sie im Abschnitt Voraussetzungen ein SSL-Zertifikat eingerichtet haben. Fügen Sie nun eine Alias-Direktive hinzu, die SimpleSAMLphp die Kontrolle über alle URLs verschafft, die mit https://your_domain/simplesaml/* übereinstimmen. Fügen Sie dazu der Konfigurationsdatei die folgende Zeile hinzu:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
...
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  Alias /simplesaml /var/simplesamlphp/www

...

Das bedeutet, dass alle URLs, die mit domain_name/simplesaml/* übereinstimmen, zum Verzeichnis var/simplesamlphp/www umgeleitet werden; dadurch erhält SimpleSAMLphp die Kontrolle.

Als Nächstes gewähren wir Zugriff auf das Verzeichnis /var/simplesamlphp/www, indem wir eine Zugriffskontrolle vom Typ Require all granted dafür angeben. Dadurch wird der SimpleSAMLphp-Dienst über das Web zugänglich gemacht. Fügen Sie dazu der Konfigurationsdatei Folgendes hinzu:

your_domain-le-ssl.conf’>/etc/apache2/sites-available/your_domain-le-ssl.conf
...
  Alias /simplesaml /var/simplesamlphp/www
  <Directory /var/simplesamlphp/www/>
      Require all granted
  </Directory>
...

Speichern und schließen Sie die Datei. Starten Sie Apache neu, damit die Änderungen wirksam werden:

  • sudo systemctl restart apache2

Nachdem Apache nun so konfiguriert ist, dass die Anwendungsdateien bereitgestellt werden, konfigurieren wir SimpleSAMLphp.

Schritt 3 — Konfigurieren von SimpleSAMLphp

Als Nächstes müssen wir verschiedene Änderungen an der grundlegenden SimpleSAMLphp-Konfigurationsdatei vornehmen, die wir unter /var/simplesamlphp/config/config.php finden. Öffnen Sie die Datei in Ihrem Editor:

  • nano /var/simplesamlphp/config/config.php

Legen Sie das Administratorpasswort fest, indem Sie nach der Zeile 'auth.adminpassword' suchen und den Standardwert 123 durch ein sichereres Passwort ersetzen. Mit diesem Passwort können Sie auf einige der Seiten in Ihrer SimpleSAMLphp-Installations-Weboberfläche zugreifen:

/var/simplesamlphp/config/config.php
. . .
'auth.adminpassword'        => 'your_admin_password',
. . .

Legen Sie als Nächstes ein geheimes Salt fest, das aus einer zufällig erzeugten Zeichenfolge bestehen sollte. Einige Teile von SimpleSAMLphp verwenden dieses Salt, um kryptographisch sichere Hashes zu erstellen. Sie erhalten Fehler, wenn das Salt vom Standardwert nicht geändert wird.

Sie können die OpenSSL-Funktion rand verwenden, um eine zufällige Zeichenfolge zu generieren, die als Ihre geheime Salt-Zeichenfolge dient. Öffnen Sie ein neues Terminal, verbinden Sie sich erneut mit Ihrem Server und führen Sie den folgenden Befehl aus, um diese Zeichenfolge zu generieren:

  • openssl rand -base64 32

Die Option -base64 32 sorgt für eine Base64-codierte Zeichenfolge, die 32 Zeichen lang ist.

Suchen Sie dann in der Konfigurationsdatei den Eintrag 'secretsalt' und ersetzen Sie defaultsecretsalt durch die von Ihnen erstellte Zeichenfolge:

/var/simplesamlphp/config/config.php
. . .
'secretsalt' => 'your_generated_salt',
. . .

Legen Sie anschließend die technischen Kontaktdaten fest. Diese Informationen finden Sie in den erzeugten Metadaten; SimpleSAMLphp sendet automatisch generierte Fehlerberichte an die von Ihnen angegebene E-Mail-Adresse. Suchen Sie nach folgendem Abschnitt:

/var/simplesamlphp/config/config.php
. . .
'technicalcontact_name'     => 'Administrator',
'technicalcontact_email'    => 'na@example.org',
. . .

Ersetzen Sie Administrator und na@example.org durch entsprechende Werte.

Legen Sie dann die Zeitzone fest, die Sie verwenden möchten. Suchen Sie nach diesem Abschnitt:

/var/simplesamlphp/config/config.php
. . .
'timezone' => null,
. . .

Ersetzen Sie null durch eine bevorzugte Zeitzone aus dieser Liste von Zeitzonen für PHP. Stellen Sie sicher, dass der Wert in Anführungszeichen eingeschlossen ist:

/var/simplesamlphp/config/config.php
. . .
'timezone' => 'America/New_York',
. . .

Speichern und schließen Sie die Datei. Sie sollten nun in Ihrem Browser auf die Site zugreifen können, indem Sie https://your_domain/simplesaml aufrufen. Sie sehen den folgenden Bildschirm in Ihrem Browser:

simplesaml-Weboberfläche

Um sicherzustellen, dass Ihre PHP-Installation alle Anforderungen für eine reibungslose Ausführung von SimpleSAMLphp erfüllt, wählen Sie die Registerkarte Konfiguration und klicken Sie auf den Link Als Administrator anmelden. Verwenden Sie dann das Administratorpasswort, das Sie in der Konfigurationsdatei in Schritt 3 festgelegt haben:

Sobald Sie angemeldet sind, sehen Sie eine Liste der erforderlichen und optionalen PHP-Erweiterungen, die von SimpleSAMLphp verwendet werden. Überprüfen Sie, ob Sie jede Erweiterung installiert haben, ausgenommen predis/predis:

Alle installierten Erweiterungen

Wenn erforderliche Komponenten fehlen, lesen Sie dieses Tutorial noch einmal und installieren Sie die fehlenden Komponenten, bevor Sie fortfahren.

Außerdem sehen Sie einen Link, der besagt Integritätsprüfung für Ihre SimpleSAMLphp-Einrichtung. Klicken Sie auf diesen Link, um eine Liste von auf Ihre Einrichtung angewandten Prüfungen zu erhalten und zu sehen, ob sie erfolgreich waren.

Fahren wir nun mit der Konfiguration einer Authentifizierungsquelle für SimpleSAMLphp fort.

Schritt 4 — Konfigurieren der Authentifizierungsquelle

Nachdem SimpleSAMLphp nun installiert und eingerichtet ist, konfigurieren wir eine Authentifizierungsquelle, damit wir Benutzer authentifizieren können. Wir verwenden eine MySQL-Datenbank, um eine Liste von Benutzernamen und Passwörtern zu speichern, gegen die eine Authentifizierung erfolgt.

Melden Sie sich zunächst beim Root-Konto von MySQL an:

  • mysql -u root -p

Sie werden zur Eingabe des Passworts für das Root-Konto von MySQL aufgefordert. Geben Sie es ein, um fortzufahren.

Erstellen Sie als Nächstes eine Datenbank, die als Authentifizierungsquelle dient. Wir nennen sie auth. Sie können Ihre Datenbank auf Wunsch auch anders nennen:

  • CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Jetzt erstellen wir einen separaten MySQL-Benutzer, der ausschließlich für unsere auth-Datenbank verwendet wird. Aus einer Verwaltungs- und Sicherheitsperspektive ist es eine gute Praxis, unifunktionale Datenbanken und Konten zu erstellen. Wir nennen unseren Benutzer authuser. Führen Sie den folgenden Befehl aus, um den Benutzer zu erstellen, setzen Sie ein Passwort und gewähren Sie Zugriff auf unsere auth-Datenbank. Denken Sie daran, ein starkes Passwort für Ihren neuen Datenbankbenutzer zu wählen:

  • GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';

Erstellen Sie nun eine users-Tabelle für Benutzer, die aus zwei Feldern besteht: username und passwort. Für zusätzliche Sicherheit werden wir die Funktion MySQL AES_ENCRYPT() nutzen, um die Passwortzeichenfolge zu verschlüsseln, damit wir die Passwörter nicht im Klartext speichern. Diese Funktion verschlüsselt eine Zeichenfolge und gibt eine binäre Zeichenfolge zurück.

  • CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));

Fügen Sie dann drei Benutzer in die neu erstellte Tabelle ein. Hier verwenden wir die Funktion AES_ENCRYPT(), um die Werte für das Passwort-Feld zu verschlüsseln. Sie müssen eine Zeichenfolge angeben, die als Verschlüsselungsschlüssel verwendet wird. Stellen Sie sicher, dass Sie diese durch Ihre eigene Zeichenfolge ersetzen, was eine beliebige Zeichenfolge sein kann, solange sie komplex ist.

  • INSERT INTO auth.users(username, password) VALUES
  • ('user1', AES_ENCRYPT('user1pass','your_secret_key')),
  • ('user2', AES_ENCRYPT('user2pass','your_secret_key')),
  • ('user3', AES_ENCRYPT('user3pass','your_secret_key'));

Verwenden Sie für jeden Benutzer den gleichen Schlüssel und vergessen Sie ihn nicht, damit Sie ihn in Zukunft erneut verwenden können, um zusätzliche Benutzer zu erstellen. Außerdem verwenden Sie diesen geheimen Schlüssel in der SimpleSAMLphp-Konfiguration, damit Sie die Passwörter entschlüsseln und mit den von Benutzern eingegebenen Passwörtern vergleichen können.

Wir müssen die Berechtigungen leeren, damit die aktuelle Instanz von MySQL die neuesten Änderungen erkennt:

  • FLUSH PRIVILEGES;

Beenden Sie die MySQL-Eingabeaufforderung durch die Eingabe von:

  • exit

Damit die Funktionalität des Identitätsanbieters in SimpleSAMLphp aktiviert wird, müssen wir die Datei /var/simplesamlphp/config/config.php bearbeiten. Es gibt verschiedene Optionen, da sich dieser Leitfaden aber auf die Unterstützung für SAML 2.0 konzentriert, wollen wir die Option enable.saml20-idp aktivieren. Öffnen Sie dazu /var/simplesamlphp/config/config.php und aktivieren die Unterstützung für SAML 2.0:

  • nano /var/simplesamlphp/config/config.php

Suchen Sie nach diesem Abschnitt der Datei und ersetzen Sie false durch true:

/var/simplesamlphp/config/config.php
...
'enable.saml20-idp' => true,
...

Speichern Sie anschließend die Datei und beenden Sie den Editor.

Nachdem die Funktionalität des Identitätsanbieters nun aktiviert ist, müssen wir das zu verwendende Authentifizierungsmodul angeben. Da wir über eine Benutzertabelle in einer MySQL-Datenbank verfügen, werden wir das SQL-Authentifizierungsmodul verwenden. Öffnen Sie die Konfigurationsdatei authsources:

  • nano /var/simplesamlphp/config/authsources.php

Suchen Sie nach folgendem Block, der auskommentiert ist:

/var/simplesamlphp/config/authsources.php
...
    /*
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
        'username' => 'simplesaml',
        'password' => 'secretpassword',
        'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
    ),
    */
...

Dieser Code definiert eine Datenbankverbindung und eine Abfrage, mit denen SimpleSAMLphp einen Benutzer in einer Datenbanktabelle namens users finden kann. Wir müssen die Kommentierung aufheben und die Abfrage so ändern, dass sie mit MySQLs Funktion AES_DECRYPT() nach einem Benutzer in unserer Tabelle sucht. Wir müssen die Funktion AES_DECRYPT() mit demselben Schlüssel bereitstellen, den wir in der Abfrage zum Verschlüsseln der Passwörter verwendet haben.

Ändern Sie den Abschnitt der Datei, um die Datenbankverbindung und die Abfrage anzugeben:

/var/simplesamlphp/config/authsources.php
...
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
        'username' => 'authuser',
        'password' => 'your_mysql_auth_user_password',
        'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
    ),
...

Stellen Sie sicher, dass Sie Ihren festgelegten geheimen Schlüssel anstelle von your_secret_key angeben.

Speichern und schließen Sie die Datei. Testen wir nun unseren Identitätsanbieter.

Schritt 5 — Testen des Identitätsanbieters mit der SAML 2.0 SP-Demo

Sie können die gerade eingerichtete MySQL-Authentifizierunsquelle testen, indem Sie zur Registerkarte Authentifizierung navigieren und auf den Link Konfigurierte Authentifizierungsquellen testen klicken. Ihnen wird eine Liste der bereits konfigurierten Authentifizierungsquellen angezeigt.

Die Liste der konfigurierten Authentifizierungsquellen

Klicken Sie auf example-sql; das ist der Anbieter, den Sie im vorherigen Schritt konfiguriert haben. Eine Eingabeaufforderung zur Eingabe eines Benutzernamens und eines Passworts wird angezeigt. Geben Sie eine der drei in die MySQL-Benutzertabelle eingefügten Testbenutzer- und Passwortkombinationen ein. Versuchen Sie es mit user1 und dem Passwort user1pass.

Bei einem erfolgreichen Versuch wird Ihnen die Seite SAML 2.0 SP-Demobeispiel angezeigt:

Die erfolgreiche Demo-Seite

Wenn Sie sich nicht anmelden können und wissen, dass das Passwort korrekt ist, vergewissern Sie sich, dass Sie für die Funktion AES_ENCRYPT() (als Sie den Benutzer erstellt haben) und die Funktion AES_DECRYPT() (als Sie nach dem Benutzer gesucht haben) den gleichen Schlüssel verwendet haben.

Jetzt können Sie SimpleSAMLphp mit Ihren eigenen Anwendungen integrieren, indem Sie der SimpleSAMLphp-API-Dokumentation folgen.

Zusammenfassung

Jetzt haben Sie die SimpleSAMLphp-Anwendung in Ihrem Ubuntu 18.04 VPS richtig installiert und konfiguriert. SimpleSAMLphp ermöglicht durch Design auch eine umfassende Anpassung der Benutzeroberfläche. Weitere Informationen dazu finden Sie in der Design-Dokumentation.

0 Comments

Creative Commons License