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

4 hacks pour extraire des statistiques de WordPress

C’est le début de l’année et le moment des bilans concernant les statistiques de votre blog. Voici donc un petit billet sur quelques hacks MySQL permettant d’obtenir des statistiques à diffuser vers vos lecteurs ou à garder au chaud !

Avant tout il faut disposer d’un accès à votre base de donnée MySQL (soit via une interface de type phpMySQL, soit directement via une ligne de commande mysql). Pour avoir vos paramètres de connexion à votre BD WordPress il suffit de regarder le fichier wp-config.php à la racine de votre répertoire Web.

Voici l’architecture des tables de votre BD WordPress. Je ne suis plus trop un expert en requêtes MySQL (les cours datent de plus de 10 ans maintenant ;)) alors si vous voyez des améliorations dans les requêtes ci-dessous je suis preneur de commentaires.

Nombre de billets publiés en 2010

Cette première requête donne le nombre de billets publiés (status= »publish ») sur l’année 2010 (c’est à dire entre le 1er janvier et le 31 décembre 2010).

mysql> SELECT COUNT(*) FROM wp_posts WHERE post_status= »publish » AND post_date BETWEEN ‘2010-01-01’ AND ‘2010-12-31’;

+———-+

| COUNT(*) |

+———-+

| 161 |

+———-+

1 row in set (0.00 sec)

Nombre de commentaires pour les billets publiés en 2010

Une requête un peu plus complexe qui somme (SUM) le nombre de commentaires pour les billets 2010.

mysql> SELECT SUM(comment_count) FROM wp_posts WHERE post_status= »publish » AND post_date BETWEEN ‘2010-01-01’ AND ‘2010-12-31’ GROUP BY post_status;

+——————–+

| SUM(comment_count) |

+——————–+

| 1314 |

+——————–+

1 row in set (0.01 sec)

Liste des 10 billets les plus commentés publiés en 2010

On continu pas le classement (TOP 10) des nouveaux billets les plus commentés.

mysql> SELECT post_title,comment_count FROM wp_posts WHERE post_status= »publish » AND post_date BETWEEN ‘2010-01-01’ AND ‘2010-12-31’ ORDER BY comment_count DESC LIMIT 0,10;

+——————————————————————-+—————+

| post_title | comment_count |

+——————————————————————-+—————+

| Configurer VPNTunnel sous Ubuntu | 58 |

| Installation et test de Flumotion 0.8 | 46 |

| Script d’installation automatique de Nagios | 42 |

| Spideroak, un sérieux concurrent à Dropbox | 40 |

| Utiliser Nmap pour générer vos fichiers de configuration Nagios | 38 |

| Installation d’un serveur OpenVPN sous Debian/Ubuntu | 36 |

| 12 étapes pour optimiser les performances de son blog WordPress | 35 |

| Le blog de Nicolargo a son application IOS | 35 |

| Tu fais quoi après l’installation de Firefox ? | 26 |

| MyScreenCast, comment faire du screencast avec GStreamer | 26 |

+——————————————————————-+—————+

10 rows in set (0.01 sec)

Top 10 des lecteurs ayant le plus posté de commentaires sur le blog en 2010

Enfin une requête un peu plus complexe qui donne le classement des plus gros « commentateurs » sur le blog.

mysql> SELECT comment_author,COUNT(comment_count) AS F01 FROM wp_comments,wp_posts WHERE comment_approved=1 AND comment_post_ID=ID AND comment_date BETWEEN ‘2010-01-01’ AND ‘2010-12-31’ GROUP BY comment_author ORDER BY F01 DESC LIMIT 0,10;+—————-+—–+

| comment_author | F01 |

+—————-+—–+

| NicoLargo | 315 |

| Albert | 22 |

| Pierre-Yves | 18 |

| ninja21a | 18 |

| Mr Xhark | 15 |

| Sylvain | 14 |

| Christophe | 12 |

| floppy84 | 12 |

