VTFFAAS – Projet Python

Cela commençait à faire quelques temps que je n’avais pas réellement codé car j’avais surtout tendance à faire du système ou du réseau. Du coup, pour les besoins d’une présentation dans le cadre du Laboratoire Web de mon école, je me suis penché sur les possibilités qu’offrait Python dans le développement Web.

J’ai commencé par regarder les possibilités qu’offrait python seul puis je suis passé à des micro-framework comme Bottle Py ou Flask. Je n’ai pas encore poussé les recherches jusqu’à Django qui supporte enfin la version 3 de Python.

J’ai donc voulu me faire un petit POC pour cette présentation et j’ai réfléchis à ce que je pouvais faire qui soit assez parlant. Il en est ressorti ceci : http://vtffaas.com/

Va Te Faire Foutre As A Service est une plateforme conçue pour permettre facilement de dire à quelqu’un d’aller de se faire foutre.

Le principe de cette plateforme est simple, différents messages sont pré-configurés et on peut les appeler en modifiant certaines variables directement depuis l’URL. Un raccourcisseur d’URL va bientôt être intégré sur la plateforme.

Mine de rien, même si l’utilité d’une telle plateforme est bien évidemment discutable, au niveau du panel d’options vues, elle est très intéressante. J’ai ainsi pu voir les redirections, la manière de traiter les fonctions Python en fonction des appels Web, les connexions à la base de données, les déploiements standalone comme au travers d’Apache, …

En tout cas, Python, bien qu’encore handicapé par le méli-mélo permanent qu’est l’existence de 2 versions non compatibles entre elles du langage, offre des possibilités et des temps de réponse parfaitement adaptés au Web.

Importer plus de 2Mb dans WordPress

Comme je l’ai expliqué précédemment, WordPress offre la possibilité d’importer le contenu d’un ancien blog WordPress depuis son interface Tools -> Import (ou Outils -> Importer). Une fois que l’on a réussi à ajouter le plugin d’import WordPress sans connexion FTP, on peut se retrouver devant un autre problème.

En effet, si toutes les configurations ont été laissées par défaut, il n’est pas possible d’importer un fichier de plus de 2Mb. Quand un blog commence à avoir un peu de bouteille, cette limite est très vite atteinte et, de facto, l’import échoue. Il va donc falloir augmenter cette taille.

Il existe plusieurs manière de faire mais je ne vais traiter que celle qui ne modifie les possibilité d’import qu’au blog WordPress concerné et pas à tous les sites hébergés sur le même serveur.

Configuration pour un élément unique implique : le .htaccess. Il va en effet être nécessaire de rajouter à celui ci, présent à la racine de votre blog (s’il n’existe pas, il vous suffit de le créer sans oublier le « . » au tout début), les lignes suivantes :

php_value post_max_size 16M
php_value upload_max_filesize 16M

Il peut être nécessaire de redémarrer votre serveur Apache (ou HTTP de manière globale si vous n’utilisez pas Apache) pour que ces configurations soient prises en compte. Vous aurez alors la possibilité d’uploader un fichier pesant jusqu’à 16Mb. Si ceci n’est toujours pas suffisant, il n’y a qu’à remplacer dans ces deux lignes la valeur « 16M » par la valeur de votre choix.

Apache 2 après passage à Ubuntu 13.10

Pas mal de problèmes sur le serveur ces derniers jours. J’ai eu la bonne idée de faire la mise à jour depuis Ubuntu 13.04 à Ubuntu 13.10 sur le serveur. Du coup Apache a été mis à jour (bonne chose) mais beaucoup de choses ont changé (mauvaise chose).

La première chose à savoir si le problème vous arrive aussi c’est qu’apache, dans ses nouvelles configurations, n’accepte plus les fichiers de configuration de site qui ne finissent pas en « .conf« . Moi qui les avais tous nommés en fonction du nom du site(domaine/sous-domaine), j’ai dû renommer tous mes fichiers de config pour rajouter l’extension magique.

