Catégories
Blog Open-source Planet-libre Systeme Web

WordPress et le trop plein de fichiers sess_*

Hier, plusieurs lecteurs (merci à eux :)) m’ont signalés que le message suivant s’affichait en haut de mon blog (sous WordPress 3.1.3):

Warning: session_start() [function.session-start]: open(/var/lib/php5/sess_7cad11067bb359c89ee47b9e692e47bf, O_RDWR) failed: No space left on device (28) in/www/wp-content/plugins/twitconnect/twitconnect.php on line 95

Ce message n’apparaissait que pour les lecteurs non authentifiés et uniquement sur certaines pages. Dans une premier temps j’ai donc décidé de désactivé le plugin incriminé dans le message d’erreur (TwitConnect qui permet de s’authentifier sur le blog avec son compte Twitter). J’ai ensuite regarder l’espace disque de mon serveur sans voir de problème. C’est en allant regarder les fichiers dans le répertoire /var/lib/php5 que j’ai commencer à comprendre pourquoi le plugin en question n’arrivait plus à générer de fichiers de sessions PHP (les fameux fichier sess_*). Il y avait en effet plus de 200.000 fichiers de ce type dans ce répertoire. On arrivait donc en limite maximale du nombre de fichiers par sous répertoire sous GNU/Linux en ext3.

Le problème vient sûrement d’un des plugins que j’utilise qui doit créer ces fichiers de sessions sans jamais les purger. Je suspecte (sans avoi de confirmation) le plugin TwitConnect et j’ai donc ouvert un incident sur le forum officiel du plugin.

Pour ne plus avoir de mauvaises surprises dans le futur, j’ai donc mis en place dans la crontab root journalière une commande qui va effacer les fichiers de sessions de plus de deux jours:

find /var/lib/php5/ -type f -atime +2 -name ‘sess_*’ -exec rm -f {} \;

Si vous utilisez également le plugin WordPress TwitConnect, je vous conseille donc de jeter un oeil sur ce répertoire et le nombre de fichiers sess_*.

Pour obtenir le nombre de fichier dans ce répertoire il suffit de saisir la commande suivante:

sudo ls -l /var/lib/php5/ | wc -l

En journée (après la purge de la nuit) je tourne autour des 45.000 fichiers (environ 25 nouveaux fichiers par minutes, mais cela dépend du nombre de visites non authentifiées sur votre blog…).

Catégories
Blog Open-source Planet-libre Reseau Systeme

Sécuriser son blog WordPress #2

Dans ce deuxième billet, nous allons aborder la pierre angulaire de la sécurisation de votre site/blog: la sécurisation du couple infernal Apache/PHP.

Bien qu’il existe d’autres serveurs Web (par exemple le très rapide NGinx ou le très simple Cherokee), Apache reste, à ce jour, le plus répandu. Un des reproche que l’on peut lui faire est sa lourdeur de configuration. Cette lourdeur et l’utilisation de fonctions pas forcement utiles à votre site peut rapidement entraîner des failles de sécurité. Nous allons donc détailler la sécurisation du serveur Web ainsi que celle du moteur de langage PHP qui est utilisé par WordPress.

