Changer le message d’accueil de votre terminal

Lorsque vous lancez un shell sous votre Unix préféré (que ce soit GNU/Linux ou un BSD ou OS X), un petit texte est affiché avant le prompt, c’est le MOTD (Message Of The Day). Ils sont souvent austère, comme c’est le cas sur les serveurs d’hébergement Gandi :

[---------------------------------------]
  Gandi - Welcome to your new OS image.
[---------------------------------------]

Pour le changer pour quelque chose de plus joyeux il suffit de modifier le fichier /etc/motd en tant que root !

Petite astuce, vous pouvez utiliser un FIGlet-like pour créer un logo en art ASCII !

Nouvelle offre d’hébergement à bas prix chez Gandi : installez votre serveur web

Gandi m’a gentiment fourni une invitation à la bêta de leur service d’hébergement. Je compte y passer ce blog et voir comment se comportent les frameworks Symfony et Django sur ces serveurs virtualisés et scalable.

J’ai donc pris une part (6€ HT/mois) afin d’y installer un serveur web composé d’Apache, de PHP, de MySQL et géré par hosting.py.

Première opération, créer le serveur. J’ai choisi le mode expert et Ubuntu comme distribution (c’est le choix par défaut). Tout ce fait très simplement via le site internet de Gandi. Quelques minutes après la création du serveur via l’interface un mail arrive vous indiquant l’adresse IP de votre serveur tout neuf.

C’est une version personnalisée par Gandi de Gutsy qui est installée, un peu vieille mais très stable, cela me convient parfaitement.

Première opération : mettre à jour la distribution.

Connectez vous via SSH puis passez en root en tapant su (un peu perturbant pour une Ubuntu n’est-ce pas :P) puis tapez la classique commande apt-get update && apt-get dist-upgrade. Cette mise à jour est importante car elle corrige certaines failles de sécurité critiques dont celle désormais célèbre touchant le protocole DNS.

Installer Apache, PHP et MySQL

La commande magique pour installer le tout : apt-get install apache2 mysql-server php5 libapache2-mod-php5 php5-mysql phpmyadmin.

L’utilitaire d’installation vous demandera d’abord de choisir un mot de passe pour le compte root du serveur MySQL puis de sélectionner quel version d’Apache doit être configurée pour être utiliser avec phpMyAdmin : choisissez apache2.

Vous pouvez taper l’adresse IP de votre serveur dans votre navigateur préféré afin de vérifier que tout fonctionne bien. phpMyAdmin est accessible depuis http://<votre_ip>/phpmyadmin/.

Une petite amélioration afin d’augmenter les performances : installons xcache. Comme son nom l’indique, xcache permet de mettre en cache les versions “compilées” des scripts PHP (opcode) et ainsi d’améliorer grandement les performances du langage le plus populaire du web.

Rien de plus facile : apt-get install php5-xcache. La commande /etc/init.d/apache2 restart vous permettra de rendre effective la mise en cache.

Sécurisons tout ça

Très bien, notre serveur fonctionne. Mais ce n’est pas encore la panacée. Une simple requête HTTP GET nous renvoi comme en-têtes :

Date: Tue, 12 Aug 2008 19:51:49 GMT
Server: Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.4
Content-Length: 746
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html;charset=ISO-8859-1

Les en-têtes HTTP sont riches, trop riches : on y apprend que le serveur fonctionne sous la distribution Ubuntu Linux, que le serveur web est Apache en version 2.2.4, que le langage de script PHP en version 5.2.3 est disponible et que les versions installées sont celles pacagées par la distribution (ce qui donne des indices supplémentaires sur la configuration utilisée). Ces informations sont en partie reprises dans les pages d’erreurs et les index générés automatiquement du serveur web.

Même si cacher les noms et numéros de versions des logiciels installés n’améliore pas la sécurité réelle de votre serveur elle le rend moins visible des pirates en herbe et autres robots des amateurs de warez.

Pour masquer les informations distillées par Apache éditons le fichier /etc/apache2/apache2.conf, remplaçons la ligne ServerTokens Full par ServerTokens Prod puis ServerSignature On par ServerSignature Off.

Pour celles que fourni PHP c’est dans /etc/php5/apache2/php.ini que ça se passe. Remplacez expose_php = On par expose_php = Off. Même si cela n’a rien à voir avec les numéros de versions, ça peut être une bonne idée de désactiver églament les magic quotes en remplaçant magic_quotes_gpc = On par magic_quotes_gpc = Off.