Une fois que ceci était fait, il m’a fallut supprimer les anciens lien symboliques rajoutés par apache lors des mes précédents a2ensite et présents dans /etc/apache2/sites-enabled/ en faisant :

cd /etc/apache2/sites-enabled/
rm *

De plus, mes fichiers de configuration possédaient des «  » lorsque je voulais désactiver une option mais jamais de « + » lorsque je voulais en ajouter une. Je me contentais par exemple de marquer

Options -Indexes FollowSymLinks MultiViews

Il faut donc reprendre tous les fichiers pour rajouter les « + » qui ont l’air d’être devenus obligatoires donnant donc :

Options -Indexes +FollowSymLinks +MultiViews

Voilà tous les fichiers de configuration de sites sont désormais valides il ne reste plus qu’à activer soit site par site ceux que l’on désire mettre en place soit d’un coup d’un seul tous ceux disponibles en faisant :

a2ensite *

La plupart du temps, les anciens fichiers de configurations ont été conservés et le nouveau fichier de configuration a été mis à côté avec pour extension « .dpkg-new« . Cependant l’ancien est toujours effectif. Dans le doute j’ai quand même refait mes configurations dans le nouveau fichier histoire de ne pas prendre de risques.

Cependant, si vous n’aviez jamais touché un fichier de config, il a été remplacé par la nouvelle version. Dans mon cas, ceci n’a pas été un franc succès puisque le dossier de base des fichiers de site du serveur était revenu à sa valeur par défaut à savoir /var/www/

J’ai donc changé dans le fichier /etc/apache2/apache2.conf les lignes

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

par le bon dossier et les bonnes options.

J’ai aussi eu la désagréable surprise de voir que le module php5-json n’était plus installé. Mais pour régler le problème un petit

apt-get install php5-json

et le voilà installé. Plus qu’à faire

service apache2 restart

et voilà un apache qui refait ce qu’on attend de lui.

En conclusion, je dirais que là la solution était relativement simple donc même si ce n’était pas la meilleure des surprises, le problème se corrigeait rapidement. Cependant, pour ceux qui ne savent pas trop gérer les fichiers de config, la tâche aurait pu s’avérer compliquée. Ne faites donc les mises à jour de version d’Ubuntu sur votre serveur qu’en gardant en tête que bien des choses peuvent ne pas se passer comme prévu. Gardez vous quelques heures/jours devant vous quand vous réalisez ce genre d’opération.

EDIT : Une petite précision après quelques recherches. Ce tuto s’applique sur Ubuntu de fait car les versions intégrées entraîne ce problème mais la résolution peut être la même du moment qu’Apache passe d’une version 2.2.X à 2.4.X. (Dans mon cas 2.2.22 à 2.4.6)

Différentes manières de désactiver l’indexage des dossiers dans Apache2

Dans les dossiers de site internet, Apache va chercher à ouvrir les fichiers qui ont été configurés par défaut (la plupart du temps ce sera index.html ou index.php). Si ces derniers ne figurent pas, Apache va faire un listing des fichiers/dossiers qui sont présents. Ceci peut être particulièrement dangereux si vous possédez des fichiers personnels que vous ne souhaitiez pas partager ou si une personne malveillante s’en sert pour repérer l’arborescence du site et pour repérer les pages d’administrations par exemple.

Il existe plusieurs manières de désactiver ce listage par défaut :

1/ La première consiste, à modifier le fichier de configuration globale d’Apache ou des Virtual Hosts indépendamment en indiquant l’option :

Options -Indexes

On pourra aussi ajouter l’option -FollowSymLinks pour désactiver le suivi des liens symboliques.

2/ La deuxième consiste, si la directive AllowOverride Indexes ou AllowOverride All est activée, à rajouter :

Options -Indexes

dans le fichier .htaccess du répertoire qui ne doit pas afficher l’index. Elle s’appliquera récursivement à tous les sous-dossiers.

3/ Enfin, la dernière solution consiste à désactiver le module autoindex d’apache. Pour ce faire on peut procéder en commentant la ligne

