[Projet] OpenLDAP, phpldapadmin et Nginx

Je poursuis mes aventures avec mon projet de fin d’année. Mon infrastructure de base étant prête, je peux passer à l’installation des différents services demandés. Le service de nom (DNS) est correctement configuré, on peut maintenant attaquer la gestion des utilisateurs avec un serveur OpenLDAP complet, administrable par phpldapadmin, lui-même propulsé par Nginx.

Mon but ici n’est pas de raconter l’histoire de ces projets ni ce qu’ils font mais d’avoir une trace écrite des différents étapes de l’installation de tout ce petit monde. Enfin l’ensemble est configuré pour fonctionner. Tout ce qui concerne la sécurité et les performances a été mis de côté. J’ai juste besoin d’un truc qui marchera le jour de ma soutenance.

C’est parti !

Oh et comme pour les précédents articles, je pars d’une Debian 7 fraîchement installée et à jour.

Installation et configuration d’OpenLDAP

Installation des paquets

C’est sans doute l’étape la plus facile, sauf si vous préférez le compiler vous-même, il suffit d’utiliser :

sudo apt-get install slapd ldap-utils

Configuration de l’annuaire

Concernant la configuration d’OpenLDAP, vous verrez beaucoup de tutoriels sur Internet utilisant le fichier slapd.conf or cette méthode est aujourd’hui obsolète et il est recommandé d’utiliser des fichiers LDIF avec les utilitaires ldapmodify et ldapadd pour configurer correctement votre annuaire. Normalement, debconf pose des questions lors de l’installation permettant de mettre en place une installation de base avec un compte administrateur.

Toute la configuration de trouve dans un annuaire spécifique dont la structure de base ressemble à :

Configuration OpenLDAP

D’ailleurs si vous allez faire un tour du côté de /etc/ldap/slapd.d/, Vous y trouverez ceci :

sudo ls -Rbl
.:
total 8
drwxr-x--- 3 openldap openldap 4096 juin   1 20:58 cn=config
-rw------- 1 openldap openldap  478 juin   1 20:58 cn=config.ldif
 
./cn=config:
total 28
-rw------- 1 openldap openldap  454 juin   1 20:58 cn=module{0}.ldif
drwxr-x--- 2 openldap openldap 4096 juin   1 20:58 cn=schema
-rw------- 1 openldap openldap  396 juin   1 20:58 cn=schema.ldif
-rw------- 1 openldap openldap  414 juin   1 20:58 olcBackend={0}hdb.ldif
-rw------- 1 openldap openldap  543 juin   1 20:58 olcDatabase={0}config.ldif
-rw------- 1 openldap openldap  657 juin   1 20:58 olcDatabase={-1}frontend.ldif
-rw------- 1 openldap openldap 1091 juin   1 20:58 olcDatabase={1}hdb.ldif
 
./cn=config/cn=schema:
total 40
-rw------- 1 openldap openldap 15545 juin   1 20:58 cn={0}core.ldif
-rw------- 1 openldap openldap 11379 juin   1 20:58 cn={1}cosine.ldif
-rw------- 1 openldap openldap  6509 juin   1 20:58 cn={2}nis.ldif
-rw------- 1 openldap openldap  2873 juin   1 20:58 cn={3}inetorgperson.ldif

Donc normalement ici, votre annuaire LDAP est en place. Il ne reste bien évidemment plus qu’à le peupler. Et ici aussi, il faut passer par le format LDIF.

Zoom sur le format LDIF

Pour manipuler facilement de grandes quantités de données, LDAP a défini un format de fichier, décrit par la RFC 2849 : LDIF (LDAP Interchange Format). Rassurez-vous, le LDIF n’est qu’un simple fichier texte mais formaté d’une certaine manière. On peut y trouver :

  • des descriptions d’entrées de l’annuaire,
  • des valeurs d’attribut pour les entrées de l’annuaire
  • des instructions de traitements pour le serveur.

Voici un exemple issu de Wikipédia représentant la racine d’un annuaire avec une branche et une entrée dans celle-ci :

dn: dc=example,dc=com
dc: example
description: Serveur exemple
objectClass: dcObject
objectClass: organization
o: Serveur exemple
 
dn: ou=people, dc=example,dc=com
ou: people
objectClass: organizationalUnit
 
dn: cn=admin, ou=people, dc=example,dc=com
description: Administrateur LDAP
objectClass: organizationalRole
cn: admin

Je découvre OpenLDAP là et ça me semble vraiment très complet ! Pas facile de s’y retrouver lorsqu’on débarque là-dedans pour la première fois. Je reviendrai sûrement sur OpenLDAP cet été car mon prochain stage m’amènera à beaucoup travailler dessus.

Bref, pour débuter je vais m’installer une interface web afin de faciliter l’administration de tout ce petit monde. Cette interface s’appelle phpldapadmin (ça rappelle un peu phpMyAdmin !) et pour ça, il me faut un serveur web. Comme je n’ai pas trop de ressource à lui allouer, j’ai choisi Nginx.

Installation de Nginx et PHP

Installation de Fast-CGI et PHP

Contrairement à Apache, Nginx ne propose pas de mod_php. Vous ne pouvez pas non plus utiliser PHP en CGI ! Il va falloir utiliser FastCGI et le configurer de sorte qu’il lance le processus PHP.

sudo apt-get install php5-cgi spawn-fcgi

Le script suivant a été honteusement pompé sur neokraft.net, fonctionne sous Debian et est à placer dans /etc/init.d/php5-fcgi :

#!/bin/sh
 
