A propos Charles-Antoine Mathieu

Administrateur Système chez OVH. Ancien Étudiant et Formateur de SUPINFO Lyon, expert Systèmes, réseau et sécurité. Appréhender, optimiser et sécuriser les systèmes d'information est devenu pour moi une passion et un métier.

Routage et QoS sous Linux, utiliser DSCP

Il est toujours intéressant de pouvoir choisir une interface de sortie lorsque qu’on dispose de plusieurs accès internet. Nous allons voir dans un premier temps comment mettre en place l’infrastructure avec un serveur (routeur) GNU/Linux et ensuite s’intéresser de plus près à la QoS et plus particulièrement à DSCP.

Tout d’abord l’environnement dont nous disposons est donc conipstitué d’un serveur sous Debian 6, d’un accès Internet fibre optique, un accès ADSL, plusieurs accès VPN.

La configuration du serveur en mode routeur tout d’abord, comme vous le savez surement le noyau Linux est capable de réaliser une myriade d’opérations de routage et de manipulation de paquets.

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE

Nous allons cependant devoir faire quelques réglages. Il faut déjà bien comprendre que pour réaliser cette opération nous allons avoir besoin de plusieurs tables de routage, car qui dit interface de sortie sur Internet dit route par défaut. Une table de routage indique l’adresse du prochain routeur à joindre pour acheminer le paquet vers sa destination. La route par défaut d’une table de routage s’applique pour tout les paquets dont la destination finale est inconnue du routeur. C’est typiquement le cas du trafic à destination d’Internet. Nous ne pouvons avoir qu’une seule route par défaut par table de routage, il nous faut donc une table de routage par interface. On va déclarer ces dernières dans le fichier /etc/iproute2/rt_tables.

255 local
254 main
253 default
103 VPNJP
102 VPNUS
101 VPNFR
100 ADSL
0 unspec

Comme on peut le voir Linux utilise déjà 3 tables de routage, main est la table principale, les autres ne sont pas à modifier. Pour voir le contenu d’une table de routage on utilise la commande ip.

ip route show table main
10.100.100.0/30 dev tap0 ... link src 10.100.100.2
10.101.101.0/30 dev tap1 ... link src 10.101.101.2
10.102.102.0/30 dev tap2 ... link src 10.102.102.2
192.168.42.0/24 dev eth0 ... link src 192.168.42.1
192.168.26.0/24 dev eth1 ... link src 192.168.26.1
default via 192.168.42.254 dev eth0

Par défaut si on omet le terme table c’est la table main qui sera manipulée. 192.168.42.254 est l’ip de la box fibre optique, ça sera donc notre interface de sortie par défaut si le trafic ne match aucune règle. Il faut aussi noter que la commande ip route permet l’abréviation aussi la commande précédente peut s’écrire « ip r s t main ». On va maintenant remplir les autres tables de routage. même si il n’y a que la route par défaut qui nous intéresse il est toujours préférable de la remplir complètement pour éviter les mauvaises surprises et permettre au routage du réseau local de fonctionner correctement sur toutes les interfaces.

ip route add table ADSL 10.100.100.0/30 dev tap0
ip route add table ADSL 10.101.101.0/30 dev tap1
ip route add table ADSL 10.102.102.0/30 dev tap2
ip route add table ADSL 192.168.42.0/30 dev eth0
ip route add table ADSL 192.168.26.0/30 dev eth1
default via 192.168.26.254 dev eth1
ip route add table VPNFR 10.100.100.0/30 dev tap0
ip route add table VPNFR 10.101.101.0/30 dev tap1
ip route add table VPNFR 10.102.102.0/30 dev tap2
ip route add table VPNFR 192.168.42.0/30 dev eth0
ip route add table VPNFR 192.168.26.0/30 dev eth1
default via 10.100.100.1 dev tap0

Bien, maintenant il suffit d’ajouter des règles de routage pour choisir la table que l’on veut utiliser. Par exemple on peut rediriger automatiquement tous les paquets provenant de l’ip 192.168.42.42 via la sortie ADSL comme ceci :

ip rule add from 192.168.42.42/32 lookup ADSL

Cependant je veux plus de granularité, j’aimerais pouvoir choisir l’interface de sortie directement sur mon poste client sous Windows 7 / MacOS / Linux. Il est possible d’utiliser le champ IPv4 Type de service (TOS) pour marquer le paquet à travers le réseau ainsi influer sur la décision de routage. Pour remplir ce champ plusieurs possibilité existent, nous allons utiliser DSCP car c’est celle qui est implémentée sous Windows. Sur le serveur nous allons utiliser ces marques pour choisir une table de routage. Malheureusement iproute2 ne gère pas directement DSCP, ce n’est pas grave nous allons utiliser netfilter/iptables qui lui sais reconnaître et manipuler ce champ. Nous allons ainsi marquer le paquet dans le suivi de connexion de netfilter car  iproute2 sait parfaitement matcher des paquet en fonction de ces marques. C’est juste un artifice, rien n’est modifié au niveau du paquet qui conservera sa marque DSCP. Sans vouloir faire un cours sur netfilter/iptables je remet ce schéma sous vos yeux. Nous allons utiliser la table mangle pour modifier les paquets directement en entrée ou en sortie du système.

iptables -t mangle -A PREROUTING -m dscp --dscp 10 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -m dscp --dscp 11 -j MARK --set-mark 11
iptables -t mangle -A PREROUTING -m dscp --dscp 12 -j MARK --set-mark 12
iptables -t mangle -A PREROUTING -m dscp --dscp 13 -j MARK --set-mark 13

Ainsi nous pouvons maintenant nous baser sur cette marque pour créer nos règles de routage.

ip rule add fwmark 10 lookup ADSL
ip rule add fwmark 11 lookup VPNFR
ip rule add fwmark 12 lookup VPNUS
ip rule add fwmark 13 lookup VPNJP

Tout est prêt :) . Il ne nous reste plus qu’à utiliser DSCP pour marquer les paquets directement sur les postes clients et qu’il prennent ainsi la route que l’on à choisi.

Sous Linux rien de plus simple on utilise iptables, ainsi il est possible de tagger le champ TOS des paquet avec la précision que l’on connais déjà. Généralement le module owner est d’une grande aide ici puisqu’il permet de matcher les paquet en fonction de l’application, du processus, du user ou du groupe,…

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 10
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j DSCP --set-dscp 11

Ainsi le trafic SSH à destination du port 22 passera maintenant par l’ADSL OVH qui est plus stable et le traffic web non chiffré à travers le VPNFR pour plus de confidentialité. A vous d’adapter à vos besoins.

Sous Windows rien de bien plus compliqué surtout si vous disposez d’un domaine ActiveDirectory. Si ce n’est pas le cas rendez vous dans la base de registre avec l’outil regedit.exe et créez la clef suivante.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\QoS