LoadModule autoindex_module modules/mod_autoindex.so

dans le fichier httpd.conf. ou alors en désactivant en ligne de commande le module en tapant :

a2dismod autoindex

Installation d’un serveur web sous Debian

J’avais lors d’un précédent post, expliqué comment installer WordPress sur son serveur Web mais je n’avais pas expliqué comment installer ce serveur.

On partira donc du principe que l’on a besoin de mettre en place un serveur HTTP, un interpréteur PHP, un SGBD (Système de Gestion de Base de Données) et un serveur FTP. De plus pour le contrôler facilement à distance on utilisera le protocole SSH.

Tout d’abord le choix de la distribution. Ayant toujours utilisé des distributions basées sur Debian et Debian étant réputé pour sa stabilité, il m’a semblé évident de prendre cette distribution comme base. De plus les installations sont facilitées grâce à des dépôts bien remplis (pas toujours à jour, mais fournis).

Ainsi, après une installation standard de cette distribution, enfin, en tout cas sans gestionnaire de fenêtre vu que c’est pour un serveur, nous allons passer à la phase d’installation.

Les logiciels que j’ai choisis d’utiliser pour combler tous nos besoins sont :

  • Serveur HTTP : Apache
  • Serveur FTP : vsFTPd
  • Serveur SSH : openSSH
  • interpréteur PHP : PHP5
  • SGBD : MySQL

Nous allons commencer par installer openSSH afin de pouvoir administrer le serveur à distance par la suite à l’aide de la commande :

apt-get install ssh

Nous verrons les configurations à apporter à chaque logiciel par la suite. Installons maintenant le serveur Apache à l’aide de la commande :

apt-get install apache2

Puis PHP et son module pour apache en tapant :

apt-get install php5 libapache2-mod-php5

Pour MySQL, Debian se charge normalement tout seul de récupérer les paquets qui permettent les interactions avec PHP. Dans le cas contraire il faudra les rajouter en plus (paquet php5-mysql). On tapera donc :

apt-get install mysql-server

Un mot de passe root est demandé à ce moment là. Bien penser à en mettre un fort.

Nous allons enfin installer vsFTPd en tapant :

apt-get install vsftpd

Maintenant que tous les logiciels dont nous avons besoin sont installés, il va nous falloir les configurer. Toujours garder en tête cependant que les configurations sont la partie la plus personnelle de ce genre de mise en place car elles dépendent principalement de ce que l’on désire faire. Je ne détaillerais pas les configurations d’SSH car j’ai déjà mis un exemple détaillé dans ce post ci.

Commençons donc avec la configuration d’Apache. Un fichier de configuration extrêmement important est le fichier /etc/apache2/conf.d/security. C’est ce fichier qui déterminera le niveau de détail des messages d’erreur. Pour un serveur en production, afin d’éviter toute fuite d’information sensible en cas de faille, on mettra les lignes :

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Pour un serveur de développement, le but étant d’obtenir un maximum d’informations, on mettra :

ServerTokens Full
ServerSignature On
TraceEnable Extended

La configuration de base d’Apache donne le dossier /var/www/ comme dossier du site principal. On peut héberger plusieurs sites sur un seul serveur en rajoutant des fichiers de configuration dans le dossier /etc/apache2/sites-available/ (De manière globale, tout fichier présent dans ce dossier est inclus dans le fichier de configuration au lancement d’Apache). Une configuration minimale de site possible est :

<VirtualHost <ADRESSE_DU_SERVEUR>:<PORT_DE_CONNEXION>>
ServerName <NOM_DU_SERVEUR>
ServerAdmin <ADRESSE_DU_WEBMASTER>

DocumentRoot <DOSSIER_DU_SITE>
<Directory <DOSSIER_DU_SITE>>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

CustomLog <URI_DU_FICHIER_DE_LOG> combined
LogLevel warn
</VirtualHost>