Je vous rappelle que cet article est découpé en plusieurs billets (vous êtes en train de lire le #2):

Cette série de billets a été co-écrite avec Jérémie Marguerie étudiant à EPITA (merci à lui !).

Serveur Web Apache

Sécuriser l’installation par défaut d’Apache2

Apache est développé en tenant compte de la sécurité mais dévoile, dans le header HTTP, son identité (son nom et son numéro de version) à chaque client qui se connecte. Ne pas divulguer ces informations permet d’éviter aux scripts kiddies de connaitre directement les failles connues pour la version d’Apache utilisée et peut compliquer le travail des crackers.

Pour cacher ces informations aux clients HTTP, il suffit d’éditer le fichier /etc/apache2/conf.d/security et d’y ajouter/modifier les variables suivantes:

ServerTokens Prod
ServerSignature Off
TraceEnable On

Module de securité IDS pour Apache

Il existe dans Apache un module optionnel nommé ModSecurity2 qui permet de détecter et de protéger son serveur contre des attaques touchant vos applications Web (notamment les « SQL injections », « cross-site scripting », « path traversal attacks »…).

On commence par l’installation de mod-secure:

sudo aptitude install libapache2-mod-security2

Par défaut, aucune règle n’est appliquée. Il faut donc partir du fichier de configuration qui est donné en exemple:

sudo cp /usr/share/doc/mod-security-common/examples/modsecurity.conf-minimal /etc/apache2/conf.d/mod-security.conf

On édite ensuite le fichier /etc/apache2/conf.d/mod-security.conf:

# Basic configuration options
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

# Handling of file uploads
# TODO Choose a folder private to Apache.
SecUploadDir /tmp/
SecUploadKeepFiles Off

# Debug log
SecDebugLog /var/log/apache2/modsec_debug.log
SecDebugLogLevel 0

# Serial audit log
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^5
SecAuditLogParts ABIFHZ
SecAuditLogType Serial
SecAuditLog /var/log/apache2/modsec_audit.log

# Maximum request body size we will
# accept for buffering
#SecRequestBodyLimit 131072
SecRequestBodyLimit 8192000

# Store up to 128 KB in memory
SecRequestBodyInMemoryLimit 131072

# Buffer response bodies of up to
# 512 KB in length
SecResponseBodyLimit 524288

# Verify that we’ve correctly processed the request body.
# As a rule of thumb, when failing to process a request body
# you should reject the request (when deployed in blocking mode)
# or log a high-severity alert (when deployed in detection-only mode).
SecRule REQBODY_PROCESSOR_ERROR « !@eq 0 » \
« phase:2,t:none,log,deny,msg:’Failed to parse request body.’,severity:2 »

# By default be strict with what we accept in the multipart/form-data
# request body. If the rule below proves to be too strict for your
# environment consider changing it to detection-only. You are encouraged
# _not_ to remove it altogether.
SecRule MULTIPART_STRICT_ERROR « !@eq 0 » \
« phase:2,t:none,log,deny,msg:’Multipart request body \
failed strict validation: \
PE %{REQBODY_PROCESSOR_ERROR}, \
BQ %{MULTIPART_BOUNDARY_QUOTED}, \
BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
DB %{MULTIPART_DATA_BEFORE}, \
DA %{MULTIPART_DATA_AFTER}, \
HF %{MULTIPART_HEADER_FOLDING}, \
LF %{MULTIPART_LF_LINE}, \
SM %{MULTIPART_SEMICOLON_MISSING}, \
IQ %{MULTIPART_INVALID_QUOTING}' »

# Did we see anything that might be a boundary?
SecRule MULTIPART_UNMATCHED_BOUNDARY « !@eq 0 » \
« phase:2,t:none,log,deny,msg:’Multipart parser detected a possible unmatched boundary.' »

On relance ensuite Apache pour prendre en compte le plugin:

sudo /etc/init.d/apache2 restart

Ce module contient un ensemble d’expressions rationnelles dont l’objectif est de bloquer les requêtes jugées dangereuses. Il bloquera une partie des tentatives de piratage. C’est  tout de même une barrière de protection faillible mais qui peut empêcher l’exploitation de certaines failles. Dans tout les cas, cela n’empêche pas le développeur de coder correctement, en prenant en compte la sécurité au moment du développement des sites.

Module anti DOS

Nous allons installer le module Apache mod_evasive qui permet d’atténuer les attaques DOS faite en utilisant le protocole HTTP en bloquant les adresses IP des clients trop gourmand, c’est à dire ceux qui demandent trop rapidement des pages webs.

Contrairement à ce que l’on peut lire sur certains sites, ce module ne protège pas des DDOS, seulement des DOS (lire ici une explication des attaques DOS et DDOS). Autrement dit, il bloque les reqêtes venant d’une adresse IP (DOS).

Si un très grand nombre d’IPs font une seule requête : votre serveur sera saturé et le mod_evasive n’aura pas servi (DDOS). Bloquer les DDOS est très difficile car les requêtes sont difficilement reconnaissables des requêtes autorisées.

On commence par installer le module:

sudo aptitude install libapache2-mod-evasive

On édite le fichier /etc/apache2/conf.d/mod-evasive:

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>

C’est la configuration par défaut qui va bloquer pendant 10 secondes (DOSBlockingPeriod) les requêtes HTTP venant de l’adresse IP source si une des assertions suivantes est vérifiée:

  • il y a plus de 2 requêtes (DOSPageCount) sur la même page dans un intervalle de 1 seconde (DOSPageInterval)
  • il y a plus de 50 requêtes (DOSSiteCount) sur l’ensemble du site dans un intervalle de 1 seconde (DOSSiteInterval)

On relance ensuite Apache pour prendre en compte le plugin:

sudo /etc/init.d/apache2 restart

Sécurisation du moteur PHP

PHP est un langage interprété, largement utilisé pour générer dynamiquement des pages HTML. C’est le langage utilisé par le moteur de CMS WordPress. La génération des pages de votre blog se faisant directement sur votre serveur, il est important de protéger l’environnement d’exécution des scripts PHP.

Il est donc conseillé d’utiliser suphp. Il est relativement facile à installer et permet d’exécuter vos scripts PHP sous un utilisateur autre que www-data et donc protéger votre système.

Cela permet aussi de servir plusieurs sites internet sur un même serveur. Si un pirate atteint un site, il ne pourra pas toucher aux autres.

Ce module fournit aussi la possibilité de disposer d’un fichier PHP.ini par site web, et offre donc plus de flexibilité que l’installation standard de PHP.

La sécurité a néanmoins un coup: la performance. Attendez vous à des pertes de performances sur vos applications. Dans le cas d’une application codée correctement et d’un serveur non surchargé, cette perte devrait cependant être minime.

Il est également possible de désactiver certaines fonctions sensible de PHP (system, exec…) en éditant le fichier php.ini (voir exemple dans l’étape n°3 de ce billet).

Pour installer  suPhp sur votre serveur je vous conseille la lecture de cet article. (si vous voulez/devez faire cohabiter deux versions de PHP, par exemple la 4 et la 5, vous pouvez également consulter ce billet).

Conclusion (temporaire)

On dispose donc maintenant d’un système et d’un serveur Web sécurisé. Il ne reste plus qu’à attendre la suite de cette série de billets pour s’attaquer à la sécurisation du moteur de blogging WordPress.

Catégories
Developpement Open-source

Installation pas à pas d’Eclipse sous GNU/Linux

Je ne sais pas vous mais l’installation et la configuration d’Eclipse (l’environnement de développement libre par référence) en utilisant les « repos apt » d’Ubuntu est toujours un grand moment de solitude. Il n’y a qu’a voir le peu de clarté de la page de documentation sur Ubuntu-fr pour s’en rendre compte.

Nous allons donc essayé de détailler l’installation d’une version récente d’Eclipse (3.4.1 au moment de l’écriture de ce billet) sur une distibution Ubuntu 8.10.

Avant de commencer…

Eclipse est devenu avec le temps et le succès une boîte à outil comportant de nombreux modules permettant de le customiser en fonctions de vos besoins. Par exemple, un développeur Java n’aura pas forcement besoin des mêmes outils qu’un développeur C…

Eclipse propose donc des installateurs pre-packagés. Pour choisir celui qui vous convient le mieux, ce tableau pourra vous aider.

Il faut ensuite se rendre sur cette page et sélectionner le package/operating system adapté à vos besoins.

Dans la suite de ce billet, je prendrai comme package de référence: « Eclipse IDE for C/C++ Developers » (et oui je suis de la vieille école ;)) pour Linux/32 bits.