A l’intérieur ajoutez une chaîne de type REG_SZ nommée « Do not use NLA » et comme valeur 1. Ceci permet d’appliquer la QoS sur une connexion réseau qui n’est pas associée à un domaine ActiveDirectory.

Maintenant rendez-vous dans la GPMC via l’outil « Modifier la stratégie de groupe locale » et ajoutez vos règles dans « Paramètres Windows / QoS basée sur la stratégie ». La première fois il vous faudra peut-être exécuter la commande gpupdate et redémarrer pour que les modifications soient prisent en compte.

Voila, vous savez tout et vous et vos utilisateurs êtes maintenant capables de demander poliment  une route à votre routeur Linux. Bien entendu il vous est possible d’outre passer leurs choix en utilisant la table mangle, ainsi si un lien venait à tomber, une petite règle iptables et tout le trafic à destination de l’ADSL passera par la fibre ou inversement. L’autre intérêt est que les marque DSCP sont conservées lors du routage, certes pas lors du passage par le FAI et les réseaux ATM ou autres non compatibles avec IP, mais à travers un lien OpenVPN aucun problème, vous pouvez ainsi vous servir de cette marque pour influer sur la décision de routage directement au niveau du point de sortie du VPN.

Lutter contre le SPAM avec DKIM et SPF

Il y a fort longtemps, dans une lointaine galaxie nommée Internet, les serveurs SMTP (Simple Mail Transfer Service) relayaient les e-mails sans poser de questions. Puis les vilains SPAMMEURS ont débarqué et il fallut commencer à tout repenser. Nous allons voir ici comment s’est organisée la lutte contre ces êtres démoniaques et pourquoi il est devenu essentiel de mettre en place des technologies telles que SPF et DKIM pour prouver que les e-mails que vous envoyez proviennent bien de votre serveur SMTP et pas d’un autre.

Quel est le rôle du serveur SMTP dans l’envoi et la réception de mail ? Ce dernier est appelé MTA (Mail Transfer Agent) et il est voué à distribuer les e-mails que vous envoyez à leurs destinataires et à recevoir (stocker d’une manière cohérente sur le serveur) ceux que vous recevez. Le MTA est le seul élément indispensable pour envoyer et recevoir des e-mails, les serveurs POP/IMAP sont des services mis en place pour permettre à l’utilisateur de récupérer les e-mails sur le serveur SMTP à l’aide d’un client (Client lourd : Outlook, Thunderbird, Mail… , Webmail, Smartphone …).

Les serveurs SMTP les plus connus et utilisés sont l’historique Sendmail et ses petits frères Postfix Exim Qmail. Les exemples de configuration que vous pourrez trouver dans la suite de l’article sont issus de Postfix.

Comment le serveur SMTP fait-il pour savoir où acheminer le courrier ? Simple comme bonjour, il interroge la zone DNS du domaine — partie à droite de l’@ dans une adresse mail — qu’il souhaite joindre à la recherche d’un enregistrement MX (Mail Exchanger) qui pointe vers l’IP du serveur mail chargé de collecter le courrier pour ce domaine. Si vous cherchez à envoyer un mail à cam@bibabox.fr, votre serveur SMTP va chercher où envoyer le mail dans la zone DNS de bibabox.fr. Vous pouvez faire le test vous-même à l’aide de la commande Nslookup.

> nslookup -q=mx bibabox.fr

bibabox.fr MX preference = 1, mail exchanger = mx0.ovh.net
bibabox.fr MX preference = 100, mail exchanger = mxb.ovh.net

Vous noterez la présence de deux enregistrements MX qui diffèrent par leur « préférence » ou « priorité ». Ici non plus rien de bien sorcier, on commence par essayer de joindre le serveur avec la priorité la plus basse, et s’il ne répond pas on passe au serveur avec une priorité plus haute jusqu’au premier serveur qui répond. A noter qu’il serait sûrement préférable de laisser tomber les enregistrements MX au profit des enregistrements SRV, qui proposent plus de fonctionnalités, comme la répartition de charge ou encore la possibilité de spécifier le port où est hébergé le service.

Pour l’image, le MTA c’est un peu la poste, la société s’occupe de transférer le courrier d’un bureau de poste (serveur) à un autre en se basant sur votre adresse (e-mail) où le code postal fait office de champ MX permettant de savoir dans quel bureau de poste envoyer le courrier. Le MUA c’est votre facteur, il délivre le courrier qui arrive au bureau de poste dans votre boîte aux lettres (Ordinateur, Téléphone, PDA …). L’intérêt de l’échange de mail sur l’échange postal c’est que l’on peut facilement recevoir le courrier à plusieurs endroits simultanément en laissant une copie du message sur le serveur pour une durée plus ou moins longue.

Tout comme la poste, par défaut le serveur SMTP ne cherche pas à vérifier l’adresse de l’émetteur, ni plus qu’il ne cherche à authentifier la personne utilisant le service. Une bagatelle pour les Spammeurs et autres individus malveillants agissant sur la toile. La première chose à faire est donc d’implémenter les mécanismes de sécurité dont vous avez besoin afin que votre serveur SMTP ne devienne pas un relais-ouvert utilisable par le premier venu. Les systèmes de configuration des serveurs mails disposent de mécanismes permettant d’accepter ou de rejeter l’envoi d’un mail en se basant sur la configuration du client ou sur la destination. Les directives de configuration smtpd_client_restrictions ou smtpd_recipient_restrictions (Postfix) permettent par exemple de faire ce travail. C’est pourquoi la valeur de ce genre de directives est extrêmement importante et ne doit en aucun cas être laissée au hasard. Si votre serveur SMTP est ouvert sur internet, il vous faudra aussi certainement mettre en place un mécanisme d’authentification tel que SASL, afin que seuls les utilisateurs disposant d’une boîte mail — et donc d’un couple login/mot de passe associé — sur votre serveur puissent l’utiliser. Bien entendu, comme en SMTP tout passe en clair et que vous n’avez pas envie que quelqu’un puisse attraper votre mot de passe ou lire les mails que vous envoyez, il faudra mettre en place une surcouche SSL/TLS avec un certificat valide pour avoir enfin un service sécurisé à proposer à vos utilisateurs.

Votre serveur SMTP est maintenant sécurisé et seuls les utilisateurs authentifiés sont autorisés à l’utiliser, le courrier qui en sort peut donc être considéré comme légitime. Mais puisqu’il est possible d’envoyer des mails sans aucune vérification de l’identité de l’expéditeur via n’importe quel serveur non sécurisé, qu’est-ce-qui prouve à votre destinataire que le courrier qu’il vient de recevoir de vous est bien légitime ? Puisque notre serveur est considéré comme digne de confiance, on va donc chercher à établir l’identité du serveur qui a envoyé le message et à vérifier qu’il s’agit bien d’un serveur digne de confiance. C’est exactement le but des enregistrement DNS SPF et DKIM.

