Comment installer et configurer l’authentification SimpleSAMLphp for SAML sur Ubuntu 16.04

introduction

SimpleSAMPLphp est une application d’authentification PHP open-source prenant en charge http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview -2.0.html [SAML 2.0] en tant que fournisseur de service ou fournisseur d’identité (IdP).

_SAML (Security Assertion Markup Language) _ est un mécanisme de communication sécurisé basé sur XML permettant l’échange de données d’authentification et d’autorisation entre des organisations et des applications. Il est souvent utilisé pour implémenter Web SSO (Single Sign On). Cela évite d’avoir à gérer plusieurs informations d’authentification dans plusieurs organisations. En termes simples, vous pouvez utiliser une identité unique, comme un nom d’utilisateur et un mot de passe, pour accéder à plusieurs applications.

Une instance de SimpleSAMLphp se connecte à un authentication source, qui est un fournisseur d’identité tel que 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 didacticiel, vous allez installer SimpleSamplPHP et le configurer pour utiliser une base de données MySQL en tant que source d’authentification. Vous allez stocker les utilisateurs et les mots de passe chiffrés dans la base de données MySQL et tester que vous pouvez utiliser ces utilisateurs pour vous connecter.

Conditions préalables

Étape 1 - Télécharger et installer SimpleSAMLphp

L’installation de SimpleSAMLphp implique plusieurs étapes. Nous devons télécharger le logiciel lui-même, ainsi que quelques composants et prérequis supplémentaires. Nous devrons également apporter quelques modifications à la configuration de notre hôte virtuel.

Connectez-vous à votre serveur si vous ne l’êtes pas déjà.

Téléchargez SimpleSAMLphp depuis le site Web du projet. SimpleSAMLphp relie 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 téléchargera 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 nommé + simplesamlphp-1. +, Où ++ est le numéro de version actuel. Utilisez la commande + ls + pour identifier le fichier:

ls simplesamplphp-1*

Vous verrez le nom du fichier affiché:

Ouptutsimplesamlphp-

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

sudo cp -a simplesamlphp-/. /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 le contenu du répertoire source, y compris les fichiers cachés, est copié dans le répertoire de destination.

Il existe quelques packages logiciels supplémentaires dont SimpleSAMLphp a besoin, notamment des extensions PHP permettant de travailler avec XML, des chaînes multi-octets, + curl + et LDAP. Il nécessite également memcached. Installez-les à l’aide de votre gestionnaire de paquets.

Premièrement, mettez à jour votre liste de paquets:

sudo apt-get update

Puis installez les paquets:

sudo apt-get 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 configuré un hôte virtuel pour qu’il fonctionne avec HTTPS en sécurisant Apache avec Let Encrypt. Utilisons cela pour servir SimpleSAMLphp.

Le seul répertoire SimpleSAMLphp devant être visible sur le Web est + / var / simplesamlphp / www +. Pour l’exposer au Web, éditez le fichier de configuration Apache Virtual Host SSL pour votre domaine.

Si votre fichier de configuration d’hôte virtuel s’appelle + .conf +, Let’s Encrypt a créé un nouveau fichier de configuration nommé + -le-ssl.conf + qui gère les demandes HTTPS de votre domaine. Ouvrez le fichier de configuration SSL avec la commande suivante pour éditer le fichier. Assurez-vous de remplacer ++ par le nom réel du fichier:

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

Le fichier devrait ressembler à ceci, bien que le fichier lui-même puisse contenir des commentaires plus descriptifs:

votre_domaine-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
       ServerName

       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html

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

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

La directive + ServerName + définit ici le domaine de base devant correspondre à cette définition d’hôte virtuel. Cela devrait être le nom de domaine pour lequel vous avez configuré un certificat SSL dans la section * Prerequisites *. Ajoutons une directive + Alias ​​+ qui donne le contrôle à SimpleSAMLphp pour toutes les URL correspondant à + ​​https: /// simplesaml / * + en ajoutant la ligne suivante au fichier de configuration:

votre_domaine-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf

...
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html



...

Cela signifie que toutes les URL correspondant à + ​​/ simplesaml / * + seront dirigées vers le répertoire + / var / simplesamlphp / www + en donnant le contrôle à SimpleSAMLphp.

