Tutorial

Comment installer et configurer SimpleSAMLphp pour l'authentification SAML sur Ubuntu 18.04

PHPSecurityUbuntu 18.04

Introduction

SimpleSAMLphp est une application d'authentification PHP open-source qui prend en charge SAML 2.0 en tant que fournisseur de services (SP) ou fournisseur d'identité (IdP).

SAML (Security Assertion Markup Language - Langue de balisage des assertions de sécurité) est un mécanisme de communication sécurisé basé sur XML pour l'échange de données d'authentification et d'autorisation entre les organisations et les applications. Il est souvent utilisé pour mettre en œuvre le Web SSO (Single Sign On). Il n'est donc plus nécessaire de conserver plusieurs justificatifs d'authentification dans plusieurs organisations. En termes simples, vous pouvez utiliser une seule identité, comme un nom d'utilisateur et un mot de passe, pour accéder à plusieurs demandes.

Une instance de SimpleSAMLphp se connecte à une source d'authentification, qui est un fournisseur d'identité comme LDAP ou une base de données d'utilisateurs. Il authentifie les utilisateurs par rapport à cette source d'authentification avant d'accorder l'accès aux ressources mises à disposition par les fournisseurs de services liés.

Dans ce tutoriel, vous allez installer SimpleSamlPHP et le configurer pour utiliser une base de données MySQL comme source d'authentification. Vous stockerez les utilisateurs et les mots de passe cryptés dans la base de données MySQL et vérifierez que vous pouvez utiliser ces utilisateurs pour vous connecter.

Conditions préalables

Étape 1 - Téléchargement et installation de SimpleSAMLphp

Installer SimpleSAMLphp se fait en quelques étapes. Nous devons télécharger le logiciel lui-même ainsi que quelques composants et conditions préalables supplémentaires. Nous devrons également apporter quelques modifications à la configuration de notre hôte virtuel.

Connectez-vous à votre serveur si vous n'êtes pas déjà connecté.

Téléchargez SimpleSAMLphp sur le site web du projet. SimpleSAMLphp lie toujours la dernière version stable de leur logiciel à la même URL. Cela signifie que nous pouvons obtenir la dernière version en tapant ceci :

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

Cela permettra de télécharger un fichier compressé appelé download?latest qui contient SimpleSAMLphp. Extrayez le contenu avec la commande tar : 

  • tar zxf download?latest

Les fichiers seront extraits dans un nouveau répertoire intitulé simpleamlphp-1.x.yx.y est le numéro de la version actuelle. Utilisez la commande ls pour identifier le fichier :

  • ls

Vous verrez le nom du fichier s'afficher :

Ouptut
simplesamlphp-1.18.5

Maintenant, copiez le contenu du répertoire dans /var/simplesamlphp en utilisant la commande cp. Veillez à remplacer le numéro de version par la version que vous avez :

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

Le commutateur -a garantit que les autorisations de fichiers sont copiées avec les fichiers et les dossiers. Le point à la fin du fichier source garantit que tout ce qui se trouve dans le répertoire source, y compris les fichiers cachés, est copié dans le répertoire de destination.

Remarque : Si vous devez installer les fichiers dans un autre endroit, vous devrez mettre à jour plusieurs fichiers. Pour plus de détails, consultez la documentation officielle d'installation de SimpleSAMLphp.

Il existe quelques logiciels supplémentaires dont SimpleSAMLphp a besoin, notamment des extensions PHP pour travailler avec XML, des chaînes de caractères à plusieurs octets, curl et LDAP.  Elle exige également memcached. Installez-les à l'aide de votre gestionnaire de paquets.

Tout d'abord, mettez à jour votre liste de paquets :

  • sudo apt update

Ensuite, installez les paquets :

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

Une fois l'installation terminée, redémarrez Apache pour activer les nouvelles extensions PHP :

  • sudo systemctl restart apache2