| Nico | 11 |

| Guillaume | 10 |

+—————-+—–+

10 rows in set (0.07 sec)

Si vous avez d’autres requêtes MySQL dans votre besace et bien faites tourner !

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

Sécuriser son blog WordPress #1

Il n’y a rien de plus rageant que de se faire pirater son blog. En plus de réduire à néant notre amour propre, cela peut avoir, dans le cas d’une indisponibilité prolongée, des impacts non négligeables sur le « saint » référencement dans gOOgle et donc sur le trafic sur votre site (je suis bien placé pour en parler…).

Après avoir détaillé l’installation d’un blog WordPress sur un serveur VPS Gandi Ubuntu Server puis optimiser ce dernier en 12 étapes, nous allons donc aborder des techniques permettant de protéger votre blog WordPress hébergé sur un serveur dédié ou virtuel (mais un bon nombre de ces techniques sont aussi applicables sur n’importe quel site Internet). Il faut garder à l’esprit que cela ne garantira en rien une protection efficace à 100%. Si une personne compétente décide de pirater votre site, il y a de fortes chances qu’elle réussisse. Par contre, ces techniques vous protégeront sûrement d’une grande majorité des attaques lancées via des « script kiddies« .

Cet article va être découpé en plusieurs billets (vous êtes en train de lire le #1):

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

Sécurisation du système d’exploitation

C’est la base de votre infrastructure. Ici, pas la place pour des systèmes d’exploitations (OS) de comique. Il faut du lourd, du sûr, du solide, du stable, du libre: c’est-à-dire une distribution GNU/Linux ou BSD.

Pour les serveurs Web, j’utilise FreeBSD ou Ubuntu Server, selon mon humeur. Comme je le répète assez souvent il vaut mieux choisir un système d’exploitation que l’on maîtrise bien. En discutant avec des “experts”, vous aurez autant de sons de cloches que d’OS…

Dans la suite de ce billet, nous travaillerons sur la sécurisation d’un serveur sous Ubuntu Server 10.04 LTS, ces méthodes sont applicables facilement sur une Debian (et toute autre distribution Debian like).

Pense bête lors de l’installation

Lors de la configuration des partitions du disque dur de votre serveur, ne tombez pas dans la facilité en faisant une partition unique qui contiendra le système, les application et vos données sur un même volume logique.

Séparer intelligemment les répertoires de son système permet de cloisonner les données et simplifie la ré-installation d’un système. Au minimum, il est conseillé de séparer au moins les partitions suivantes:

  • / (~ 5 Go)
  • /boot (~ 100 Mo)
  • /var (~ 12 Go)
  • /home (Tout l’espace restant)
  • /var/tmp (Voir plus bas)
  • /tmp (Voir plus bas)

Dans notre cas, l’idée est de ne pas stocker nos sites sur /var/www mais sur /home, qui contient tout l’espace.

Le répertoire /var, dédié principalement aux logs, pourra alors se remplir sans impacter votre arborescence principale sur / ou vos comptes sur /home.

Surveiller l’espace utilisé sur vos partition est important, une partition pleine empêcherait vos logs de s’écrire ou vos sites de fonctionner correctement. Le programme logwatch (décrit plus bas) vous fournit un récapitulatif de l’espace disque utilisé, il est donc utile pour surveiller ce point.

Utilisation de tmpfs

Sous les systèmes GNU/Linux, on a deux dossiers temporaires: /tmp et /var/tmp. Passer ces dossiers “World Writable” (c’est à dire que n’importe quel utilisateur/processus de votre système peut écrire et lire dans ces répertoires) en tmpfs (disque RAM). Il faut que votre serveur dispose d’une quantité de mémoire RAM conséquente car une partie de celle-ci sera utilisée pour stocker les fichiers temporaires.

Pour mettre en place tmpfs sur un système de fichier (/tmp dans cet exemple), éditez le fichier /etc/fstab et ajouter la ligne suivante :

tmpfs        /tmp     tmpfs        defaults,user_xattr          0    0

Je vous conseil de mettre tmpfs en place pour les répertoires /tmp, /var/tmp et /dev/shm. La rêgle pour savoir síl faut le mettre en place est « sur tous les répertoires dont le données sont volatiles ». Ainsi, /var/lock devrait en faire partie, sauf que certains programmes, mal codé, n’apprécient pas que ce dossier soit vidé.

L’idée derrière l’utilisation de la RAM est de rendre ces répertoire très rapides. Le stockage sur RAM limite aussi intrinsèquement leur taille, que le noyau gère automatiquement pour étendre ou diminuer la taille de ces partitions en fonction des besoins du système.

Mise à jour du système

C’est un des principe de base de la sécurité de votre système informatique (malheureusement aussi un des plus rébarbatif):

« Toujours avoir un système et des applications à jour. »

Pour m’aider dans cette lourde tache, j’utilise l’application cron-apt qui permet de vérifier automatiquement si des mises à jours sont disponibles. Si c’est le cas, le logiciel peut envoyer un mail et optionnellement, mettre à jour le système pour vous.

Installation de cron-apt:

sudo aptitude install cron-apt

Il faut ensuite configurer votre adresse mail dans le fichier /etc/cron-apt/config. Par défaut cron-apt s’exécute automatiquement tout les matins à 4h00.

Voici un exemple de mail envoyé:
Pour les machines sous Fedora, il existe une fonction équivalente directement dans Yum (lire ce billet pour plus d’informations).

Tuning de la sécurité

Configurer les paramètres de sécurité réseau par défaut dans le fichier  /etc/sysctl.conf.

Vous pouvez vous inspirer des billets suivants pour effectuer cette configuration:

Protection contre les « forks bombs »

Une attaque par « forks bombs » est de type DOS (Deny Of Service) qui utilise la commande système fork. Pour se protéger de telle attaque et limiter leurs impacts sur le reste du système,  il faut éditer le fichier /etc/security/limits.conf et y ajouter les lignes suivantes (en adaptant « username » à vos besoins):

username soft nproc        300

username hard nproc        350

username soft nice         0

username hard nice         0

username soft priority     5

username hard priority     5

username –    maxlogins    10

Ces limitations empêchent un utilisateur de se logguer plus de 10 fois sur la machine (en SSH notamment), de lancer plus de 350 processus simultanément (empêche les forks-bombs) et met une priorité faible a ses tâches par défaut (haute priorité < 0, normal 0, basse priorité > 0).

Source: http://www.cyberciti.biz/tips/linux-limiting-user-process.html

Firewall

Ne laisser passer que les flux réseaux utiles à l’utilisation de votre serveur par les utilisateurs (HTTP / HTTPs) et l’administration (SSH).

Concernant le protocole SSH, on lit souvent qu’il faut changer le port d’écoute du daemon SSHd (par défaut TCP/22). Mise à part le bloquage de certains scripts automatique, je ne pense pas que cette sécurité soit suffisante. En effet, un simple scan de votre machine avec Nmap permettra de retrouver facilement le port d’écoute.

Une solution plus efficace pour protéger cette porte d’entrée sur le serveur est d’utiliser la technique du “portknockers”. Avant de s’ouvrir, on doit taper à la porte de notre serveur en  envoyant une séquence de requêtes vers des ports prédéfinis. Par exemple avant de ce connecter en SSH sur le port TCP/22, il faudra envoyer “taper à la porte” des ports 2222, 3333 et 4444.

Le programme knockd permet de configurer facilement un “portknockers” sur son serveur Linux: https://help.ubuntu.com/community/PortKnocking

Fail2Ban analyse les logs de votre système et bloque automatiquement les indésirables au niveau du firewall iptables, ce qui est très efficace. Vous pouvez aussi bloquer manuellement des plages d’IPs considérées comme “malfaisantes”, il m’est arrivé de bloquer un pays entier cas de nombreux tentatives de piratage provenaient de ce site, et qu’aucun visiteur en provenance de ce pays ne viennent sur mes sites (bon c’est vrai cela fait un peu censure :)).