Relançons encore une fois Apache /etc/init.d/apache2 restart afin de faire prendre en compte nos modifications, c’est mieux.

Reste MySQL. Nous avons défini un mot de passe pour le compte root lors de l’installation mais il reste quelques brèches importantes comme la possibilité de se connecter sans compte ou celle d’utiliser le compte root depuis l’extérieur (sans passer par une console SSH ou phpMyAdmin – ce qui facilite les attaques par force brute).
Un script fourni nommé mysql_secure_installation permet de remédier à tous ces problèmes. Lancez-le. Excepté pour le changement de mot de passe root que nous venons de définir lors de l’installation je vous conseil de répondre par le choix proposé par défaut à toutes les questions.

Notre serveur est un peu mieux préparé à survivre dans la jungle qu’est le web.

Note : nous n’abordons ici que la sécurisation des composants LAMP de notre serveur. C’est un bon début mais c’est loin d’être une protection absolue ou suffisante.

Installer hosting.py

hosting.py est un petit logiciel que j’ai développé qui permet de gérer de manière très simple des comptes web. Il se base sur le système de gestion des utilisateurs UNIX et automatise les tâches les plus courantes lors de l’administration d’un petit serveur web mutualisé à savoir la mise en place et la modification de compte comprenant un utilisateur UNIX (accès SSH, FTP, …), un hôte virtuel apache, un compte et une base de données MySQL.

Il est conçu pour fonctionner avec les distributions basées sur Debian, Ubuntu en particulier. Il permet de simplement séparer les comptes des différents sites qu’hébergera votre serveur, ce qui n’est pas un mal question sécurité.

Commençons par installer les dépendances nécessaires à la récupération et à l’utilisation de mon script : apt-get install subversion python-mysqldb

Créons maintenant le squelette du répertoire de base des comptes web :

  • mkdir /etc/skel-www
  • mkdir /etc/skel-www/logs
  • mkdir /etc/skel-www/public_html

Comme son nom l’indique, logs accueillera les logs de connexion d’Apache (on pourra plus tard configurer AWstats pour générer des statistiques) et public_html sera le répertoire web de nos utilisateurs.

Récupérons la dernière version de hosting.py via Subversion : svn checkout http://debian-hosting.googlecode.com/svn/trunk/ debian-hosting-read-only

Éditez la variable MYSQL_PASSWD du fichier debian-hosting/hosting.py pour qu’elle contienne le mot de passe MySQL de l’utilisateur root puis donnez les droits en exécution sur ce même fichier en tapant chmod a+x debian-hosting/hosting.py.

Pour créer un compte utilisateur, passez en root avec la commande su puis tapez debian-hosting/hosting.py add monsite.com. Vous pouvez voir les informations de connexion s’afficher, notez les 🙂

Un sous domaine du type monsite.com.dunglas.fr est automatiquement créé (pour être effectif, il nécessite que dunglas.fr, notre domaine de test, dispose d’un wildcard dans ses entrées DNS).

Je vous conseil de le laisser à des fins de test et de debug, néanmoins un vrai nom de domaine c’est mieux. Toujours en tant que root éditez le fichier généré automatiquement nommé /etc/apache2/sites-available/monsite.com et transformez la ligne ServerName monsite.com.dunglas.fr en ServerAlias monsite.com.dunglas.fr. Ajoutez au dessus de celle-ci ServerName monsite.com.

Rechargez Apache (toujours en root) : /etc/init.d/apache2 reload

Votre serveur web est le site que vous avez créé sont fonctionnels si vos entrées DNS sont bien configurées. Placez vos fichiers web dans /home/monsite.com/public_html/ pour qu’ils soient visibles sur http://monsite.com 🙂

hosting.py 0.2 released

hosting.py is a web server account manager for Debian GNU/Linux and derivatives, such as Ubuntu Linux I am maintaining.

I am proud to announce that the version 0.2 is out !

hosting.py now supports MySQL accounts and databases management and his core is modular. The documentation as been rewrited and detailled.

hosting.py needs contributors. Testers and developers are wanted.

Downloads and details on Google Code.

Mon installation audio

Sur ce blog, je parle beaucoup d’informatique et un peu de musique. Quand je travail, comme quand je ne travail pas, j’aime bien avoir du bon son dans les oreilles !