Maintenant que SimpleSAMLphp est installé, configurons Apache pour servir les fichiers.

Étape 2 - Configuration d'Apache pour servir SimpleSAMLphp

Vous avez déjà configuré un domaine et pointé sur ce serveur, et vous avez mis en place un hôte virtuel pour travailler avec HTTPS en sécurisant Apache avec Let’s Encrypt. Utilisons cela pour servir SimpleSAMLphp.

Le seul répertoire SimpleSAMLphp qui doit être visible sur le web est /var/simplesamlphp/www. Pour l'exposer au web, modifiez le fichier de configuration Apache SSL de l'hôte virtuel pour votre domaine.

Si le fichier de configuration de votre hôte virtuel est nommé your_domain.conf, Let’s Encrypt a créé un nouveau fichier de configuration appelé your_domain-le-ssl.conf qui traite les demandes HTTPS pour votre domaine. Ouvrez le fichier de configuration SSL avec la commande suivante pour modifier le fichier. Veillez à remplacer your_domain avec le nom réel du fichier : 

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

Le dossier doit ressembler à ce qui suit, bien que le dossier lui-même puisse comporter des commentaires plus descriptifs :

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>

La directive ServerName définit ici le domaine de base qui doit correspondre à cette définition d'hôte virtuel. Il doit s'agir du nom de domaine pour lequel vous avez établi un certificat SSL dans la section Conditions préalables. Ajoutons une directive sur les alias qui donne le contrôle à SimpleSAMLphp pour toutes les URL qui correspondent https://votre_domaine/simplesaml/*. Faites-le en ajoutant la ligne suivante au fichier de configuration :

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

...