SPF (Sender Policy Framework) est une norme de vérification du nom de domaine de l’expéditeur d’un mail, normalisé dans la RFC4408. SPF vise à réduire les possibilités d’usurpation en publiant, dans le DNS, un enregistrement (de type SPF ou, autrefois, de type TXT) indiquant les adresses IP des serveurs qui sont autorisées à envoyer du courrier pour le domaine considéré. Quand le serveur SMTP de destination reçoit le mail, il peut faire une vérification de ce type, auquel cas soit il décide de refuser purement et simplement le mail soit il peut l’accepter tout de même. Il peut encore décider de notifier l’utilisateur — en rajoutant une ligne dans le corps du message par exemple — ou l’administrateur. Plus généralement cela va surtout influer sur le score que l’anti-spam mis en place chez votre destinataire accorde à votre message et c’est ce dernier qui décidera du sort de ce message. La décision à prendre en cas d’échec de la vérification ou d’absence d’enregistrement SPF appartient à la solution mise en place par l’administrateur. Gardez simplement à l’esprit qu’aujourd’hui encore, seul un trop faible pourcentage des domaines comportent un enregistrement SPF avant de rejeter tout les mails qui ne remplissent pas cette condition.

exemple d’enregistrement SPF :

v=spf1 a mx ptr ip4:1.2.3.4 mx:mail.exemple.com ~all

DKIM (DomainKeys Identified Mail) est une norme d’authentification fiable du nom de domaine de l’expéditeur d’un mail, normalisé par l’IETF (Internet Engineering Task Force) dans le RFC 4871 pour palier aux faiblesses de SPF. DKIM a été produit par un consortium industriel en 2004. Il intègre et améliore DomainKeys de Yahoo! et Identified Internet Mail de Cisco. Il est à noter que d’autres acteur majeurs de l’Internet et des systèmes d’information ont pris part au projet, IBM, Microsoft, PGP Corporation, Sendmail, StrongMail Systems … Le but final de la solution est le même que pour SPF : lutter contre le spam et l’usurpation d’identité. On trouve des implémentations libres prêtes à être couplées aux principaux MTA. Le projet le plus abouti à ce jour semble être OpenDKIM.

Exemple d’enregistrement DKIM :

mail._domainkey.example.com. IN TXT « v=DKIM1; k=rsa; p=MEwwPQRJKoZIhvcNADAQCQADOwAwOAIxANPpYHdE2tevfEpvL1Tk2dDYv0pF28/f5MxU83x/0b sn4R4p7waPaz1IbOGs/6bm5QIDAQAB »

Mais qu’apporte DKIM par rapport à SPF ?

SPF se base sur des adresses IP — ou des blocs d’adresses IP — pour vérifier la provenance du message. Seulement, et contrairement à ce qu’essaie de nous faire croire le gouvernement français et sa HADOPI , une adresse IP n’est pas une preuve irréfutable, et il est relativement facile ou en tous cas loin d’être impossible d’usurper une adresse IP sur un réseau. Cette technique s’appelle le spoofing. C’est pourquoi on a recours ici à un système cryptographique asymétrique. On génère une paire de clefs, on stocke la clef publique dans un enregistrement de type TXT de la zone DNS concernée, et on stocke bien précieusement la clef privée sur le serveur. A chaque fois que le serveur SMTP va envoyer un mail, il va chiffrer une petite partie du message à l’aide de sa clef privée. A la réception du message, le serveur SMTP qui détecte ce champ va chercher à le déchiffrer avec la clef publique disponible dans la zone DNS du domaine de l’expéditeur. Si l’opération aboutit, il peut alors assurer que le message reçu provient bien d’un serveur possédant la clef privée. Il devient ainsi impossible — sauf cas du vol de la clef privée — d’usurper l’identité d’un serveur SMTP. Ici aussi les décisions qui découlent de la vérification sont à définir par l’administrateur (acceptation, rejet, notification à l’utilisateur ou à l’administrateur …).

Voici comment Gmail notifie ses utilisateurs du résultat de ses tests :

Mais alors pourquoi mettre en place de telles solutions puisque tout le monde ne le fait pas ? Tout da’bord car ça fait clairement partie des « Best Practices ». Ensuite, c’est un geste citoyen qui permet de réduire globalement le fléau qu’est le spam — c’est bien pour cela qu’autant d’acteurs industriels se sont rassemblés autour du projet. Enfin, vous gagnerez de précieux points dans les mécanismes anti-spams mis en place chez vos destinataires, ainsi le nombre de vos messages qui finira dans les boîtes de courriers indésirables se trouvera réduit.

Certes, DKIM et SPF authentifient le domaine, mais quid de la partie gauche, le nom d’utilisateur ? Comment vérifier l’authenticité non pas du serveur qui a envoyé le mail mais de l’utilisateur ? Ici pas vraiment de choix, il vous faudra recourir à un système de chiffrage et/ou de signature de données tel que PGP ou S/MIME pour authentifier le message et assurer ainsi la confidentialité et/ou l’intégrité de la transmission.

Si vous souhaitez vous renseigner un peu plus sur les technologies anti-spam, je vous conseille de faire un tour sur ce site.

http://www.altospam.com/fr/panorama-des-technologies-antispam.php

Raccourciceurs d’URL et nombre de combinaisons possibles

Aujourd’hui un collègue m’a demandé comment fonctionnaient les raccourciceurs d’url tels que bit.ly ou tinyurl et dont une liste quasi-exhaustive est disponible ICI

Effectivement les URL retournées par bit.ly sont du type http://bit.ly/Ux7eFJ soit seulement 6 caractères alphanumériques. On est dès lors en droit de se demander pendant combien de temps il est possible de stocker une URL dans ces conditions car visuellement parlant 6 caractères ça fait peu.

Le principe de fonctionnement d’un raccourciceur d’URL est simple, une base de donnée bien indexée contient les liens URL courtes -> URL longues, puis une page PHP se charge de récupérer la valeur courte passée par l’URL et génère en retour une redirection HTTP HTML ou Javascript vers la page ciblée.

Pour dimensionner le système et générer les URL les plus courtes possibles il faut donc faire un compromis entre le nombre de caractères et le nombre d’URL maximum que l’on souhaite pouvoir gérer. On cherche donc à trouver le nombre de combinaisons possible à partir d’un jeu de caractères donné et du nombre de caractères choisi — Pour le cas de bit.ly nous avons 6 caractères à choisir dans un jeu de 62 caractères ( 26 minuscules + 26 majuscules + 10 chiffres ). Le concept mathématique correspondant à ce problème de logique combinatoire est l’arrangement avec répétition soit comment trouver le nombre de combinaisons possibles où les caractères peuvent être répétés ( tirages avec remise ) et où l’ordre des tirages est significatif ( Ux7eFJ != xUe7JF ). La formule qui permet de résoudre ce problème est extrêmement simple, il s’agit simplement de calculer n^k avec n le nombre de caractères et k le nombre d’éléments du jeu de caractère.