A installer à partir des sources:

sudo aptitude install fail2ban

Le fichier de configuration par défaut est /etc/fail2ban/jail.conf. Vous pouvez notamment y configurer les adresses IP à ignorer (par exemple l’adresse IP publique ou le nom d’hôte de votre propre box):

ignoreip = 127.0.0.1 home.mondomaine.com

Et également ajouter ou modifier les prisons (jail) pour des services spécifiques. Par exemple pour le serveur pure-ftpd:

#

# FTP servers

#


[pure-ftpd]

enabled = true

port = ftp,ftp-data,ftps,ftps-data

filter = pure-ftpd

logpath = /var/log/messages

maxretry = 6

Pour aller plus loin dans la configuration de fail2bna, vous pouvez lire ce billet.

Autres idées en vrac

  • instaurer des quota disk stricts par utilisateur (quotatool) : très utile pour éviter de bloquer tous ses sites à cause d’un script mal codé.
  • empecher le reboot par syskey /etc/inittab : intéressant mais peu utile, une personne avec un accès physique à votre serveur peut de toute façon faire à peu prêt tout ce qu’elle veut.
  • utiliser rsyslog pour envoyer les logs sur un serveur distant, sans accès de modification/suppression de logs de préférence : permet d’analyser les actions d’un pirate après détection du piratage (un pirate ne peut pas effacer toutes les traces laissées par les tentatives de piratage infructueuses). Un peu cher à mettre en place pour un site perso.

