La configuration est donnée pour un serveur Linux fonctionnant avec Ubuntu 16.04 LTS Server. Elle peut bien sûr être adaptée à d’autres distributions Linux. Par contre, rien n’a été prévu pour faire fonctionner l’application directement dans une plate-forme windows, même si, en théorie, cela devrait être possible.

Configurer Apache

Les modules suivants doivent être activés :

a2enmod ssl
a2enmod headers
a2enmod rewrite

Modules PHP nécessaires :

  • php-mbstring
  • php-pgsql
  • php7.0-xml ou php-simplexml
  • php-xdebug pour les phases de mise au point
  • php-curl pour l’identification via un serveur CAS.

La génération des étiquettes nécessite les paquetages suivants :

  • php-gd
  • fop (qui inclut des bibliothèques java)

Le stockage et l’affichage des photos nécessite :

  • php-imagick

Installer PHP7 dans une distribution Debian 8

Pour des questions de performance et d’obsolescence prochaine des versions 5 de PHP, il vaut mieux installer la version 7 de PHP.

Dans la distribution Debian 8, seule la version PHP5 est disponible : il faut rajouter le dépôt dotdeb pour pouvoir récupérer la version 7.

Les commandes indiquées ici sont issues du document créé par Stanislas Lange (https://angristan.fr/installer-php-7-debian-8-jessie-depot-dotdeb).

Ajoutez le dépôt Dotdeb :

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt update

Supprimez php5 :

apt-get autoremove --purge php5*

Installez ensuite les paquets correspondants à PHP7 :

apt install php7.0 libapache2-mod-php7.0 php7.0-pgsql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-mbstring \
 php7.0-xml php7.0-zip php7.0-imagick php7.0-xdebug fop

Configurer l’antivirus

Les pièces téléchargées peuvent être analysées avec l’antivirus CLAMAV. Dans un premier temps, Clamav doit être installé. Le plus simple est d’utiliser les paquetages de la distribution.

Suivez les instructions du document https://wiki.archlinux.org/index.php/ClamAV  pour l’installation et la vérification du bon fonctionnement.

Configurer l’hôte virtuel et SSL

Activer le mode SSL

L’application ne fonctionne qu’en mode SSL, les cookies de session n’étant pas transmis sur des liens non chiffrés. Voici un exemple de configuration à insérer dans le fichier /etc/apache2/sites-available/default-ssl

<Directory /var/www/html>
 Options FollowSymLinks MultiViews
 AllowOverride all
 Order allow,deny
 allow from all
 </Directory>

SSLCompression off
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on

La chaîne SSLCipherSuite est donnée à titre d’exemple (et est valable pour Apache2 v. 2.2.22 et Openssl 1.0.1t). D’autres configurations plus modernes peuvent être implémentées. L’ANSSI a édité un document récapitulant les entêtes à utiliser (http://www.ssi.gouv.fr/uploads/2016/09/guide_tls_v1.1.pdf).
Il existe également un configurateur, mis à disposition par la fondation Mozilla (https://mozilla.github.io/server-side-tls/ssl-config-generator), qui permet de définir correctement ces paramètres en fonction du serveur et du niveau de compatibilité recherché.

Activez ensuite le mode SSL dans Apache :

chmod -R g+r /etc/ssl/private
usermod www-data -a -G ssl-cert
a2ensite default-ssl
service apache2 restart

Déclarer le site virtuel dans Apache

Créez le fichier /etc/apache2/sites-available/collec.conf, avec le contenu suivant :

<VirtualHost *:80>
# redirection en https
 ServerName collec.masociete.com
 ServerPath /collec.masociete.com
 RewriteEngine On
 RewriteRule ^ https://collec.masociete.com%{REQUEST_URI} [R]
</VirtualHost>
<VirtualHost *:443>
 ServerName collec.masociete.com
 ServerPath /collec.masociete.com
 SSLEngine on
# chemin d'acces aux certificats
# Cle publique :
 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
# cle privee :
 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
# Activer la ligne suivante si vous disposez d'un certificat d'une
# autorite de certification
# SSLCACertificateFile /etc/ssl/certs/cacert.crt
# Chemin d'acces a l'application
 DocumentRoot /var/www/html/collec
</VirtualHost>
<Directory /var/www/html/collec>
 RewriteEngine On
 RewriteBase /
 RewriteCond "/%{REQUEST_FILENAME}" !-f
 RewriteCond "/%{REQUEST_FILENAME}" !-d
 RewriteRule "(.*)" "/index.php?$1" [PT,QSA]
</Directory>

Modifiez le nom du serveur, vérifiez le chemin d’accès à l’application et les certificats utilisés.

Une fois la configuration corrigée, lancez les commandes suivantes :

a2ensite collec
service apache2 reload

Cas particulier de l’identification en mode HEADER

Si vous identifiez vos utilisateurs derrière un proxy d’identification, comme LemonLdap par exemple, vous devrez limiter l’accès de l’application uniquement au proxy. La commande Directory devient donc :

 <Directory /var/www/html>
 Options FollowSymLinks MultiViews
 AllowOverride all
 Order allow,deny
 allow from 10.1.2.3
 </Directory>

10.1.2.3 correspond à l’adresse IP du serveur proxy d’identification.

Configurer le dossier d’installation

Organisation de l’arborescence

Cas général : une seule instance hébergée dans le serveur

  • Créez un dossier collecApp dans /var/www.
  • dans ce dossier, créez un dossier correspondant à la version courante, par exemple 1.2, ainsi que le dossier param
  • décompressez dans ce dossier le code de l’application
  • recopiez le fichier collecApp/1.2/param/param.inc.php.dist vers param/param.inc.php
  • modifiez le fichier param.inc.php pour l’adapter à votre instance, notamment si vous voulez vous connecter à partir d’un annuaire ldap, ou si la base de données n’est pas hébergée dans le même serveur
  • dans collecApp/1.2/param, créez un lien vers le fichier collecApp/param/param.inc.php
  • dans collecApp, créez un lien vers la version courante (1.2), que vous appellerez collec
  • dans /var/www/html, créez un lien vers /var/www/collecApp/collec (le lien que nous venons de créer)

Par ce mécanisme, le site virtuel déclaré précédemment pointe vers /var/www/html/collec, qui lui-même pointe vers /var/www/collecApp/collec, qui lui-même pointe vers la version courante. Cela permet de gérer les nouvelles versions assez simplement. Pour en installer une nouvelle :

  • dans collecApp, créez un nouveau dossier, par exemple 1.3, et décompressez la nouvelle version du code
  • dans 1.3/param, créez un lien vers ../param/param.inc.php, pour récupérer les paramétrages locaux
  • supprimez le lien collec dans collecApp (qui pointait vers 1.2)
  • recréez le lien collec pour qu’il pointe maintenant vers 1.3

Cas particulier : faire cohabiter plusieurs instances avec le même code

Il est possible d’utiliser le même code applicatif pour alimenter des bases de données différentes (ou des données stockées dans des schémas différents). Cette fonctionnalité est basée sur l’attribution d’entrées DNS différentes.

 

Dans le paramétrage de l’alias DNS (en principe, dans /etc/apache2/sites-available), l’application pointe vers le dossier /var/www/appliApp/appli1/bin. /var/www correspond à la racine du site web, appliApp au dossier racine de l’application, appli1 au dossier spécifique de l’alias DNS. Ce dossier appli1 ne contient que deux fichiers : param.ini, qui contient les paramètres spécifiques, et bin, qui est un lien symbolique vers le dossier ../bin.

Le dossier ../bin (donc, dans /var/www/appliApp) est lui aussi un alias qui pointe vers le code réel de l’application, ici code_appli} Le fichier param.inc.php doit contenir les commandes suivantes pour que le fichier param.ini soit correctement chargé selon le contexte :

$chemin = substr($_SERVER["DOCUMENT_ROOT"],0, strpos($_SERVER["DOCUMENT_ROOT"],"/bin"));
$paramIniFile = "$chemin/param.ini";

Le fichier param.ini sera cherché dans le dossier parent du code de l’application, c’est à dire soit dans appli1, soit dans appli2 dans cet exemple. Il suffit qu’il contienne les paramètres adéquats pour rendre l’application utilisable dans des contextes différents à partir du même code initial.

Le fichier param.ini est le dernier qui est traité par l’application pour récupérer les paramètres. Ceux-ci sont lus dans l’ordre suivant :

param/param.default.inc.php > param/param.inc.php > ../param.ini

param.ini contiendra les entrées spécifiques liées au DNS utilisé pour accéder à l’application, en principe tout ou partie de celles-ci  :

APPLI_titre="Gestion des collections d'EABX"
BDD_schema=col, public, gacl
BDD_login=compte_de_connexion
BDD_passwd=mot_de_passe_de_connexion
BDD_dsn=pgsql:host=serveur;dbname=base_de_donnees;sslmode=require
GACL_aco=col
APPLI_code=proto

Si un libellé contient une apostrophe, la chaîne doit être insérée dans des guillemets doubles, comme ici pour la variable APPLI_titre.

Droits à attribuer au serveur web

Le serveur web doit pouvoir accéder en lecture à l’ensemble des fichiers de l’application, et en écriture à deux dossiers :

  • display/templates_c : fichier utilisé par Smarty pour compiler les modèles de documents HTML ;
  • temp : dossier de génération des images et des fichiers temporaires.

Voici un exemple de script utilisé pour positionner les droits :

#!/bin/bash
cp ../param/* param/
chmod -R 770 .
setfacl -R -m u:www-data:rx .
setfacl -R -m d:u:www-data:rx .
mkdir display/templates_c
setfacl -R -m u:www-data:rwx display/templates_c
setfacl -R -m d:u:www-data:rwx display/templates_c
setfacl -R -m u:www-data:rwx temp
setfacl -R -m d:u:www-data:rwx temp
setfacl -R -m d:o::- .
rm -Rf database
rm -Rf test
rm -f param.ini

 

Dans cet exemple, le dossier ../param contient le fichier param.inc.php, qui dispose des paramètres spécifiques à l’implémentation.

Le script est à lancer à la racine du dossier contenant l’application.