Dans le cas de bit.ly nous obtenons 62^6 = 56 800 235 584 possibilités. On comprend ainsi qu’un faible nombre de caractères suffit à générer un nombre suffisant d’url. Ajoutons à cela les possibilité d’augmenter encore la taille du jeu de caractère en ajoutant les caractères spéciaux — attention ici aux risque d’incompatibilité — en gérant le dédoublonnage — on ne génère pas une nouvelle URL courte si l’URL longue existe déjà en base — en limitant la validité des URL dans le temps ou encore la suppression des plus vielles / moins utilisées des URL lorsque la limite est atteinte.

Exemples pour le jeu alphanumérique ( 62 caractères ) :

62 ^ 2 = 3844 possibilités
62 ^ 3 = 238 328 possibilités
62 ^ 4 = 14 776 336 possibilités
62 ^ 5 = 916 132 832 possibilités
62 ^ 6 = 56 800 235 584 possibilités
62 ^ 7 = 3 521 614 606 208 (3.52 x 10^12) possibilités
62 ^ 8 = 218 340 105 584 896 (2.18 x 10^14) possibilités

Vulnérabilité DoS de type « fire and run away » dans Apache

Ce matin mise à jour Apache, tiens donc, comme à l’accoutumée je cherche à savoir ce que corrige/apporte cette mise à jour, ce que je vous encourage à faire vous aussi.

 

http://mail-archives.apache.org/mod_mbox/httpd-announce/201108.mbox/browser

 

Whaoo, une vulnérabilité à une attaque Dos de type « fire and run away » c’est à dire réalisable avec une seule machine et pas la moindre bande passante. Autant dire que c’est du pain béni pour les hackers du monde entier puisque qu’Apache délivre pas loin – si ce n’est plus -  de 50% du trafic HTTP mondial. Plus impressionnant encore toutes les versions d’Apache depuis la 1.3 sont vulnérables et ce dès leur installation par défaut.

 

La faute à qui ? Une mauvaise implémentation du protocole HTTP/1.1 au niveau des headers ‘Range’ et ‘Range-Request’. Le problème avait pourtant déjà été reporté en 2007 par Michal Zalewski à cette adresse : http://seclists.org/bugtraq/2007/Jan/83

 

Le header Range est détaillé dans la RFC2616 qui définit le protocole HTTP/1.1 :

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35

 

Le header Range permet de spécifier dans une requête HTTP que l’on souhaite seulement récupérer une partie de la réponse (la page).  On peut par exemple chercher à récupérer les n premiers octets. Le problème est que rien – d’après la RFC – n’empêche de récupérer plusieurs fois la même partie de la page, ce qui permet de générer une réponse énorme à partir d’une page de seulement quelques kilooctets. L’implémentation de cette fonctionnalité dans Apache et visiblement dans IIS — du moins à l’époque — ne protège pas le serveur contre une telle requête. Il faut dire que la RFC reste assez vague quant au besoin même d’implémenter cette fonctionnalité.

 

Exploitation de la vulnérabilité :

1 – Ouvrir parallèlement autant de connexion TPC qu’il est possible (ou nécessaire).

2 – Négocier une fenêtre TCP de grande taille (>= 1Go).

3 – Envoyer une requête HTTP partielle par connexion TCP contenant un header Range forgé pour récupérer plusieurs fois la totalité de la page — de l’octet zéro à la fin de la page. La limite est la taille maximum d’un champ header  — 8Ko pour Apache — soit plus de 1000 fois alors imaginez un peu le carnage sur un fichier avi ou un iso.

GET /foo.html HTTP/1.1
Host: example.com
Range: bytes=0-,0-,0-,0-,0-,...

4 – Clore les connections TCP pour lancer l’attaque.

5 – Se déconnecter ou rejeter simplement les réponses du serveur de manière silencieuse — il ne se rendra compte qu’on n’écoute plus seulement une fois la taille de la fenêtre TCP épuisée.

 

Que va-t-il se passer ?

Le serveur va recevoir les requêtes et commencer à mouliner et donc à consommer du temps processeur pour générer les réponses. Pour ce faire il va créer de nouveaux processus qui vont petit à petit – quelques minutes suffisent — remplir  complètement la mémoire du serveur et ce jusqu’à la SWAP. Il en résulte une instabilité certaine du système et un mal-fonctionnement voir un arrêt des services hébergés par la machine, you win.

 

Vous l’aurez compris, l’intérêt de l’attaque est de pouvoir déstabiliser un serveur en envoyant une très faible quantité de données en un temps très court, vous n’avez maintenant plus qu’à regarder tranquillement le serveur s’écrouler — d’où le nom « fire and run away », vous placez un explosif à mèche lente dans un bâtiment, vous vous reculez tranquillement de quelques kilomètres et attendez le spectacle.

 

Visiblement oubliée du grand public — des hackers et experts en sécurité — cette faille refait surface suite au post de ce petit script Perl permettant d’exploiter la faille sur Full Disclosure. Apache a bien évidement réagi et proposé un correctif dans les jours qui ont suivis, il n’est donc plus nécessaire que je vous explique comment contrer cette attaque, il suffit de mettre à jour.

 

Encore plus rapidement l’équipe SpiderLabs a créer des règles permettant de mitiger le risque à l’aide du mod_security. Ce module que je ne peux que vous recommander permet de détecter et de lutter contre de nombreux patterns d’attaque web allant de l’énumération en passant par les injections, les attaques de type  XSS ou CSRF et bien d’autres.  L’article suivant explique comment ils ont procédé pour contrer cette attaque :

http://blog.spiderlabs.com/2011/08/mitigation-of-apache-range-header-dos-attack.html

Host-Proof Hosting et confidentialité des données sur internet

 

 

Il y a 10 ans, mes données étaient toujours toutes avec moi, sur un disque dur, une clef usb, un ZIP… Aujourd’hui, mes emails sont stockés chez Google avec Gmail et Microsoft avec Live, les documents sont sur Google Docs, le code source sur GitHub ou GoogleCode, mes flux RSS sur GoogleReader, mes données personnelles réparties entre Facebook, Twitter, Deezer, Soundcloud,… et tout ceci continue de plus belle avec l’arrivée de produits comme Dropbox, GoogleMusic,… Maintenant je ne suis même plus capable de vous dire dans quel pays mes données sont réellement archivées, traitées, transmises.

 

Une des problématiques majeures du cloud computing — hors l’accès obligatoire à internet — est la multiplication des logins nécessaires pour accéder à l’ensemble des données que vous avez disséminées un peu partout sur la toile, c’est pourquoi je voulais essayer Passpack.com depuis longtemps. Passpack est un applicatif (site) web dédié à la centralisation et à la gestion de mots de passe qui en proposant des fonctionnalités intéressantes comme le One-Click-Login, la génération de mots de passe aléatoires, le renouvellement ou encore le partage de mot de passe entres utilisateurs, Passpack.com est devenu une des références en la matière.

 