Le casque

C’est mon acquisition la plus récente et j’en suis très content. Mon JVC HA-S350 m’accompagne partout, au travail (en open space relativement bruyant), dans le métro et même pour aller courir. Léger, robuste, très bon son et prix raisonnable, que demander de plus 🙂 Bien sur il est noir !

Oui, c'est mon casque !

Le baladeur

Très content de mon iPod shuffle de première génération (de forme rectangulaire et de couleur blanche) à l’autonomie démente et au son quasi parfait que j’ai maleuhreusement brisé. J’ai profité il y’a deux ans d’une offre qui m’a permis d’obtenir gratuitement un iPod nano avec mon Macbook. Plus design et disposant d’un écran, c’est mon compagnon de tous les instants. Le son est très bon et l’autonomie plus que correcte. Il dispose de fonctionnalitées avancées tel que le stockage et l’affichage de photos ou la gestion du carnet d’adresse, fonctionnalitées que j’avoue ne jamais avoir utilisé 😛
Seul regret, contrairement à mon ancien iPod shuffle, le nano nécessite un câble pour être rechargé via le port USB d’un ordinateur, plutôt encombrant et gênant à transporter.

Les enceintes

Question enceintes, je reste fidèle à mon kit Altec Lansing comprenant deux petits sattelites à la puissance exceptionnelle et un efficace caisson basse. Elles commencent à dater mais restituent toujours le son de manière très fidèle et disposent d’un volume suffisant pour se faire entendre même lors d’une soirée bruyante.

Les lecteurs

J’utilise en fait trois lecteurs :

Tous les trois ont une interface similaire, un bon support de l’iPod et un son plus que correct. Ils permettent de facilement retrouver les morceaux que l’on souhaite écouter, gèrent les playlists, affichent les couvertures des albums et sont supportés par Last.fm. A noter que iTunes contrairement aux deux autres n’est pas un logiciel libre.

Rhythmbox

Même si je n’ai aucune fascination particulière pour cette marque j’avoue utiliser beaucoup de produits Apple et en être très satisfait que ce soit au niveau du son, de la fiabilité ou du design. J’essaie de trouver des produits à bon rapport qualité prix qui font plaisir à mes oreilles, et c’est le cas pour tous ceux cités ici 🙂

hosting.py: Debian/Ubuntu webserver administration tool

hosting.py allows to easily create and manage accounts on shared servers running Debian GNU/Linux (and derivatives, such as Ubuntu Linux). It includes support for Apache virtual hosts, UNIX accounts, MySQL databases and privileges. hosting.py is a command line tool wrote in Python by Kévin Dunglas.

Philosophy

The philosophy behind this tools is “keep it simple”. hosting.py is designed for small web hosting services. hosting.py will not have advanced features like virtual mail or FTP account creation. It creates the base configuration and settings for a web hosting account. Mail, FTP or whatever must be handled by the configuration of the system to use the UNIX account.

Status

hosting.py doesn’t currently support MySQL user and database creation. This will be committed soon.

Install

hosting.py need Debian etch or Ubuntu and Python 2.5 to work. Get the source via SVN : svn checkout http://debian-hosting.googlecode.com/svn/trunk/ debian-hosting-read-only

It’s done ! Type python hosting.py --help to get started.

Optionally you can adjust the configuration by editing the variables in the head of the hosting.py file.

hosting.py: un gestionnaire de serveur web pour Debian/Ubuntu

hosting.py, c’est un petit script d’administration de serveurs Debian et ses dérivés (testé sous lenny et Ubuntu).

C’est un outils très simple destiné à gérer les utlisateurs d’un serveur Web (Linux Apache PHP MySQL). Il permet la création, la modification et la suppression d’utilisateurs UNIX et d’hôtes virtuels Apache. Le support des comptes MySQL n’est pas encore publié, mais il le sera bientôt !

La philosophie derrière ce petit programme écrit en Python est d’utiliser au maximum le compte UNIX plutôt que des utilisateurs virtuels pour chaque services. Configurez vos serveurs FTP, Mail et compagnie pour utiliser l’authentification UNIX.

Petit bonus, la gestion des utilisateurs pour le webmail RoundCube est fournie dans les commentaires.

Pour tester : svn checkout http://debian-hosting.googlecode.com/svn/trunk/ debian-hosting-read-only

Pour l’aide : ./hosting.py --help

