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.