Je ne souhaite pas ici m’étendre sur l’éternel débat du bien fondé ou non de cette solution – à vous de faire votre choix — mais je vais vous présenter le concept cryptographique qu’ils utilisent pour stocker les mots de passe afin que vous puissiez appréhender leur approche : le Host-proof hosting.

 

Comme dit précédemment,  la quantité de données envoyées par un utilisateur en direction de systèmes d’information tiers a été décuplée, mais surtout les utilisateurs sont prêt à faire confiance et à envoyer des données sensibles (numéro de carte de crédit,… ). Vous souvenez-vous il y à encore quelques années, quand la plupart de vos proches trouvaient dangereux de faire un achat sur internet ?

 

On vous rabâche que le « petit cadenas » (HTTPS) signifie que l’échange est sécurisé. Certes la confidentialité et l’intégrité des données durant l’échange client-serveur sont assurées par les technologies SSL/TLS qui permettent de se protéger notamment du sniffing. Mais est ce bien suffisant ? Ce « petit cadenas » doit-il nous donner une totale confiance dans le site ? La réponse est bien évidement non, une fois l’échange terminé les données sont stockées et accessibles en clair aux personnes — qu’elles soient malveillantes ou non — ayant accès à l’infrastructure hébergeant le site.

 

Richard Schwartz, qui a co-développé le concept d’Host-proof hosting nous résume le problème de la confiance en ces quelques mots : « Trust in web applications only extends as far as trust in whoever is hosting it », en français : « La confiance d’un utilisateur pour un applicatif web ne peut excéder la confiance qu’il a pour les gens qui l’hébergent ».

 

L‘Host-proof hosting permet de résoudre ce problème en chiffrant les données sensibles avec une clef connue uniquement par l’utilisateur. Tout le chiffrement est exécuté coté client avant l’envoi des données, les hébergeurs sont donc en possession de données chiffrées qu’ils sont incapables de déchiffrer sans que l’utilisateur ne leur fournisse la clef. De même les données retournées par le serveur sont déchiffrées coté client.

Host-Proof Hosting

 

La sécurité du procédé repose sur les algorithmes, la qualité et la longueur de clef choisie — ce qui reste un compromis entre sécurité, performance et praticité — mais sachez qu’avec de bons paramètres il faudra encore plusieurs milliers d’années pour venir à bout des algorithmes de cryptographie symétriques les plus courants AES, BLOWFISH, RC4 et rendre intelligible les données.

 

Passpack à mis à disposition des développeurs une API Javascript simple et efficace dédiée à la mise en place de ce modèle de sécurité, ça se passe ici.

 

Dans la réalité la sécurité du concept repose sur la qualité de sa mise en œuvre, il faut à tout prix empêcher à quiconque de pouvoir accéder à la clef personnelle d’un utilisateur. En général on a tendance à protéger le serveur des données arbitraires qu’il peut recevoir (injections SQL/PHP/XSS/… ), cependant dans le cas des applicatifs de type Host-proof nous allons aussi chercher à protéger le client puisque c’est lui qui reçoit la sacro-sainte clef. Deux catégories de vulnérabilités s’offrent à nous, celles où l’on attaque directement le client dans ce cas l’attaquant doit récupérer la clef personnelle ainsi que le couple login/mot de passe de sa victime et celles où l’on attaque le serveur. Dans ce cas l’attaquant doit avoir un accès au média où les données sensibles sont stockées ainsi que la clef de l’utilisateur à qui appartient les données.

 

Dans le premier cas c’est à la sécurité de l’environnement de scripting du navigateur — et sur ce point il est juste de s’interroger car ces environnements ne sont pas vraiment réputés pour être sans faille — que l’on va s’attaquer. On veillera ainsi à ce que l’applicatif client soit capable de vérifier lui même son intégrité grâce à une somme de contrôle — stockée sur un ou plusieurs serveurs tiers. Le but est ensuite de limiter les risques au maximum, il serait par exemple de bonne augure de veiller à ne pas stocker la clef en mémoire. Il faut être conscient que le risque-zéro n’existe pas, les Keylogger/Rootkits/Spyware/Phishings/… sont légions et que vous ne pouvez pas directement lutter contre. Il est donc nécessaire d’avertir au maximum l’utilisateur sur ces menaces afin qu’il ne place pas son entière confiance uniquement sur ce concept.

 

Dans le second cas, l’attaquant a déjà réussi à prendre le contrôle du serveur web — tout du moins assez pour pouvoir modifier le contenu qu’il renvoie — et il a aussi accès aux données sensibles — vous pouvez prendre le cas d’un admin malveillant — tout ce qu’il manque à l’attaquant c’est la clef correspondant aux données qu’il souhaite rendre intelligibles. Il doit donc modifier le comportement du site pour que ce dernier lui renvoie la clef lorsque l’utilisateur la saisit soit en modifiant le code HTML — ajout d’un formulaire par exemple — soit en modifiant le code de l’applicatif client. La protection la plus efficace reste la mise en place d’un simple contrôle d’intégrité et de comportement de la page réalisé avec par une machine tierce en continu pour remonter une alerte en temps réel et stopper le service ce qui limite drastiquement les risques de transmission de données. On peut aussi imaginer un mécanisme demandant à l’utilisateur de vérifier lui-même l’intégrité du contenu. On essayera aussi de rendre aussi inintelligible que possible le lien entre les données et l’utilisateur à qui elles appartiennent. L’utilisation de mécanismes distribués permet de mitiger ce type de risque en demandant à l’attaquant de prendre le contrôle de plusieurs systèmes, ce qui se révèle rapidement impossible, qui plus est dans le cadre d’une solution ou la sécurité des données est au cœur des préoccupations.

 

Comment savoir si un site à mis en place une solution de type Host-proof hosting pour protéger mes données ? Ici pas de petit cadenas, à vous de vous faire votre idée et de faire confiance ou non à ce site. Premièrement, le site doit vous demander régulièrement une clef secrète puisqu’il ne la stocke pas, ensuite il va falloir aller voir directement au niveau des données échangées avec le serveur et vérifier que les données sensibles ne passent pas en clair — l’extension Firebug pour Firefox fera merveilleusement bien l’affaire.

 

Le concept est donc viable mais requiert que son implémentation ne laisse « aucune » chance à l’attaquant de récupérer la clef ce qui relève du domaine du possible — le nombre de principe permettant de mitiger suffisamment le risque étant assez élevé — mais demande un travail et une surveillance accrus de la sécurité car la moindre faille peut compromettre tout l’ensemble.

 

Proxy HTTP Apache2 avec mod_proxy

Que ce soit pour obtenir une adresse IP différente ou pour passer au travers des règles de filtrages de certains sites/firewalls,
vous pouvez avoir l’envie de faire transiter votre flux web par votre serveur Apache personnel.