Pour plus de détail on peut aller sur la documentation officielle d’Apache sans oublier les conseils sur la sécurité. On pourra, selon la distinction que l’on voudra faire entre les différents sites web (différentes adresses IP, différents ports de connexion), utiliser cette page de documentation ou celle ci pour choisir ses options.
Vous remarquerez le -Indexes qui permet de ne pas lister le contenu d’un dossier lorsque le fichier index.html ou index.php n’existe pas. Pour d’autres options de sécurités on peut aller voir par là.

Il ne reste alors plus qu’à activer le site nouvellement configuré à l’aide de la commande

a2ensite <NOM_DU_FICHIER_DE_CONFIGURATION>

et à redémarrer apache (nous ferons ceci à la fin).

En ce qui concerne PHP, je ne rentrerais pas dans les détails de la configuration car ils sont beaucoup trop dépendants de ce que l’on souhaite mettre en place. De plus, ceux de base conviendront la plupart du temps.

La configuration de MySQL étant plus une configuration par base de données que dans sa globalité, les paramètres originaux feront largement l’affaire. Cependant, il ne faudra pas oublier de créer un nouvel utilisateur pour chaque base afin d’améliorer la sécurité et de ne pas laisser traîner le mot de passe root quelque part. J’avais détaillé le script de création dans mon post sur la mise en place de mon blog.

Il nous reste enfin à configurer vsFTPd. Mon choix s’est porté sur ce logiciel plutôt que sur ProFTP, qui est le plus souvent cité lorsque l’on cherche un serveur FTP, car, notamment, il a été conçu en étant orienté sécurité. Le fichier de configuration est /etc/vsftpd.conf. Il est bien détaillé et facile à paramétrer. On peut choisir de chrooter les utilisateurs, utiliser le serveur en IPv4/IPv6, autoriser l’accès anonyme, etc … J’ai détaillé une des configuration que j’utilise sur l’un de mes serveurs dans ce post.

Il suffit ensuite soit de redémarrer la machine (le plus simple), soit de redémarrer tous les services, après configuration. On peut les relancer un par un à l’aide des commandes :

/etc/init.d/apache restart
/etc/init.d/ssh restart
/etc/init.d/vsftpd restart

On a alors un serveur HTTP/FTP/MySQL/SSH prêt à être utilisé.

Configuration et mise en place de WordPress

Voici un petit article uniquement consacré à WordPress puisque j’ai décidé de l’héberger moi même désormais.

Après pas mal de temps à chercher quels étaient les droits à donner aux différents dossiers pour que WordPress cesse de m’afficher des erreurs de permissions dès qu’il essaye de faire quelque chose, je me suis rendu compte qu’il suffisait d’attribuer www-data comme utilisateur et groupe pour que tout fonctionne. En réalité, j’ai fait un wget pour récupérer la dernière version directement sur le serveur et je l’ai décompressée (tar -xzf latest.tar.gz). Il s’est chargé de conserver les droits.

En ce qui concerne la base de donnée MySql, je voulais créer un utilisateur de blog qui aurait la possibilité de gérer toute la base sans pouvoir toucher aux autres.
J’ai donc fait :

CREATE DATABASE <NOM_DE_LA_BASE>;
GRANT ALL PRIVILEGES ON `<NOM_DE_LA_BASE>`.* TO '<LOGIN>'@'localhost' IDENTIFIED BY '<MOT_DE_PASSE>';

J’obtiens ainsi un utilisateur qui a un accès total à la base de donnée de WordPress, qui ne peut se connecter qu’en local et qui ne peut pas toucher à mes autres BDD.

Pour ce qui est de la réécriture des liens afin d’avoir des permalinks facilement lisibles, j’ai dû activer le module rewrite d’apache en tapant la commande :

a2enmod rewrite

Il m’a fallut ensuite modifier dans /etc/apache2/site-available le fichier default en remplaçant dans la sous-catégorie correspondante à mon site (en l’occurrence <Directory /var/www>) « AllowOverride None » par «  »AllowOverride All ».

Il ne me reste alors plus qu’à configurer le CMS depuis l’interface d’installation disponible depuis l’adresse du site.