Installation d’Eclipse

On commence par télécharger le package dans le répertoire /usr/src (l’archive au format tar.gz fait environ 68 Mo pour cette version).

cd /opt

sudo tar zxvf /usr/src/eclipse-cpp-ganymede-SR1-linux-gtk.tar.gz

cd /opt/eclipse

sudo wget http://www.bearfruit.org/files/eclipse-icon-clean.svg

Il faut ensuite créer un nouveau lanceur dans le menu Applications de Gnome:

  • bouton droit sur le « menu Applications »
  • « Editer les menus »
  • menu « Programmation »
  • Click sur « + Nouvel élément »

Il ne reste plus qu’a lancer l’application via le menu « Applications/Programmation/Eclipse ».

Ajout de nouveaux plugins

Plugin SVN (Subeclipse)

Pour le versionning SVN est le remplacant de CVS. Il faut installer un plugin complémentaire pour qu’Elipse puisse aller chercher des sources sur un serveur SVN.

Pour installer le plugin SVN Subeclipse, j’ai suivi ce tutoriel.

Liste des plugins à installer sur ce screenshot:
Subeclipse

Plugin PHP (PDT)

J’ai parfois la faiblesse de coder en Perl/PHP, là aussi ces languages nécessitent l’installation de plugins (PDT pour PHP et EPIC pour Perl).

J’ai suivi ce tutoriel pour l’installation de PDT 2.0 et celui-ci pour EPIC.

Catégories
Blog Web

Apache, MySQL et PHP sur MacOS X

Je souhaite faire évoluer mon blog, notamment au niveau du thème. Pour cela, j’hésite encore entre créer mon propre thème (en suivant par exemple le très bon tutorial de Fran6) ou bien en modifiant un thème existant à mes besoins.