Pour ceci nous allons créer un hôte virtuel dédié à cette usage, l’ouverture d’un proxy sans authentification étant extrêmement dangereuse car n’importe qui peut utiliser votre IP, nous allons donc recourir à une authentification de type HTTP/Basic pour en sécuriser l’accès.

Attention ici il n’est absolument pas question de chiffrer le flux HTTP, c’est une simple redirection de ce dernier vers un nouveau point de sortie, qui plus est les requêtes DNS sont toujours traitées par votre serveur DNS habituel, gardez donc à l’esprit que cette technique ne vous rends pas invisible, notamment vis à vis de votre réseau local.

J’ai choisi ici le port 443 pour héberger le service, tout d’abord parce que c’est un port qui est généralement toujours ouvert quelque soit l’endroit d’où l’on se connecte et ensuite car je n’ai pas de site HTTPS hébergé sur cette machine. A vous de faire votre choix pour ce paramètre.

Il vous faut dans un premier temps créer un fichier contenant les couples login/mot de passe avec la commande htpasswd :

htpasswd -c /etc/apache2/htpasswd username

On vas ensuite créer le fichier de configuration de notre vhost dans le dossier /etc/apache2/sites-available/proxy :

<VirtualHost *:443>

ServerName proxy.mydom.fr
DocumentRoot /var/www/proxyjail

ProxyRequests On
ProxyVia On

php_value engine off

<Proxy *>
AuthType Basic
AuthName « Restricted Area »
AuthUserFile /etc/apache2/htpasswd
require valid-user

Order deny,allow
Allow from all
</Proxy>

<Directory /var/www/proxyjail>
AllowOverride None
Options -All
</Directory>

</VirtualHost>

Certes notre virtual host ne vas normalement pas être utilisé pour délivrer du contenu HTML local — encore moins PHP ou un autre langage de scripting d’ou la presence de la ligne « php_value engine off  » — il est cependant obligatoire qu’il dispose d’un DocumentRoot. Utiliser /var/www comme DocumentRoot dans notre cas permettrait certainement à un utilisateur malveillant d’accéder à beaucoup de choses qu’il ne devrait pas.
Nous allons donc créer le dossier /var/www/proxyjail et s’en servir pour enfermer les utilisateurs du proxy à l’intérieur. ( Attention ici il n’est pas question de chroot ).

mkdir /var/www/proxyjail
chmod 744 /var/www/proxyjail
touch /var/www/index.html

Pour finir il suffit d’activer le vhost et de relancer apache

a2ensite proxy
apache2ctl configtest && /etc/init.d/apache2 restart

Il ne vous reste plus qu’à configurer votre navigateur pour qu’il utilise votre proxy et le tour est joué :
Configuration du proxy sous Firefox

 

 

Se connecter à un VPN PPTP

Point-to-Point Tunneling Protocol (PPTP) est un protocole d’encapsulation PPP sur IP conçu par Microsoft, permettant la mise en place de réseaux privés virtuels (VPN) au-dessus d’un réseau public.
Ce protocole est supporté par quasiment toute les plateformes : Microsoft Windows depuis 95OSR2, Mac OS X, GNU/Linux, BSD, Cisco CiOS, Iphone iOS, Androïd, Palm,… et est extrêmement simple à mettre en place. Cependant PPTP est loin d’être sécurisé, en effet de nombreuses failles de sécurités ont été trouvées dans l’implémentation de MPPE, le protocole d’authentification PPP. C’est pourquoi il est fortement déconseillé d’utiliser PPTP avec IPv6 et/ou dans les cas où la confidentialité et l’intégrité des données sont jugées indispensables.

Nous allons voir ici comment se connecter à un serveur PPTP sous GNU/Linux.

Installation du client :

apt-get install pptp-linux

Prérequis :

  • adresse (IP ou DNS) du serveur PPTP ($SERVER)
  • le nom que vous souhaitez donner au tunnel ($TUNNEL),
  • login ($USERNAME) ( peut être de la forme DOMAIN\USERNAME )
  • mot de passe ($PASSWORD)

Configuration :

Vérifier la présence des options suivantes dans le fichier /etc/ppp/options.pptp

lock noauth nobsdcomp nodeflate

Ajouter une ligne au fichier /etc/ppp/chap-secrets qui gère l’authentification ( attention le mot de passe est stocké en clair )

$USERNAME PPTP $PASSWORD *

Pensez à échapper les caractères spéciaux dans le cas DOMAIN\\USERNAME

Créer le fichier /etc/ppp/peers/$TUNNEL :

pty « pptp $SERVER –nolaunchpppd »
name $DOMAIN\\$USERNAME
remotename PPTP
require-mppe-128
file /etc/ppp/options.pptp
ipparam $TUNNEL
persist

L’option « persist » active la reconnexion auto en cas de perte de connexion.

Tester le tunnel :

pon $TUNNEL debug dump logfd 2 nodetach

Démarrer le tunnel :

pon $TUNNEL

Arrêter le tunnel :

poff $TUNNEL

Pour démarrer automatiquement le tunnel vous pouvez ajouter ceci au fichier /etc/network/interfaces :

auto tunnel
iface tunnel inet ppp
provider $TUNNEL

Tester le démarage auto :

/etc/init.d/networking restart

Pour plus d’informations ou en cas de problèmes : http://pptpclient.sourceforge.net/howto-debian.phtml

Voilà, la liaison VPN PPTP est maintenant établie, vous pouvez la voir apparaitre dans le résultat de la commande ifconfig sous le nom pppX.

root@Boris:~# ifconfig ppp0

ppp0      Link encap:Point-to-Point Protocol
inet addr:10.20.80.19  P-t-P:10.20.80.10  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1396  Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:80 (80.0 B)  TX bytes:80 (80.0 B)

Par défaut, vous avez accès au réseau local distant mais la réciproque n’est pas vraie, pas plus que votre réseau local ne peut accéder au réseau local distant. Pour ceci il ne reste plus qu’à configurer le routage (via la table de routage et iptables ) pour rediriger les flux que vous souhaitez dans votre tunnel.

LCMP : Linux Cherokee MariaDB PHP un serveur web qui tient la route

Aujourd’hui je vais vous présenter un remplaçant pour le traditionnel LAMP : Linux Apache MySQL PHP.
Historiquement et incontestablement leader du marché de l’hébergement web, l’assemblage LAMP assure aujourd’hui la robustesse et la fiabilité de la toile à travers le monde, cependant il reste toujours intéressant de découvrir les autres technologies disponibles.

Notre but est d’héberger des applicatif web PHP, nous allons évidemment rester sur des technologies compatibles GNU\Linux libres.
Le but ici n’est pas la performance ultime mais plus le confort d’utilisation pour l’admin-web lambda.

Coté serveur web :