Cela signifie que toutes les URL correspondent <^>domain_name^>/simplesaml/* sera dirigé vers le /var/simplesamlphp/www donnant le contrôle de SimpleSAMLphp. 

Ensuite, nous donnerons accès au registre/var/simplesamlphp/www en spécifiant un Exiger tout le contrôle d'accès à ce dernier. Le service SimpleSAMLphp sera ainsi accessible sur le Web. Faites-le en ajoutant ce qui suit au fichier de configuration :

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>
...

Enregistrez et fermez le fichier. Redémarrez Apache pour que les changements prennent effet :

  • sudo systemctl restart apache2

Maintenant qu'Apache est configuré pour servir les fichiers d'application, configurons SimpleSAMLphp.

Étape 3 - Configuration de SimpleSAMLphp

Ensuite, nous devons apporter plusieurs modifications à la configuration de base de SimpleSAMLphp située à /var/simplesamlphp/config/config.php. Ouvrez le fichier dans votre éditeur :

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

Définissez le mot de passe de l'administrateur en localisant la ligne « auth.adminpassword » et en remplaçant la valeur par défaut de 123 par un mot de passe plus sûr. Ce mot de passe vous permet d'accéder à certaines des pages de votre interface web d'installation de SimpleSAMLphp

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

Ensuite, définissez un sel secret, qui doit être une chaîne de caractères générée de façon aléatoire. Certaines parties de SimpleSAMLphp utilisent ce sel pour créer des hachages cryptographiquement sécurisés. Vous obtiendrez des erreurs si le sel n'est pas modifié par rapport à la valeur par défaut.

Vous pouvez utiliser l'OpenSSL La fonction Rand permet de générer une chaîne aléatoire qui vous servira de chaîne de sel secrète. Ouvrez un nouveau terminal, reconnectez-vous à votre serveur et exécutez la commande suivante pour générer cette chaîne :

  • openssl rand -base64 32

L'option -base64 32 garantit une chaîne codée en Base64 de 32 caractères.

Ensuite, dans le fichier de configuration, localisez l'entrée « secretsalt » et remplacez defaultsecretsalt avec la chaîne que vous avez générée : 

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

Définissez ensuite les coordonnées techniques. Ces informations seront disponibles dans les métadonnées générées, et SimpleSAMLphp enverra des rapports d'erreur générés automatiquement à l'adresse électronique que vous aurez indiquée. Repérez la section suivante :

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

Remplacez Administrator et na@example.org avec des valeurs appropriées. 

Définissez ensuite le fuseau horaire que vous souhaitez utiliser. Localisez cette section :

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

Remplacez null avec un fuseau horaire préférentiel à partir de cette liste de fuseaux horaires pour PHP. Veillez à indiquer la valeur entre guillemets :

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

Enregistrez et fermez le fichier. Vous devriez maintenant pouvoir accéder au site dans votre navigateur en visitant https://your_domain/simplesaml. Vous verrez l'écran suivant dans votre navigateur :

simplesaml web interface

Pour vous assurer que votre installation PHP répond à toutes les exigences pour le bon fonctionnement de SimpleSAMLphp, sélectionnez l'onglet Configuration et cliquez sur le lien Login as administrator (Se connecter en tant qu'administrateur). Utilisez ensuite le mot de passe administrateur que vous avez défini dans le fichier de configuration à l'étape 3.

Une fois connecté, vous verrez une liste des extensions PHP obligatoires et facultatives utilisées par SimpleSAMLphp. Vérifiez que vous avez installé toutes les extensions, sauf predis/predis: 

Toutes les extensions installées 

S'il manque des composants requis, consultez ce tutoriel et installez les composants manquants avant de passer à autre chose.

Vous verrez également un lien qui dit Sanity check of your SimpleSAMLphp setup (Contrôle de l'état de santé de votre installation SimpleSAMLphp). Cliquez sur ce lien pour obtenir une liste des contrôles appliqués à votre installation afin de voir s'ils sont réussis.

Passons à la configuration d'une source d'authentification pour SimpleSAMLphp.

Étape 4 - Configuration de la source d'authentification

Maintenant que nous avons installé et configuré SimpleSAMLphp, configurons une source d'authentification afin de pouvoir authentifier les utilisateurs. Nous utiliserons une base de données MySQL pour stocker une liste de noms d'utilisateurs et de mots de passe permettant de s'authentifier.

Pour commencer, connectez-vous au compte racine MySQL :

  • mysql -u root -p

Le mot de passe du compte root MySQL vous sera demandé. Fournissez-le pour pouvoir continuer.

Ensuite, créez une base de données qui servira de source d'authentification. Nous l'appellerons auth. N'hésitez pas à donner un nom différent au vôtre :

  • CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Maintenant, créons un utilisateur MySQL séparé pour opérer exclusivement sur notre base de données auth. Du point de vue de la gestion et de la sécurité, c'est une bonne pratique que de créer des bases de données et des comptes à fonction unique. Nous nommerons notre utilisateur authuser.  Exécutez la commande suivante pour créer l'utilisateur, définir un mot de passe et lui donner accès à notre base de données auth. N'oubliez pas de fournir ici un mot de passe fort pour votre nouvel utilisateur de la base de données.

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

Créez maintenant un utilisateur qui sera composé de deux champs : nom d'utilisateur et mot de passe. Pour une sécurité supplémentaire, nous allons utiliser la fonction MySQL AES_ENCRYPT() pour crypter la chaîne de mots de passe afin que nous ne stockions pas les mots de passe en texte clair. Cette fonction crypte une chaîne de caractères et renvoie une chaîne binaire.

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

Insérez ensuite trois utilisateurs dans le tableau nouvellement créé. C'est là que nous utiliserons la fonction AES_ENCRYPT() pour crypter les valeurs du champ du mot de passe. Vous devez fournir une chaîne qui sert de clé de cryptage. Veillez à remplacer cela par votre propre chaîne, qui peut être n'importe laquelle tant qu'elle est complexe.

  • 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'));

Utilisez la même clé pour chaque utilisateur, et assurez-vous de vous souvenir de la clé afin de pouvoir l'utiliser à nouveau pour créer d'autres utilisateurs à l'avenir. Vous utiliserez également cette clé secrète dans la configuration de SimpleSAMLphp afin de pouvoir décrypter les mots de passe et les comparer avec ceux que les utilisateurs saisissent.

Nous devons vider les privilèges afin que l'instance actuelle de MySQL soit au courant des récents changements de privilèges que nous avons effectués :

  • FLUSH PRIVILEGES;

Sortez de l'invite MySQL en tapant :

  • exit

Pour activer la fonctionnalité de fournisseur d'identité dans SimpleSAMLphp, nous devons modifier le fichier/var/simplesamlphp/config/config.php. Plusieurs options sont disponibles, mais comme ce guide se concentre sur le support SAML 2.0, nous voulons permettre à l'option enable.saml20-idp.  Pour ce faire, ouvrez /var/simplesamlphp/config/config.php et activez le support SAML 2.0 : 

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

Localisez cette section du fichier et remplacez false par true :

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

Ensuite, enregistrez le fichier et quittez l'éditeur.

Maintenant que nous avons activé la fonctionnalité de fournisseur d'identité, nous devons indiquer le module d'authentification à utiliser. Comme nous avons une table d'utilisateurs sur une base de données MySQL, nous allons utiliser le module d'authentification SQL. Ouvrez le fichier de configuration authsources :

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

Localisez le bloc suivant, qui est commenté :

/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);',
    ),
    */