Les commentaires sont ouverts pour nous faire partager votre expérience dans la sécurisation de vos sites Internet.

Sources ayant servies à la rédaction de ce billet:

Catégories
Blog Open-source

Nicolargo is back…

Voilà, après deux semaines de coupure le blog de Nicolargo est de nouveau en ligne…

Retour en arrière le mercredi 11 août 2010. En congés depuis 2 semaines et comme tout les jours je profite de ma superbe connexion « Edge super bas débit » pour consulter mes mails depuis mon smartphone. J’apprend alors que mon blog a été hacké pendant la nuit (au passage, merci à tout les lecteurs pour vos message d’alertes, vous êtes encore plus rapide que Nagios :)).

Je me retrouve dans la pire situation pour une webmaster: ne rien pouvoir faire… Pas de PC, pas de connexion Internet…

Le lendemain matin, iWeb (mon hébergeur au moment du hack) bloque mon compte pour d’évidentes raisons de sécurités… Le blog de Nicolargo n’existe plus sur la toile…

Je décide alors de laisser tomber l’affaire et d’attendre mon retour de congés pour intervenir. Pas envies de gâcher mes vacances à cause d’un hacker pré-pubère qui cible de manière aléatoire ses cibles. A l’heure actuelle, je ne sais pas si le hack vient de WordPress (j’ai pu laisser passer une mise à jour quand j’étais en congés) ou d’un plugin…

A mon retour (hier), voici les actions que j’ai menées:

  • Récupération des sauvegardes datant du 1 août (fichiers + base de donnée)
  • Modification du DNS du domaine nicolargo.com pour faire pointer sur un Gandi Serveur
  • Installation Apache + MySQL sur le serveur
  • Installation de la dernière version de WordPress (depuis le SVN)
  • Restauration des fichiers et de la base de donnée
  • Sécurisation du blog en suivant ce tutoriel
  • Tests et validations internes
  • Mise en ligne

Il me reste a surveiller la montée en charge du serveur en adaptant le nombre de part pour le blog si nécessaire (je suis pour l’instant sur 1 part avec 512 Mo de RAM).

Les impacts du hack  ne sont pas négligeables, outre le stress et la perte de temps, je ne suis pour l’instant plus référencé dans Google (sic…), je perd donc 80% de mon trafic…