Vous connaissez certainement le populaire NGinx comme concurrent à Apache, mais ce serveur HTTP est assez spécifique et surtout utilisé pour délivrer du contenu HTML statique ou servir de reverse proxy. On peut aussi parler de Lighttpd mais son déclin par rapport aux autres solutions — en terme de part de marché — n’est pas des plus rassurant et c’est en prenant en compte le critère confort d’utilisation que je me suis tout de suite tourné vers Cherokee.

Cherokee est un serveur HTTP cross-plateform sous licence GPL écrit en C, il met en avant un design modulaire léger et haute-performance. Innovation intéressante, Cherokee dispose d’une interface web d’administration « cherokee-admin » qui permet de modifier graphiquement la configuration du serveur.

L’exécution de PHP se fait via FastCGI. Contrairement au mod_php5 d’Apache qui intègre directement le langage dans le serveur HTTP sous forme de module, FastCGI est une technique permettant de déléguer la génération de la page demandée à un programme tiers, dans notre cas « php-cgi ». Ceci donne aussi la possibilité à Cherokee de délocaliser et de répartir l’exécution du code sur un ou plusieurs serveurs dédiés.

L’installation se fait grâce au gestionnaire de paquet :

apt-get install cherokee cherokee-mod-rrd cherokee-doc

Vous pouvez d’ores et déjà vous connecter sur le port 80 de votre machine et découvrir le « It’s Works » version cherokee :

Vous pouvez maintenant démarrer l’interface web d’administration et vous y connecter sur le port indiqué ( 9090 ) avec le mot de passe fourni. Lorsque vous aurez fini vos modifications, un « CTRL+C » vous permettra d’arrêter l’interface.

#cherokee-admin -b
Login:
User: admin
One-time Password: goixKrnGLTtV4nZt
Web Interface:
URL: http://localhost:9090/

Cette interface d’administration super-intuitive est aussi simple que complète et vous permet de régler le moindre détail de la configuration de votre serveur web en quelques clics. On y retrouve les principaux paramètres que l’on connait sur Apache et le plus souvent sous la même dénomination. Autant dire que l’on n’est pas trop dépaysé, on trouve en plus des innovations intéressantes telles que le load-balancing php/mysql, un mécanisme permettant de générer des url temporaires jetables pour le téléchargement de fichiers, de nouveaux mécanismes d’authentification comme PAM ( Utilisateurs Système ) ou même une liste user/mdp gérée en dur dans la configuration ; le tout étant, qui plus est, fort bien documenté.

Pour installer le support PHP rien de plus simple, il suffit d’installer le package php-cgi :

#apt-get install php5-cgi php5-mysql

Dans l’onglet vServer (vHost) rajoutez maintenant une règle (Behavior) PHP dans le vServer par défaut ou créez un nouveau vServer de type PHP. Cliquez ensuite sur « sauvegarder » et le serveur vous proposera de redémarrer le service pour charger la configuration.

Cherokee peut collecter des statistiques sur vos différents vServer et vous les restituer sous forme de graphique — uniquement si vous avez installé le package « cherokee-mod-rrd » — ce qui donne une bonne vue d’ensemble de la consommation de bande passante ou du nombre de requête mais ne remplacera absolument pas une vraie solution de monitoring/supervision.

On notera la présence de template de vServer pour les applicatifs web les plus connus que ce soit des CMS (Drupal, Joomla, WordPress), des serveurs d’applications ( Glassfish, ColdFusion ), des plateformes de développement ( Symphony, Zend, Django, RubyOnRails ), des langages de programation ( PHP, .Net avec Mono ) ou encore d’autres applicatifs comme SugarCRM ou PhpBB ainsi que pour les configurations de redirection, proxy, contenu statique, …

Je vous conseille de jeter un coup d’œil à l’aide — disponible uniquement si vous avez installé le package « cherokee-doc ». Plutôt bien construite, elle propose même des liens vers des screencasts détaillants la plupart des fonctionnalités.

Pour conclure, Cherokee est un serveur web très proche d’Apache dans sa philosophie — son nom vous avait peut-être mis la puce à l’oreille — mais extrêmement plus agréable et rapide à configurer. Niveau performance rien à redire pour ce petit serveur web qui s’en sort très bien puisqu’il est souvent présenté comme au moins 2 fois plus rapide que son homologue.

Coté BDD :

Depuis le rachat de MySQL ( Sun ) par Oracle, j’ai envie de me tourner vers MariaDB.
Réalisé par Michael Widenius qui n’est autre que le principal auteur de MySQL, MariaDB actuellement en version 5.2.6 est un Fork libre de MySQL sous licence GPL.

Complétement compatible avec un MySQL de même version , MariaDB propose un nouveau moteur de base de donnée « crash safe » nommé Maria pour remplacer innoDB et MyIASM. Le code de MariaDB a été également optimisé, les requêtes complexes devraient être plus rapides, de nombreux cas d’interblocage sont corrigés et on notera l’arrivée en avance de fonctionnalité comme le « thread pool » prévu pour le futur MySQL 6.0 qui « permet d’ores et déjà de charger les requêtes de façon plus efficace ».

L’installation se déroule le plus simplement du monde après avoir rajouter ce dépôt dans le fichier /etc/apt/sources.list :

# MariaDB repository list
deb http://mirror.switch.ch/mirror/mariadb/repo/5.1/debian squeeze main
deb-src http://mirror.switch.ch/mirror/mariadb/repo/5.1/debian squeeze main

Sans oublier d’importer la clef du dépôt :

apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 1BB943DB

 

Enfin il reste à installer le méta-paquet mariadb-server pour obtenir la dernière version disponible ( ici 5.1 ) :

apt-get update
apt-get install mariadb-server

On essaye de se connecter à la base et normalement tout roule :

root@webserver:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 5.1.55-MariaDB-mariadb98~squeeze-log (MariaDB – http://mariadb.com/)

This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MariaDB [(none)]>

Bref au niveau de l’installation c’est exactement comme mysql, premier point rassurant pour un admin habitué à ce dernier.

Nous allons maintenant installer PhpMyAdmin et WordPress pour vérifier la compatibilité et la fiabilité de l’assemblage.

PhpMyAdmin :

Primo : télécharger la dernière version des sources sur le site http://phpmyadmin.org

Secondo : les décompresser dans le répertoire de votre convenance ( /var/www/phpmyadmin par exemple).

Tertio : créer un vServer de type PHP pointant sur ce répertoire dans l’interface d’administration Cherokee.

That’s it :)

WordPress :

On récupère directement les dernières sources comme ceci :

wget http://fr.wordpress.org/latest-fr_FR.zip

On les décompresse dans le répertoire de notre choix ( /var/www/wordpress par exemple)

On crée un vServer de type WordPress pointant sur ce répertoire dans l’interface d’administration Cherokee.

On crée une base de donnée WordPress — via phpmyadmin ;) — avec un utilisateur wordpress disposant de tous les droits sur cette base.

