~ read.

Sécuriser un sous-domaine par cookies sous Lighttpd

Pour ceux qui ne le connaîtraient pas encore, Lighttpd (prononcez Lighty) est un serveur web Open Source léger et rapide initialement développé par l'Allemand Jan Kneschke dans l'idée de répondre à au problème : "Comment gérer 10000 connexions en parallèle sur un seul serveur".

Il fait maintenant partie des 10 serveurs web les plus utilisés dans le monde. Il plaît notamment grâce à sa faible consommation de mémoire (par rapport aux autres serveurs web) et sa gestion intelligente de la charge processeur.

Il est notamment beaucoup utilisé pour servir du contenu statique (images, fichiers CSS, javascript, ...) bien qu'il gère également les langages serveur tel que PHP ou Perl via FastCGI. Nous allons voir ici comment sécuriser un sous-domaine grâce aux cookies. Je ne vais cependant pas évoquer la partie qui concerne la configuration du sous-domaine dans Lighttpd.

Avant de passer à la configuration de Lighttpd, il va falloir créer notre cookie. Pour cela vous pouvez utiliser divers outils tel que la Web Developer Toolbar de Firefox, Firecookie (une autre extention Firefox) ou alors Edit This Cookie sous Chrome.

Nous allons voir ici la procédure avec Edit This Cookie. Si vous êtes sous Chrome, vous pouvez l'installer en vous rendant ici : Edit This Cookie. Cliquez ensuite sur "Add to Chrome".

Une fois l'extension installée, vous trouverez un nouveau bouton à droite de votre barre d'outils : edit_this_cookie_icon
Cliquez sur ce bouton, puis "Ajouter un nouveau cookie".

Remplissez les informations comme ceci :

  • Nom : entrez un nom secret pour votre cookie (c'est grâce à lui que Lighttpd saura si l'utilisateur a droit ou non d'accéder au sous-domaine). Je vous conseille - pour plus de sécurité - de choisir une chaine aléatoire. Vous pouvez en générer une avec un générateur de mots de passe, par exemple.
  • Valeur : entrez ce que vous souhaitez, ça n'a pas d'importance ;-).
  • Domaine : ce champ est très important, c'est l'adresse sous laquelle le cookie sera disponible. Il faut donc y entrer l'adresse du sous-domaine à sécuriser.
  • Expiration : c'est la date d'expiration du cookie. J'ai ici juste modifié l'année pour 2030 (ça nous laisse un peu de marge ;-) ).
  • Session : si coché, le cookie sera supprimé à la fin de la session (fermeture du navigateur).
  • Securiser : défini si le cookie ne doit être transmis que lors de connexions sécurisées (HTTPS). Si coché, le cookie ne sera pas disponible lors de l'accès au sous-domaine via HTTP.

edit_this_cookie_add

Il ne vous reste plus qu'à cliquer sur le bouton "Valider les changements de cookies".

Configuration de Lighttpd

Maintenant que notre cookie est créé, il ne nous reste plus qu'à configurer Lighttpd pour n'afficher le sous-domaine qu'aux utilisateurs autorisés (ceux qui possèdent notre fameux cookie ;-) ).

Rendez-vous dans le fichier où est configuré votre sous-domaine dans Lighttpd :

nano /etc/lighttpd/conf-enabled/sousdomaine.leeroy.me.conf

La variable qui contient les cookies dans Lighttpd s'appèle $HTTP["cookie"], il nous suffit donc d'une petite condition pour savoir si l'utilisateur est autorisé ou non à accéder au sous-domaine :

$HTTP["cookie"] =~ "moncookiesecret" {  
    # L'utilisateur est autorisé 
} else $HTTP["cookie"] !~ "moncookiesecret" { 
    # L'utilisateur n'est pas autorisé 
}

En complétant la condition présentée ci-dessus, vous pouvez par exemple rediriger l'utilisateur sur Google ou votre site principal si il n'est pas autorisé :

$HTTP["host"] =~ "sousdomaine.leeroy.me" {  
    $HTTP["cookie"] =~ "moncookiesecret" { 
        # L'utilisateur est autorisé : on lui affiche le sous-domaine
        server.name = "sousdomaine.leeroy.me"
        server.document-root = "/chemin/vers/les/fichiers/du/sous/domaine/"
    } else $HTTP["cookie"] !~ "moncookiesecret" {
        # L'utilisateur est n'est pas autorisé : on le redirige sur Google
        url.redirect = ( "^(.*)" => "http://www.google.com" )
    }
}

Vous pouvez également - si vous souhaitez brouiller les pistes des hackers - utiliser le mod_rewrite pour afficher une page qui n'existe pas et donc retourner une erreur 404 au lieu de rediriger sur Google :

url.rewrite-once = ( "^(.*)" => "/une/page/innexistante.html" )

Et Apache alors ?

Remarque : Je n'ai pas pu testé cette solution pour Apache. Si quelqu'un le fait et rencontre des problèmes n'hésitez pas à me le signaler.

C'est bien sûr également possible sur Apache, il vous suffit d'ajouter les lignes suivantes dans le fichier .htaccess de votre sous-domaine pour que les utilisateurs non autorisés soient redirigés sur Google :

RewriteCond %{HTTP_COOKIE} !^.*moncookiesecret.*
RewriteRule ^.* http://www.google.com [L]

Si vous souhaitez plutôt - comme évoqué plus haut - afficher une erreur 404 aux utilisateurs non autorisés, ajoutez les lignes suivantes à votre fichier .htaccess

RewriteCond %{HTTP_COOKIE} !^.*moncookiesecret.*
RewriteRule ^.* /une/page/innexistante.html [L]

La fin ?

Il ne vous reste maintenant plus qu'à essayer d'accéder à votre sous-domaine avec et sans cookie pour être sûr qu'il sois bien sécurisé.

J'espère que cet article vous aura été utile. Si vous avez des commentaires ou suggestions n'hésitez pas à m'en faire part via les commentaires ou directement par mail.