SAML mit SimpleSAMLphp

Veröffentlicht von Thomas Krupa am

SAML (Security Assertion Markup Language) ist ein Standard, mit dem Identitätsprovider (IdP) Autorisierungsdaten an Dienstanbieter (SP) übergeben können. Damit wird ein Single-Sign-on (SSO), also ein zentrales einmaliges Login ermöglicht. Benutzer melden sich einmal an und erhalten automatisch Zugriff auf andere Programme und Dienste, die für sie freigegeben sind.

In diesem Beitrag wollen wir zeigen wie man SimpleSAMLphp installiert und als Identitätsprovider für WordPress (= Service Provider) konfiguriert.

Voraussetzungen
Webserver mit PHP z.B. Ubuntu oder Debian

Eine Möglichkeit wäre SimpleSAMLphp aus dem Repository zu installieren.

sudo apt update
sudo apt install simplesamlphp
sudo apt install php-xml php-mbstring php-curl php-memcache  

Der Vorteil wäre, dass damit auch automatisch Sicherheitsupdates eingespielt werden. Der Nachteil, ist die doch etwas veraltete Version. Daher haben wir das von der Projektseite heruntergeladen.

https://simplesamlphp.org/download?latest -O simplesaml.tar
tar -xvf simplesaml.tar
cp simplesamlphp-1.xx.x/. /var/simplesaml -R

Im nächsten Schritt konfigurieren wir Apache. Dazu legen wir eine Datei saml.conf in /etc/apache/sites-enabled an und laden anschließend Apache neu.

<VirtualHost *:443>
  SSLEngine On
  DocumentRoot "/var/simplesaml/www"
  Alias /simplesaml /var/simplesaml/www
  SSLCertificateFile /etc/letsencrypt/live/mydom/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/mydom/privkey.pem
</VirtualHost>

Jetzt sollte unter http://localhost/simplesaml erreichbar sein. Im nächsten Schritt werden wir die config.php anpassen. Folgende Parameter haben wir geändert.

'baseurlpath' => 'https://mydomain.at/simplesaml',

'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => 'admin@mydomain.at',

'timezone' => 'Europe/Vienna',

'secretsalt' => 'defaultsecretsalt',

'auth.adminpassword' => 'EINgutesPassWort',
'admin.protectindexpage' => true,
'admin.protectmetadata' => true

'enable.saml20-idp' => true,

'language.default' => 'de',

Anschließend ist eine Überprüfung der Konfiguration sinnvoll. Dazu ist es notwendig sich als Administrator unter der Registerkarte Configuration anzumelden. Das Ergebnis könnte dann so aussehen.

LDAP, redis und Memcache haben wir nicht installiert. Ist aber nicht unbedingt Voraussetzung. Auf den Sanity-check sollte man auch nicht verzichten.

Authentifizierungsmodule

Nachdem die Funktionalität des Identitätsproviders nun aktiviert ist, müssen wir das zu verwendende Authentifizierungsmodul angeben. Nachdem unsere Benutzer in einer MySQL-Datenbank gespeichert sind, werden wir das SQL-Authentifizierungsmodul verwenden.

Natürlich ist es möglich eine vorhandene Moodledatenbank zu verwenden.

Wir ändern die Datei config/authsources.php und fügen folgenden Abschnitt hinzu:

 'myIdP-example' => [
      'sqlauth:SQL',
      'dsn' => 'mysql:host=localhost;dbname=myDatabase',
      'username' => 'admin',
      'password' => 'admin',
      'hash_column' => 'passwordHash',
      'query' => 'SELECT login AS uid, vorname, nachname, mail, password FROM user  WHERE login = :username;',      
    ],

Eine passende Testtabelle kann mit folgendem SQL erstellt werden.

CREATE TABLE IF NOT EXISTS `benutzer` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `login` varchar(50) NOT NULL,
    `vorname` varchar(50) NOT NULL,
    `nachname` varchar(50) NOT NULL,
    `email` varchar(50) NOT NULL,
    `password` varchar(60) NOT NULL,
    PRIMARY KEY (`id`)
 );

Im nächsten Schritt ersetzen wir die Datei SQL.php im Verzeichnis simplesamlphp/modules/sqlauth/lib/Auth/Source durch diese. Sie basiert auf diesem Projekt, das bcrypt für simpleSAMLphp als Passwordhash ermöglicht.