Normalement a ce stade, il ne reste plus qu’à se connecter à WordPress pour faire l’installation. Cependant, la valeur par défaut des colonnes de type « date » choisie par wordpress est ’0000-00-00 00:00:00′ — ce qui il faut l’avouer ne représente pas réellement une date concrète — or elle n’est pas acceptée par MariaDB. On va donc remplacer les occurrences de cette date dans le code WordPress avec cette ligne de commande :

cd /var/www/wordpress
find . -type f -name ‘*.php’ -ls -exec sed -i s/0000-00-00\ 00:00:00/1000-01-01\ 00:00:00/ {} \;

Pour les explications détaillées du problème et pour aller plus loin dans la configuration ( passage au moteur de BDD Maria, optimisations,…), c’est ici : http://byte-consult.be/2011/06/07/running-wordpress-nginx/

La « Full Compatibility » assurée par Michael Widenius ne serait elle qu’un mythe ? Rassurez vous, dans 99% des cas vous n’aurez pas le moindre souci.

L’installation se déroule maintenant sans aucun problème :)

Conclusion :

Le test est plutôt réussi, Cherokee-admin est un vrai plus pour l’admin-web et les fonctionnalités supplémentaires qu’il propose sont vraiment intéressantes. MariaDB propose un bon nombre d’options qui permettent d’optimiser la fiabilité du stockage de vos données ce qui est essentiel. Niveau performance — même si ce n’est pas le but premier — on se retrouve devant un système assez léger et plutôt réactif face à la charge, reste à voir si ça pourrait suivre le rythme dans un environnement de production. Personnellement le manque effectif d’utilisateurs m’interdit un déploiement en production car la perte de temps générée par la résolution des problèmes non documentés serait colossale. Par contre je l’ai déjà adopté à la maison et je ne peux que vous conseiller de faire de même ;)

Apache2-mpm-itk : Utiliser un utilisateur différent pour chaque vhost

Qu’est ce qu’un MPM Apache ?

le MPM ou Multi-Processing Module, est le composant d’Apache qui gère les connexions simultanées, en terme de process et/ou de thread.

 

Quel est l’intérêt d’utiliser apache2-mpm-itk plutôt que worker ou prefork ?

Une des limitations des mpm classiques est qu’ils utilisent le même uid:gid, définis dans /etc/apache2/apache2.conf pour traiter les requêtes de tous les vhosts.

Le mpm itk permet de choisir un uid:gid différent pour chaque virtual-host et ce sans avoir recours aux cgi ou aux modules suexec ou suphp, ce qui est extrêmement pratique dans le cadre d’un hébergement mutualisé ainsi que dans certains cas pratiques.

Coté sécurité, le mpm itk permet d’isoler la configuration de chaque vhost directement dans son fichier de configuration.

 

Performances :

La principale limitation du mpm itk est sa performance. Parce que le MPM ITK crée puis détruit un processus pour chaque requête, les performances de ce MPM s’en trouvent bien dégradées notamment par rapport à Prefork ou Worker, bien que ITK reste plus performant que les modules suexec ou suphp.
Si la performance vous est indispensable il sera bon de se tourner vers le mpm per-user qui réalise le même travail en profitant des threads mais qui demande bien plus d’efforts de configuration. Ou encore vers les solution FastCGI.

 

Installation :

Pour installer Apache2-mpm-itk, utilisez simplement votre gestionnaire de paquet, qui s’occupera lui même via les install script de remplacer le mpm que vous utilisez actuellement

apt-get install apache2-mpm-itk

Si vous souhaitez compiler ce module depuis les sources je vous conseille cet article :

 http://blog.stuartherbert.com/php/tag/mpm-itk/

 

Configuration :

Pour finir il vous suffit ensuite de rajouter ce bloc dans le fichier de configuration du vhost :

<IfModule mpm_itk_module>

AssignUserId username groupname

</IfModule>

Il ne reste plus qu’à recharger la configuration d’Apache :

apache2ctl configtest && /etc/init.d/apache2 restart

Vous pouvez maintenant verifier que les processus Apache se lancent avec les bons droits :

ps aux | grep apache

Mettre en place un tunnel vpn « ppp over ssh »

1) Introduction

Mettre en place un tunnel vpn se révele souvent très intéressant pour accéder à des ressources réseau situées derrière un routeur, ou pour crypter un flux de donnée sensible.
Cependant un vpn classique PPTP demande d’utiliser un système d’authentification par le fichier /etc/ppp/chapsecret et d’avoir une connectivité possible sur le port 1723, ce qui n’est pas toujours le cas.
Le vpn PPPSSH permet de se servir d’une connexion ssh comme d’un tunnel ppp, et donc de pouvoir router à l’intérieur le trafique qui nous intéresse.

2) Mise en place

2.1) Pré requis

installer sshd et pppd sur le serveur
pour des raison de sécurité évidente on vas créer un utilisateur vpn sur le serveur et installer sudo

2.2) Authentification

On vas mettre en place une authentification par clef publique en place pour que notre script puisse se connecter en ssh à la machine distante sans nous demander de mot de passe :

si vous n’avez pas encore créer de pair de clef rsa pour le compte root (sur le poste client):

#ssh-keygen

puis on vas envoyer la clef publique sur le serveur :

#ssh-copy-id -i .ssh/id_rsa.pub vpn@vpn.skatkatt.org

verifier si on peu maintenant se connecter au serveur sans mot de passe :

#ssh root@vpn.skatkatt.org

on vas maintenant editer la configuration de sudo pour permettre à l’utilisateur vpn d’utiliser pppd sans avoir à demander de mot de passe :

# visudo

ajouter ces 2 lignes à la fin du fichier :

Cmnd_Alias VPN=/usr/sbin/pppd
vpn ALL=NOPASSWD: VPN

on fais maintenant le test :

# su – vpn
$ sudo /usr/sbin/pppd noauth
~9}#ÀZ}!}!} }9} »}k} }r} }’}%}zt2-·}’} »}

si aucun mot de passe n’est demandé c’est tout bon

2.3) Script

On vas maintenant installer le script de connexion sur le poste client :

#cd /usr/local/bin/

#wget http://bibabox.fr/wp-upload/vpn-pppssh.sh

changer les variables pour qu’elles correspondent à votre configuration.

#nano /usr/local/bin/vpn-pppssh.sh

3) Utilisation

2.1) connexion / déconnexion

aussi simple que bonjour :

# /usr/local/bin/vpn-pppssh start

et

# /usr/local/bin/vpn-pppssh stop

2.2) routage

sur le serveur créer le fichier /etc/ppp/ip-up.d/ssh et ajouter cette ligne :

echo 1 > /proc/sys/net/ipv4/ip_forward

sur le client, une fois la connexion établie :

#route add -net 192.168.10.0/24 dev ppp0

*modifier l’ip par celle de votre réseau

et maintenant votre réseau local est accessible comme si vous y étiez.