hosting.py fonctionne en root (sudo ./hosting.py sur Ubuntu).

Mes projets à nouveau en téléchargement

Après avoir été séquestrés pas mal de temp dans ma cave numérique, mes projet peuvent à nouveau regagner l’air libre !

Retrouvez certains de mes projets sous licence libre en téléchargement ! On y trouve essentiellement des logiciels pour le web et pour Ubuntu Linux, jettez-y un oeil.

Les archives de Bienvenue chez moi enfin en ligne

Chose promise chose due !

Les archives de Bienvenue chez moi, mon ancien blog, sont désormais disponibles. Tous les commentaires et articles ont étaient restaurés. Vous y trouverez un grand nombre de tutoriels pour Ubuntu et Linux en général ainsi que les anciennes version de Easy Ubuntu, des modules pour PunBB, et des billets traitant de programmation (PHP, Python, DokuWiki, …).

Bienvenue chez moi c’est plus de 100 billets et de 15 000 commentaires, c’est quelques premières pages de Digg, et ce fut une partie de moi pendant un certain temps !

Des benchmarks sur les toutes nouvelles Dedibox

Iliad à vient d’annoncer une nouvelle mouture de son offre de serveurs dédiés à bas prix. Les Dedibox v2 ne sont plus basé sur des processeurs VIA mais sur des Intel Celeron. Elles se voient dotées de 1 Go de mémoire vive, d’un disque dur de 160 Go et d’une bande passante de 100 Mbits/s. Une nouvelle gamme baptisée Dedibox XL propulsée par des Core2Duo, 3 Go de mémoire, 500 Go d’espace disque et connexion 100 Mbits/s est également disponible.

C’est bien beau les annonces, mais vous préférez sûrement les chiffres. Ca tombe bien, Pierre, plus réactif que jamais, vient de publier un benchmark comparant ces nouvellles Dedibox avec les anciennes ainsi qu’avec les offres similaires chez OVH et Gandi. Un autre benchmark, publié par Dediadmin, est également disponible.

Un lecteur de flux RSS pour Android : la base de données intégrée

Après avoir réalisé notre tout premier programme avec Google Android, nous allons nous lancer dans la réalisation d’un projet un peu plus complexe : un lecteur de flux RSS.

Capture d’écran du lecteur de flux RSS

Ce sommaire lecteur de flux permettra juste de s’abonner, se désabonner et d’afficher des flux RSS. Vous pouvez récupérer l’archive incluant sources et binaires si vous souhaitez tester tout de suite le programme.

Présentation de SQLite

La plate-forme Android intègre le système de base de données relationnelle embarquée SQLite. SQLite est un mini SGBD ne nécessitant que peu de ressources, qui offre la possiblité de gérer facilement des bases de données de taille restreinte.

Comme son nom l’indique, SQLite s’utilise par le biais de requêtes SQL. Il est très bien intégré à Android, ce dernier propose un grand nombre de routines qui nous permettront d’interagir très simplement avec les données (par exemple, pour les afficher à l’écran). Nous l’utiliserons dans notre programme pour gérer la liste des flux RSS auxquels l’on est abonné.

Shéma de la base de donnée

Nous utiliserons un shéma assez simple pour notre base de donnée. Elle ne se constituera que deux trois colonnes :

_id url visit

Le champ _id est un nombre entier qui représente l’identifiant de chaque lien, il sera la clef primaire de notre table. Attention son nom est une convention Android / SQLite, veillez toujours à avoir une clef primaire nommée ainsi dans vos tables. Dans le cas contraire vous ne pourrez pas utiliser simplement les curseurs plus tard ! Ce champ est complètement géré par SQLite. Il s’occupera de l’incrémenter automatiquement et de veiller à sa cohérence.

Le champ url de type text contiendra l’adresse du flux RSS.

Le champ visit, qui n’a aucune utilisé dans l’état actuel du programme, pourrait servir à compter le nombre de chargement des flux RSS afin de les classer par ordre d’assiduité par la suite.

La classe Database

Nous allons placer tout ce qui a trait à la base de données dans une classe nommée Database. Après avoir créer un nouveau projet dans Eclipse, créez donc cette classe. Nous utiliserons deux variables qui portent sur tout la classe :

private SQLiteDatabase db;
  private RSSreader rss;