Mea culpa pour ma coupable négligence qui a surement pénaliser des lecteurs voulant trouver des informations sur le blog et encore merci à toute la communauté qui n’a pas hésité à proposer son aide via mon compte twitter.

A bientôt sur le blog pour de nouveaux billets !

PS: le nouveau thème est presque finalisé… Il devrait être disponible début septembre.

Catégories
Open-source Reseau Web

Cracker un réseau Wifi sous GNU/Linux

Article supprimé le 31 janvier 2015 à la demande de la gendarmerie nationale.

Catégories
Open-source Reseau

Tunnel HTTP pour faire du SSH depuis le bureau

Vous êtes coincé à votre bureau, derrière un beau Firewall qui bloque, mis à part le HTTP, tous les autres protocoles. Au même moment, le site Web hébergé sur votre serveur perso plante… Dans ce cas, il faut attendre le soir, rentrer chez vous pour enfin pouvoir se connecter en SSH sur votre serveur et résoudre le problème.

Il existe cependant une astuce qui moyennant un brin de préparation va vous permettre de faire passer le SSH à travers ce vilain Firewall…

Principe

La théorie est la suivante: nous allons créer un tunnel HTTP entre le PC du bureau et le PC de la maison. C’est possible car le tunnel est basé sur un protocole autorisé par le Firewall de votre entreprise (HTTP dans notre cas mais vous pouvez utiliser n’importe quel protocole TCP). Ensuite, il faudra rediriger sur votre PC de bureau le protocole SSH vers le tunnel HTTP. Une fois que les paquets SSH sont récupérés sur le PC maison, il n’a qu’a les envoyer vers votre serveur.

   

Préparation de la configuration maison

On commence par installer le logiciel HTTPtunnel sur notre PC maison (exemple d’installation sous Ubuntu):

sudo apt-get install httptunnel

Ensuite on lance la commande suivante:

sudo hts –forward-port A.B.C.D:22 80

Cette commande va écouter sur le port TCP/80 (comme c’est un port < 1024 on doit lancer cette commande en root, d’ou l’utilisation de sudo) et rediriger le trafic vers le serveur (d’adresse ip A.B.C.D dans mon exemple) et sur le port SSH (TCP/22).

Ensuite il faut penser à configurer votre *box pour:

  • autoriser les flux HTTP (TCP/80) entrant à destination de l’adresse publique de la *box votre maison (règle de Firewall)
  • rediriger les flux HTTP (TCP/80) à destination de l’adresse publique de la *box votre maison vers l’adresse privé de votre PC maison (règle de NAT/PAT)

Configuration du PC bureau

Si vous avez la chance de travailler sur un OS de type GNU/Linux à votre bureau, la prcédure est alors relative simple.

On commence par installer HTTPtunnel sur notre PC bureau (exemple d’installation sous Ubuntu):

sudo apt-get install httptunnel

Ensuite on lance la commande suivante:

htc –forward-port 2222 E.F.G.H:80

Cette commande va écouter sur le port TCP/2222 (comme c’est un port >
1024, il n’est pas nécessaire de lancer cette commande en root)
et rediriger le trafic vers le PC maison (d’adresse ip E.F.G.H dans mon
exemple) et sur le port HTTP (TCP/80).

Si votre entreprise oblige les flux Web à transiter par un proxy HTTP (d’adresse S.Q.U.I avec une authentification USER/PASSWORD), il faudra ajouter les paramètres suivants à la ligne de commande:

htc -P S.Q.U.I –proxy-authorization USER:PASSWORD –forward-port 2222 E.F.G.H:80

Dans le cas ou votre PC de bureau est sous Windows (snif), il va falloir passer par une configuration du client Putty par exemple en suivant cette procédure.

Lancement du client SSH

Il suffit de lancer la commande suivante à partir de votre PC de bureau:

ssh localhost -p 2222

Vous serez alors connecté sur votre serveur ! 🙂