...

Ce code définit une connexion à la base de données et une requête que SimpleSAMLphp peut utiliser pour rechercher un utilisateur dans une table de base de données appelée users. Nous devons le décommenter et modifier la requête pour rechercher un utilisateur dans notre table en utilisant la fonction AES_DECRYPT() de MySQL. Nous devrons fournir à la fonction AES_DECRYPT()la même clé que celle utilisée pour crypter les mots de passe dans la requête. 

Modifiez la section du fichier pour spécifier les détails de connexion à la base de données et la requête :

/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',
    ),
...

Veillez à placer la clé secrète que vous avez indiquée à la place de your_secret_key. 

Enregistrez et fermez le fichier. Testons notre fournisseur d'identité.

Étape 5 - Testez le fournisseur d'identité avec la démo de SAML 2.0 SP

Vous pouvez tester la source d'authentification MySQL que vous venez de mettre en place en naviguant vers l’ onglet Authentification et en cliquant sur le lien Test configured authentication sources​​​ (Tester les sources d'authentification configurées). Une liste des sources d'authentification déjà configurées vous sera présentée.

La liste des sources d'authentification configurées 

Cliquez sur l'exemple-sqlcar il s'agit du fournisseur que vous avez configuré à l'étape précédente. Une invite à entrer un nom d'utilisateur et un mot de passe apparaîtra. Entrez l'une des trois combinaisons d'utilisateur et de mot de passe que vous avez insérées dans la table des utilisateurs MySQL. Essayez user1 avec le mot de passe user1pass.

Si votre tentative est couronnée de succès, vous recevrez la page SAML 2.0 SP Demo Example(Exemple de démo de SAML 2.0 SP) : 

La page de démonstration réussie 

Si vous ne pouvez pas vous connecter et que vous savez que le mot de passe est correct, assurez-vous que vous avez utilisé la même clé avec la fonction AES_ENCRYPT() lorsque vous avez créé l'utilisateur, et la fonction AES_DECRYPT() lorsque vous avez recherché l'utilisateur.

Vous pouvez désormais intégrer SimpleSAMLphp à vos propres applications en suivant les instructions de la Documentation de l'API SimpleSAMLphp. 

Conclusion

L'application SimpleSAMLphp est maintenant correctement installée et configurée sur votre VPS Ubuntu 18.04. SimpleSAMLphp permet également une personnalisation poussée de l'interface utilisateur grâce à la thématisation. Vous pouvez vous référer à leur documents thématiques pour en savoir plus à ce sujet. 

0 Comments

Creative Commons License