db permet d’agir sur la base de donnée tandis que rss représente le contexte, notre classe principale (nommée RSSreader). La variable rss nous permet d’utiliser les fonctions openDatabase et createDatabase fournies par la plate-forme.

Le constructeur ce contente d’instancier la variable rss et de lancer la procédure d’ouverture de la base de données.

public Database (RSSreader rss) {
 	this.rss = rss;
        open ();
 }

Cette procédure appelle la méthode fournie par Android openDatabase qui nous permettra d’interagir avec la base de donnée depuis la variable db. Si la base de données n’existe pas, on appelle la procédure qui la créera.

private void open () {
 	try {
    	    	db = rss.openDatabase ("rssreader", null);
    	 }
     	catch (FileNotFoundException e) {
    	 // Create the database
    	 createDb ();
     	open ();
     }
}

La procédure de création de la base de donnée :

private void createDb () {
    	String sql;
    /* Command to view the DB : sqlite3 data/data/net.lapinblanc.android.rssreader/databases/rssreader */
    try {
    	// Create the database
    	db = rss.createDatabase ("rssreader", 1, rss.MODE_PRIVATE, null);
    	sql = "CREATE TABLE IF NOT EXISTS feed(_id INTEGER PRIMARY KEY, url TEXT, visit INTEGER);";
    	db.execSQL (sql);
    	// Insert un example
    	    	add ("//dunglas.fr/feed/");
    	}
    	 catch (FileNotFoundException e) {
    	    	// TODO Auto-generated catch block
    	    	e.printStackTrace();
    	}
}

La base de donnée est ici privée (MODE_PRIVATE), c’est à dire que seul notre programme pourra y accèder. La création en elle-même revient à envoyer une requête SQL classique de création de table. Nous créons donc notre base de donnée nommée rssreader puis nous insérons un flux d’exemple (celui de ce blog) en appelant la procédure add.

La base de donnée correspond en fait à un fichier texte rangé dans le répertoire /data/data/votre.package/databases/. Pour vous y connecter lancez la commande adb shell dans un terminal. Vous voici avec un shell au sein du système Android (celui de l’émulateur dans notre cas). Il s’agit en fait de BusyBox tournant au-dessus d’un noyau Linux. Pour utilisez la base de donnée en mode shell lancez sqlite3 /data/data/net.lapinblanc.android.rssreader/databases/rssreader. N’oubliez pas les points virgules terminaux à vos requêtes vous les exécuter !

La procédure add prend en paramètre une url et l’ajoute à la base de donnée :

public void add (String url) {
    	/* Insert feed into the database */
       SQLiteStatement st = db.compileStatement("INSERT INTO feed(url, visit) VALUES ('?, 0)");
       st.bindString(1, url);
       st.execute(); 
    }

Ici aussi, le code est limpide, il s’agit de simples requêtes SQL comme si l’on agissait sur serveur de base de données classique.

Voyons maintenant comment supprimer un flux de la base de donnée :

public void delete (String url) {
    	db.execSQL("DELETE FROM feed WHERE url='" + url + "';");
    	SQLiteStatement st = db.compileStatement("DELETE FROM feed WHERE url='?';"));
    	st.bindString(1, url);
    	st.execute(); 
}

Dernière méthode, certainement la plus intéressante, celle qui renvoi la liste des flux dans la base de données :

public Cursor list () {
    	/* Return a Cursor on a list of stored RSS feeds */
       String [] selectionArgs = {};
       String [] columns = {"_id", "url", "visit"};
       return db.query (true, "feed", columns, null, selectionArgs, null, null, null);
}

Elle retourne un curseur, c’est ce curseur qui nous permettra plus tard de placer les flux dans une liste déroulante. Le tableau de chaines de caractères selectionArgs, ici vide, permet de spécifier des critères de sélection, formatés à la manière d’une clause WHERE dans une requête SQL. Le tableau columns permet d’indiquer quels colonnes nous souhaitons sélectionner, à la manière d’un SELECT en SQL. N’oubliez de sélectionner la colonne _id quelque soit votre requête. Sans elle l’utilisation ultérieur des curseurs sera beaucoup plus difficile.

Nous avons maintenant une base de donnée fonctionnelle et très légère sous Android. Dans le prochain article nous verrons comment créer une interface graphique pour gérer ces données.

Note : Merci à Infernal Quark d’avoir corrigé l’affreuse faille par injection SQL que j’avais laissé trainé…