### BEGIN INIT INFO
# Provides:       php5-fcgi
# Required-Start: $remote_fs $syslog
# Required-Stop:  $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: PHP5 FastCgi Spawned processes
### END INIT INFO
 
COMMAND=/usr/bin/spawn-fcgi
ADDRESS=127.0.0.1
PORT=9000
USER=www-data
GROUP=www-data
PHPCGI=/usr/bin/php5-cgi
PIDFILE=/var/run/fastcgi-php.pid
RETVAL=0
 
PHP_FCGI_MAX_REQUESTS=500
PHP_FCGI_CHILDREN=2
 
start() {
    export PHP_FCGI_MAX_REQUESTS PHP_FCGI_CHILDREN
    $COMMAND -a $ADDRESS -p $PORT -u $USER -g $GROUP -f $PHPCGI -P $PIDFILE
}
 
stop() {
    /usr/bin/killall -9 php5-cgi
}
 
case "$1" in
    start)
      start
      RETVAL=$?
  ;;
    stop)
      stop
      RETVAL=$?
  ;;
    restart|reload)
      stop
      start
      RETVAL=$?
  ;;
    *)
      echo "Usage: fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

Pour l’activer :

sudo chmod 755 /etc/init.d/php5-fcgi
sudo update-rc.d php5-fcgi defaults

D’ailleurs à ce propos, Olivier (de neokraft.net) nous avertit :

Maintenant vos processus PHP se lanceront au démarrage. Un petit mot sur deux paramètres importants. Les processus PHP en CGI ont une tendance connue à planter de manière régulière. C’est à ceci que sert à la variable PHP_FCGI_MAX_REQUESTS que nous avons mis à 500. Tous les 500 cycles, chaque processus PHP sera relancé. Enfin, PHP_FCGI_CHILDREN=2 indique de lancer deux processus PHP. Vous pouvez en mettre plus mais n’oubliez pas que plus il y en a plus vous consommerez de mémoire.

Une fois en production, vous pourriez constater que c’est un peu lent. L’installation du paquet php5-xcache améliore grandement les performances de PHP. Consultez le site de Xcache pour en savoir plus. J’ai doublé la taille du cache (xcache.size dans /etc/php5/conf.d/xcache.ini) mais ne perdez pas de vue que cette taille est appliquée à chaque processus PHP (soit 2 fois 32M dans mon cas).

Dorénavant, le petit script se chargera de démarrer et d’arrêter PHP 🙂

Installation et configuration de Nginx

sudo apt-get install nginx

Nginx est fourni sous Debian avec un début de configuration pour FastCGI. Nous allons la compléter. Votre fichier /etc/nginx/fastcgi_params doit ressembler à ceci :

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
 
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
 
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
 
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Ce sont surtout les dernières lignes qui sont importantes !

Test du serveur

Plaçons un fichier intitulé test.php dans /usr/share/nginx/www/ avec le contenu suivant :

<?php phpinfo(); ?>

Modifions le vhost par défaut (/etc/nginx/sites-available/default) comme suit :

server {
    listen   80;
    server_name localhost;
    root /usr/share/nginx/www;
    index index.php index.html;
 
    access_log  /var/log/nginx/localhost.access.log;
 
    location ~ ^(.+\.php)(/.*)?$ {
        fastcgi_pass  localhost:9000;
        include /etc/nginx/fastcgi_params;
    }
}

Redémarrer Nginx et php5-fcgi, vous devriez pouvoir accéder à votre serveur et à la configuration de PHP !

Premier Test Nginx

Bien, il ne nous reste plus que phpLDAPadmin !

phpLDAPadmin

Installation

Seulement deux petits paquets à installer :

sudo apt-get install phpldapadmin php5-ldap

Attention ! Apt a tendance à vous installer apache2 en paquets suggérés… Faites gaffe –‘

Configuration du vhost Nginx

Comme je n’ai pas de configuration particulière, je me contente de créer un vhost :

sudo vim /etc/nginx/sites-available/phpldapadmin
 
server {
    server_name ldap.example.com;
    listen 80;
 
    # document root
    root /usr/share/nginx/www;
    index index.php index.html index.htm;
 
    # application: phpldapadmin
    location /phpldapadmin {
            alias /usr/share/phpldapadmin/htdocs;
            index index.php index.html index.htm;
    }
    location ~ ^/phpldapadmin/.*\.php$ {
            root /usr/share;
            if ($request_filename !~* htdocs) {
                    rewrite ^/phpldapadmin(/.*)?$ /phpldapadmin/htdocs$1;
            }
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            include fastcgi_params;
    }
 
    # logging
    error_log  /var/log/nginx/phpldapadmin.error.log;
    access_log /var/log/nginx/phpldapadmin.access.log;
}

On l’active et on recharge Nginx :

sudo ln -vs /etc/nginx/sites-available/phpldapadmin /etc/nginx/sites-enabled/phpldapadmin
sudo service nginx reload

Et normalement l’interface est maintenant accessible !

Interface OpenLDAP

Il nous reste cependant un chouilla de configuration…

Configuration de phpLDAPadmin

Ben oui il faut bien qu’on lui explique comment accéder à notre annuaire LDAP. Ça se passe dans /etc/phpldapadmin/config.php. Vous pouvez modifier :

$servers->setValue('server','name','Un super titre');
$servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');

Et là normalement, tout est bon 🙂

Pfiou, près de cinq heures et demie pour réaliser cet article ! J’espère que ça vous a plu. Dans le prochain épisode, je peuplerai ce nouvel annuaire. Nous verrons ensuite comment mettre en place un CAS SSO afin de centraliser l’authentification des utilisateurs.

Si vous avez des questions, j’essaierai d’y répondre via les commentaires 🙂

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email