Jetzt können wir den Identitätsprovider mal testen. Nach einem erfolgreichen Login, sollten alle Attribute (id, login, vorname, nachname, email, password) angezeigt werden.

Serviceprovider

Am Beispiel von WordPress werden wir die Konfiguration des Serviceproviders zeigen. Auf der WordPress-Seite haben wir folgendes Plugin installiert. Es gibt aber auch andere und die Konfiguration in WordPress ist für alle ziemlich ähnlich.

Als ersten Schritt erstellen wir ein Zertifikat.

openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out saml.crt -keyout saml.key

Der Dienstanbieter, den wir konfigurieren, muss wissen, mit welchen Identitätsanbietern wir eine Verbindung herstellen möchten. Dies wird durch Metadaten konfiguriert, die in metadata/saml20-sp-remote.php gespeichert sind. Für WordPress sieht das zum Beispiel so aus.

$metadata['wordPressSPEId'] = [
    'AssertionConsumerService' => 'https://wpSite/wp-login.php?saml_acs',
    'SingleLogoutService'      => 'https://wpSite/wp-login.php?saml_sls',
    'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
    'simplesaml.nameidattribute' => 'uid',
    'simplesaml.attributes'      => true,
    'attributes' => array('mail', 'uid', 'nachname', 'role','vorname','memberOf','kurzname'),
];

Im Verzeichnis metadata müssen wir auch die Datei saml20-idp-hosted.php ändern.

$metadata['__DYNAMIC:1__'] = [
    'host' => '__DEFAULT__',

    // X.509 key and certificate. Relative to the cert directory.
    'privatekey' => 'saml.key',
    'certificate' => 'saml.crt',
    'auth' => 'myIdP-example', //from config/authsources.php
    'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
    'authproc' => [
        // Convert LDAP names to oids.
        100 => ['class' => 'core:AttributeMap', 'name2oid'],
    ],

Anschließend kann man am Federation Register unserer SimpleSAML-Installation noch die Metadaten auslesen, die wir in WordPress brauchen.

Anhand dieser Metadaten kann man je nach Plugin einfach die XML-Daten an WordPress übergeben oder man sucht sich die notwendigen Daten und gibt diese dann manuell ein.
In WordPress sieht das dann so aus.

Im Bild zeigen wir nur einen Ausschnitt von Parametern, da hier sehr viel mehr konfiguriert werden kann. Einen Parameter sollte man nicht vergessen zu konfigurieren.
Service Provider Entity Id = wordPressSPEId
damit das dann mit saml20-sp-remote.php übereinstimmt.

Jetzt ist ein SAML-Login möglich. Die Vorteile liegen auf der Hand:

Man muss die Benutzer und Zugangsdaten nur einmal warten.
Benutzer werden automatisch in WordPress/… angelegt als auch aktualisiert.
SAML gibt es für viele Dienste, so auch zum Beispiel für Moodle, Nextcloud, WebUntis, MediaWiki, Google, …
Wer SAML in die eigene PHP-Applikation integrieren will, kann das relativ einfach tun.

require_once('SAMLPATH/lib/_autoload.php'); 
$as = new \SimpleSAML\Auth\Simple('myIdP-example');
$as->requireAuth();
$attributes = $as->getAttributes();

Wer SimpleSAMLphp noch weiter absichern möchte, zum Beispiel mit 2 Faktor Authentifizierung, der soll einen Blick zu PrivacyIDEA machen. Vielleicht gibt es dazu auch mal einen Blogeintrag.

Bevor man das ganze System in den Produktivbetrieb überführt, sollten auf alle Fälle noch ein paar Einstellungen in der config/config.php angepasst werden.

  'showerrors' => false,
  'errorreporting' => false,
   ...
  'session.cookie.secure' => true, // https site only!
   ...
  'admin.protectindexpage' => true,
  'admin.protectmetadata' => true,
  ...
  'module.enable' => [
      'sanitycheck' => false,
      'admin' => false,
  ],

Weiterführende Links:

  1. https://simplesamlphp.org/
  2. https://www.univention.de/blog-de/2019/06/saml-fuer-sichere-komfortable-webzugaenge-kurz-erklaert/
  3. https://www.ionos.at/digitalguide/server/sicherheit/saml/
  4. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-simplesamlphp-for-saml-authentication-on-ubuntu-18-04-de

Kategorien: DachsbergHowToSoftware

0 Kommentare

Schreibe einen Kommentar

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