Ensuite, nous allons accorder l’accès au répertoire + / var / simplesamlphp / www + en spécifiant un contrôle d’accès `+ Require all + + accordé pour ce dernier. Cela rendra le service SimpleSAMLphp accessible sur le Web. Faites cela en ajoutant ce qui suit au fichier de configuration:

votre_domaine-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf

...
 Alias /simplesaml /var/simplesamlphp/www



...

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

sudo systemctl restart apache2

Maintenant que Apache est configuré pour servir les fichiers de l’application, configurons SimpleSAMLphp.

Étape 3 - Configuration de SimpleSAMLphp

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

nano /var/simplesamlphp/config/config.php

Définissez le mot de passe administrateur en localisant la ligne + 'auth.adminpassword' + et en remplaçant la valeur par défaut de ++ par un mot de passe plus sécurisé. Ce mot de passe vous permet d’accéder à certaines des pages de votre interface Web d’installation SimpleSAMLphp:

/var/simplesamlphp/config/config.php

. . .
'auth.adminpassword'        => '',
. . .

Ensuite, définissez un sel secret, qui devrait être une chaîne de caractères générée aléatoirement. Certaines parties de SimpleSAMLphp utilisent ce sel pour créer des hachages sécurisés de manière cryptographique. Vous obtiendrez des erreurs si la valeur par défaut n’est pas modifiée.

Vous pouvez utiliser la fonction OpenSSL + rand + pour générer une chaîne aléatoire à utiliser comme chaîne de sel secrète. Ouvrez un nouveau terminal, connectez-vous à nouveau à 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 ++ par la chaîne que vous avez générée:

/var/simplesamlphp/config/config.php

. . .
'secretsalt' => '',
. . .

Définissez ensuite les informations de contact technique. 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 spécifiée. Localisez la section suivante:

/var/simplesamlphp/config/config.php

. . .
'technicalcontact_name'     => '',
'technicalcontact_email'    => '',
. . .

Remplacez ` et ` par les valeurs appropriées.

Puis définissez le fuseau horaire que vous souhaitez utiliser. Localisez cette section:

/var/simplesamlphp/config/config.php

. . .
'timezone' => ,
. . .

Remplacez ++ par un fuseau horaire préféré à partir de cette liste de fuseaux horaires pour PHP. Assurez-vous de mettre la valeur entre guillemets:

/var/simplesamlphp/config/config.php

. . .
'timezone' => ,
. . .

Enregistrez et fermez le fichier. Vous devriez maintenant pouvoir accéder au site dans votre navigateur en visitant + https: /// simplesaml +. L’écran suivant apparaît dans votre navigateur:

image: https: //assets.digitalocean.com/articles/simplesamplphp_1604/W6KphyN.png [interfaces Web simplesaml]

Pour vous assurer que votre installation PHP remplit toutes les conditions requises pour que SimpleSAMLphp fonctionne correctement, sélectionnez l’onglet * Configuration *, puis cliquez sur le lien * Connexion en tant qu’administrateur *. Ensuite, utilisez 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, ainsi que des extensions déjà installées sur votre système. Si toutes les extensions PHP sont installées dans votre configuration, votre écran ressemblera à ceci:

image: https: //assets.digitalocean.com/articles/simplesamplphp_1604/I8iLFjy.png [Toutes les extensions installées]

S’il manque des composants, consultez ce didacticiel et installez-les avant de poursuivre.

Vous verrez également un lien qui dit * Vérification de la santé de votre configuration SimpleSAMLphp *. Cliquez sur ce lien pour obtenir une liste des vérifications appliquées à votre configuration pour voir si elles ont réussi.

Passons maintenant à la configuration d’une source d’authentification pour SimpleSAMLphp.

Étape 4 - Configuration de la source d’authentification

Maintenant que SimpleSAMLphp est installé et configuré, 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’utilisateur et de mots de passe pour s’authentifier.

Pour commencer, connectez-vous au compte MySQL * root *:

mysql -u root -p

Le mot de passe du compte racine MySQL vous sera demandé. Fournissez-le pour procéder.

Créez ensuite une base de données qui servira de source d’authentification. Nous l’appellerons + auth +. N’hésitez pas à nommer le vôtre différemment:

CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Créons maintenant un utilisateur MySQL distinct qui fonctionnera exclusivement sur notre base de données + auth +. Du point de vue de la gestion et de la sécurité, il est recommandé 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 base de données.

GRANT ALL ON .* TO ''@'localhost' IDENTIFIED BY '';

Créez maintenant une table + user in, qui sera composée de deux champs:` + username` et + password _. Pour plus de sécurité, nous allons utiliser la fonction + MySQL AES_ENCRYPT () + pour chiffrer la chaîne de mot de passe afin de ne pas stocker les mots de passe en texte brut. Cette fonction chiffre une chaîne et renvoie une chaîne binaire.

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

Ensuite, insérez trois utilisateurs dans la table nouvellement créée. C’est là que nous allons utiliser la fonction + AES_ENCRYPT () + pour chiffrer les valeurs du champ mot de passe. Vous devez fournir une chaîne utilisée comme clé de chiffrement. Assurez-vous de le remplacer par votre propre chaîne, qui peut être n’importe quelle chaîne de votre choix, à condition qu’elle soit complexe.

INSERT INTO auth.users(username, password) VALUES
('', AES_ENCRYPT('','')),
('', AES_ENCRYPT('','')),
('', AES_ENCRYPT('',''));

Utilisez la même clé pour chaque utilisateur et n’oubliez pas de vous en souvenir pour pouvoir la réutiliser ultérieurement afin de créer d’autres utilisateurs. Vous utiliserez également cette clé secrète dans la configuration de SimpleSAMLphp pour pouvoir déchiffrer les mots de passe et les comparer à ceux que les gens ont saisis.

Nous devons vider les privilèges pour que l’instance actuelle de MySQL connaisse les récents changements de privilèges que nous avons apportés:

FLUSH PRIVILEGES;

Quittez 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 porte sur la prise en charge de SAML 2.0, nous souhaitons activer l’option + enable.saml20-idp +. Pour ce faire, ouvrez le répertoire + / var / simplesamlphp / config / config.php + et activez la prise en charge de SAML 2.0:

nano /var/simplesamlphp/config/config.php

Localisez cette section du fichier:

/var/simplesamlphp/config/config.php

...
'enable.saml20-idp' => ,
...

Remplacez + faux par` + vrai`. Enregistrez ensuite le fichier et quittez l’éditeur.

Maintenant que la fonctionnalité de fournisseur d’identité est activée, 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 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 à une 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 + utilisateurs +. Nous devons supprimer le commentaire et changer 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 chiffrer 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' => '',
       'username' => '',
       'password' => '',
       'query' => 'SELECT  FROM users WHERE  = :username AND password = :password',
   ),
...

Assurez-vous de placer la clé secrète que vous avez spécifiée à la place de ++.

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

Étape 5 - Test du fournisseur d’identité avec la démo SAML 2.0 SP

Vous pouvez tester la source d’authentification MySQL que vous venez de configurer en accédant à l’onglet * Authentication * et en cliquant sur le lien * Test des sources d’authentification configurées *. Une liste des sources d’authentification déjà configurées vous sera présentée.

image: https: //assets.digitalocean.com/articles/simplesamplphp_1604/S5oJ8tr.png [La liste des sources d’authentification configurées]

Cliquez sur * exemple-sql *, car il s’agit du fournisseur que vous avez configuré à l’étape précédente. Une invite pour entrer un nom d’utilisateur et mot de passe apparaîtra. Entrez l’une des trois combinaisons d’utilisateur et de mot de passe test que vous avez insérées dans le tableau des utilisateurs de MySQL. Essayez + user1 + avec le mot de passe + user1pass +.

En cas de tentative réussie, la page * Exemple de démonstration SAML 2.0 SP * s’affichera:

image: https: //assets.digitalocean.com/articles/simplesamplphp_1604/fjs7Kv1.png [La page de démonstration réussie]

Si vous ne parvenez pas à vous connecter et que vous savez que le mot de passe est correct, assurez-vous d’avoir utilisé la même clé avec les fonctions + AES_ENCRYPT () + lors de la création de l’utilisateur et avec la fonction + AES_DECRYPT () + quand vous avez regardé l’utilisateur.

Vous pouvez maintenant intégrer SimpleSAMLphp à vos propres applications en suivant la documentation de l’API SimpleSAMLphp.

Conclusion

Vous avez maintenant l’application SimpleSAMLphp correctement installée et configurée sur votre Ubuntu 16.04 VPS. Vous pouvez explorer davantage de possibilités en ajoutant d’autres fournisseurs d’identité et de services. SimpleSAMLphp permet également une personnalisation poussée de l’interface utilisateur grâce à la thématisation. Vous pouvez vous référer à leur theming docs pour plus d’informations à ce sujet.