Dans les deux cas, j’ai besoin d’un serveur de développement pour installer WordPress avec le nouveau thème. Plusieurs solutions s’offrait à moi:

  • créer une deuxième arborescence sur mon serveur avec une nouvelle base de donnée WordPress.
  • utiliser un serveur gratuit (commme mon hébergement chez Free).
  • héberger un serveur directement sur mon PC.

J’ai donc choisi ce dernier choix pour des raisons de performances et aussi pour me laisser la possibilité de travailler sur ce projet même sans connection internet (si si ca existe encore des zones blanches).

Voici donc un petit tutorial pour installer un serveur de developpement WordPress sous un Mac OS X.

Pour cela, j’ai installé MAMP sur mon Macbook. En deux cliques de souris on installe Apache (avec support PHP 4 ou 5) et MySQL (avec phpMyAdmin).

Lors de l’installation, il faut choisir la version standard et pas la pro:

En allant dans le répertoire d’installation, on a même droit (en cadeau bonux) à un petit Widget pour controler le status des services.

Par la suite, il reste à installer WordPress dans le sous répertoire htdocs (/Applications/MAMP/htdocs) et à configurer le fichier wp-config.php:

...
define('DB_NAME', 'wordpress'); // Le nom de la base de donnees
define('DB_USER', 'root'); // Votre identifiant MySQL
define('DB_PASSWORD', 'root'); // ...et votre mot de passe
define('DB_HOST', 'localhost:8889'); // Dans la plupart des cas, vous n'aurez pas a modifier cette ligne
...

On accéde au serveur par l’adresse: http://localhost:8888/wordpress/
L’administration se fait par l’adresse: http://localhost:8888/wordpress/wp-admin/

Nous voila donc avec un beau serveur de développement pour tester les nouveaux thèmes et plugins.
A bientôt pour la suite des aventures de Nicolargo à la découverte du thème parfait.

Catégories
Systeme Web

Installation serveur Web Apache sous FreeBSD

…suite du post sur l’installation de FreeBSD, avec la mise en place d’un serveur Web Apache. Nous partons donc sur l’hypothése ou l’on a un système à jour, non seulement au niveau du noyau mais également au niveau des ports.

On ouvre donc un terminal en root.

Puis on installe Apache (version 2.2.4 au moment de l’écriture de ce post) depuis les ports FreeBSD:

# cd /usr/ports/www/apache22
# make install
… la compilation va prendre un certain temps… bon café…

Une fois la compilation terminé, il faut automatiser le lancement du daemon HTTP au démarrage du serveur. Pour cela il faut ajouter ajouter deux lignes au fichier /etc/rc.conf:

# echo ‘apache22_enable= »YES »‘ >> /etc/rc.conf

Il faut ensuite éditer le fichier /usr/local/etc/apache22/httpd.conf pour le faire coller à votre configuration. Il existe un bon nombre de documentations sur le sujet (par exemple: http://httpd.apache.org/docs/2.2/).

# vi /usr/local/etc/apache22/httpd.conf

Vous pouvez tester si votre installation a marché correctement en lancant le serveur Web:

# apachectl start

Puis en ouvrant un navigateur sur l’URL de votre serveur: http://<@IpDeVotreServeur>. Vous devrier avoir la page suivante qui s’affiche:

Le répertoire racine de votre site Web se trouve: /usr/local/www/apache22/data.

En l’état actuel de la configuration, votre serveur ne prendra pas en compte le language PHP. Il faut pour cela installer le module PHP (version 5) pour Apache. Pour cela:

# cd /usr/ports/lang/php5
# make install
… Ne pas oublier de selectionner « Apache » !!! …
# cd /usr/ports/lang/php5-extensions
# make install
… choisir les extensions voulues …
# cd /usr/local/etc/
# cp php.ini-recommended php.ini
… initialisation des variables…

Il faut ensuite configurer Apache pour qu’il prenne en compte PHP. Pour cela éditer le fichier /usr/local/etc/apache22/httpd.conf:

# vi /usr/local/etc/apache22/httpd.conf
Ajouter dans la section <IfModule mime_module>:
AddType application/x-httpd-php .php
Ajouter dans la section <IfModule dir_module>:
DirectoryIndex index.html, index.php

Il ne reste plus qu’a relancer le serveur Apache:

# apachectl stop
# apachectl start

Voili, vous avez un beau système à jour avec une belle version d’Apache…
A bientôt pour l’installation du serveur FTP…