CentOS 6 – Varnish & GeoIP

Linux Aucun commentaire »

centosNous allons voir comment déporter le système de géo-localisation IP sur Varnish.
L’objectif final est de permettre à vos backends de récupérer le Pays de l’utilisateur au sein de la requête HTTP.

Par défault, Varnish n’intègre pas de système de géo-localisation par IP, en revanche il existe quelques plugins qui permettent l’utilisation de GeoIP de MaxMind.

Voici les parties de l’article :

  • Installation de Varnish
  • Installation de GeoIP pour Varnish
  • Configuration du Varnish Module
  • Configuration de SELinux

A noter que nous avons opter pour le VMOD Geoip-vmod par leed25d. Contrairement aux autres plugins, celui-ci ne travail pas le header HTTP de manière autonome. Ce sera à vous de le faire, et grâce à cela vous allez pouvoir choisir comment…

Varnish

Pour compiler le VMOD, il vous faudra récupérer les sources de Varnish et les compiler même si vous choisissez l’installation par YUM.
De mon coté, je n’utilise pas en production la version que je compile mais la version provenant du dépot varnish-cache.org. A vous de voir.

Commençons par l’installation de Varnish via YUM (cf. Doc officielle):

rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm
yum install varnish

Pour compiler Varnish nous allons avoir besoin de quelques outils et des sources.

yum install pcre-devel make
cd && curl -o varnish-source.tar.gz http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz
tar -xvzf varnish-source.tar.gz

On lance la compilation de Varnish.

cd varnish-3.0.2/
./configure
make

Normalement, Varnish a été compilé dans votre repertoire $HOME/varnish-3.0.2/.

GeoIP VMOD

On récupère les sources sur github.

Après l’installation de quelques outils dont GeoIP, on lance la compilation du VMOD.
Attention, pour les version 32Bits utiliser VMODDIR=/usr/lib/varnish/vmods/.

yum install unzip automake autoinstall libtool geoip geoip-devel
unzip leed25d-geoip-vmod-[REVISION].zip
cd leed25d-geoip-vmod-[REVISION]
./autogen.sh
./configure VARNISHSRC=$HOME/varnish-3.0.2/ VMODDIR=/usr/lib64/varnish/vmods/
make
make install

Suite à l’installation Varnish, penser à ouvrir votre firewall.

#/etc/sysconfig/iptables
-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
service iptables restart

De même, il faut configurer Varnish pour écouter sur le port 80 à la place du 6081.

#/etc/sysconfig/varnish</strong>
VARNISH_LISTEN_PORT=80

Ensuite, on va vérifier que l’on peut lancer Varnish en chargeant le plugin GeoIP.

#/etc/varnish/default.vcl
#Top of file.
import geoip;

On va lancer le processus en debug pour voir si tout se passe bien :

varnishd -d -f /etc/varnish/default.vcl
start

Si vous n’avez pas d’erreur, c’est une bonne chose. Sinon, vérifier les étapes ci-dessus.

On va donc pouvoir inclure le pays de l’utilisateur dans le Header HTTP en suivant l’exemple de l’auteur du VMOD

#/etc/varnish/default.vcl
import geoip;
 
sub vcl_recv {
    set req.http.X-Forwarded-For = client.ip;
    set req.http.X-GeoIP = geoip.country(req.http.X-Forwarded-For)
}

Maintenant on va pouvoir mettre Varnish en démarrage automatique.

chkconfig varnish on
service varnish start

Attention:
Sachant que vous êtes sous CentOS, SELinux est surement activé et bloquera l’access au fichier de données /usr/share/GeoIP/GeoIP.dat. Vous pouvez le désactiver ou aller voir à la fin de l’article comment le configurer aux petits oignons.

setenforce 0

Et pour finir, un peu de ménage.

cd && rm -Rf varnish-* && rm -Rf leed25d-*
yum remove pcre-devel make unzip automake autoinstall geoip-devel

Pour aller plus loin

Avec la configuration ci-dessus,
Si un client de France se connecte directement à Varnish, lorsqu’une requête sera générée pour atteindre vos backends elle contiendra : X-GeoIP: FR

Vous pourrez donc récupérer le pays de l’utilisateur en analysant le contenu de la requête HTTP.
Il est à noter que GeoIP retourne le code pays « AA » lorsqu’il ne parvient pas à faire la détection.

Voici comment vous pouvez exploiter le contenu du header en PHP :

$headers = apache_request_headers();
$code = null;
 
if ($headers && is_array($headers) && array_key_exists("X-GeoIP", $headers)) {
    $code = $headers["X-GeoIP"];
}
 
if ((null == $code)||("AA" == $code)) {
    $code = $this->getDefaultCountry();
}
 
$code = strtoupper($code);

Retournons du coté de Varnish.
Comment les choses vont se passer si vous ajoutez un Proxy en amont de Varnish. Par exemple, Pound pour gérer le protocole HTTPS.

La detection du pays ne fonctionnera plus normalement car la valeur contenu dans le script VCL ‘client.ip‘ correspondra à l’IP de votre serveur Pound.

Nous allons donc devoir travailler avec un autre Header HTTP: X-Forwarded-For. Celui-ci permet de conserver l’historique des différents point de passage d’une requête HTTP et contient l’IP du client qui a initié la connection HTTP.

Lorsque les différents Proxy implementent correctement ce standard, le champs X-Forwarded-For contient l’IP du client, le proxy A, le proxy B, etc.. le tout séparé avec des virgules.

Voici comment en tenir compte au sein de votre configuration VCL :

sub vcl_recv {
    //...
 
    if (req.restarts == 0) {
        if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }
 
    set req.http.X-GeoIP = geoip.country(regsub (req.http.X-Forwarded-For, "(,.*)", ""));
 
    //...
}

Maintenant parlons un peu du système de cache de Varnish.
Si vous avez besoin de connaitre le pays de l’utilisateur, il y a donc fort à parier que le contenu retourné à l’utilisateur sera different en fonction de son Pays.

En résumé, pour une URL : /mon-url, en fonction du Pays utilisateur le contenu sera different.
Si on conserve la spécification par défaut de Varnish qui consiste à mettre en cache les données provenant d’une même URL, vous allez avoir quelques mauvaises surprises.

Voici comment tenir compte du pays de l’utilisateur pour gérer les données qui sont mises en cache.

sub vcl_hash {
    //...
 
    hash_data(req.url);
    hash_data(req.http.X-GeoIP);
 
    //...
 
    return (hash);
}

SELinux

Sous Centos, il y a SELinux.
Si vous n’êtes pas un expert en sécurité Linux. Voici comment faire fonctionner Varnish & GeoIP sans désactiver SELinux.
Le processus Varnish fait parti d’un contexte SELinux different du fichier GetIP.dat qui est installé avec GeoIP.
Du coup, nous allons faire un module pour SELinux afin d’autoriser varnish_t à lire les contextes de type usr_t.

mkdir ~/myvarnish; cd ~/myvarnish;
echo "policy_module(myvarnish, 1.0.0) optional_policy(\` gen_require(\` type varnishd_t; ') files_read_usr_files(varnishd_t) ')" > myvarnish.te
make -f /usr/share/selinux/devel/Makefile myvarnish.pp
semodule -i myvarnish.pp

Pour le coup, cette partie provient d’une discussion avec une personne sur #SELinux on freenode.

Mots-clefs :, , , , , , , , , , , , ,
 

Pound HTTPS 2 HTTP – Format Certificat

Infrastructure, Linux, Sécurité 1 Commentaire »

Au niveau de la configuration, Pound peut prendre un fichier .pem contenant les certificats du serveurs ainsi que des certificats intermédiaires jusqu’à l’autorité de certification ROOT.

Ce que je ne savais pas et que j’ai eu beaucoup de mal à trouver, c’est qu’il faut inclure la clé privée du certificat pour que Pound puisse démarrer.
Sans cette clé privée, voici l’erreur que vous pouvez avoir : SSL_CTX_use_PrivateKey_file Error

Du coups, voici le format à utiliser :

—–BEGIN PRIVATE KEY—–
Server key (pasted in the new key here)
—–END PRIVATE KEY—–

—–BEGIN CERTIFICATE—–
Server certificate
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
Verisign Intermediate CA (for Extended Validation Certificates)
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
Verisign Root CA (Self signed)
—–END CERTIFICATE—–

PS : Information trouvée sur une archive Mailing List :apsis

Mots-clefs :, , , , ,
 

Générateur de mot de passe

Projets 13 Commentaires »

Générateur mot de passe

L’installation de serveur nécessite la saisie de mot de passe. Vous pouvez utiliser le même mot de passe sur l’ensemble de vos serveurs, mais cela n’est pas secure du tout.

Afin de vous simplifier la création de mot de passe complexe, voici un Générateur de mot de passe.
Celui-ci crée de manière aléatoire des mots de passe de 10 caractères, contenant lettre majuscule, minuscule ainsi que des chiffres. Les symboles ne sont pas utilisés.

Il n’y a aucune option possible. L’intérêt étant d’avoir rapidement un mot de passe complexe. Les lettres portant à confusion ne sont pas utilisées : o, O, 0, i, I, l, L.

Générateur de mot de passe.

Edit 28 Janvier 2011 : En commentaires, Armaury parle du logiciel pwgen disponible dans les dépôts officiels des principales distributions.

Mots-clefs :, , , , ,
 

AMF / Zend Authentication using Database

Flash, Flex, Zend 20 Commentaires »

Cet article s’inscrit à la suite du précèdent billet : Authentification & Autorisation avec Zend AMF.

Zend_Amf_Adobe_Auth est une classe livré avec Zend 1.10. Elle peut être utilisée comme service d’authentification pour un serveur Zend_Amf_Server. Le soucis, c’est que cette classe fonctionne conjointement avec un fichier XML réputé statique.

Voici donc le code d’une classe qui permet l’authentification d’un utilisateur AMF via la base de données.
Sachant que nous développons cela pour offrir des services AMF, cette classe utilisera la logique métier implémentée au sein des services.

class Auth_AmfDatabase extends Zend_Amf_Auth_Abstract
{
    protected $_acl;
    protected $_users = array();
 
    public function __construct()
    {
        $this->_acl = new Zend_Acl();
 
        $oServiceRole	= new Service_Role ();
        $oRoles		= $oServiceRole->fetchAll ( );
 
        foreach ( $oRoles as $oRole )
        	$this->_acl->addRole ( new Zend_Acl_Role( $oRole->title ) );
    }
 
    public function getAcl()
    {
        return $this->_acl;
    }
 
    public function authenticate()
    {
        if (empty($this->_username) ||
            empty($this->_password)) {
            require_once 'Zend/Auth/Adapter/Exception.php';
            throw new Zend_Auth_Adapter_Exception('Username/password should be set');
        }
 
        $oServiceUser	= new Service_User ();
        $oUser		= $oServiceUser->authentication ( $this->_username, $this->_password );
 
        if ( null == $oUser )
        {
        	return new Zend_Auth_Result(Zend_Auth_Result::FAILURE,
                null,
                array('Username and / or Password not found')
                );
        }
        else
        {
        	$id = new stdClass();
       	 	$id->role = $oUser->role->code;
       	 	$id->name = $oUser->username;
 
        	return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $id);
        }
    }
}

Le constructeur récupère l’ensemble des rôles existants en base de données pour peupler l’objet ACL.
La méthode authenticate va vérifier le couple Login / Password, et en cas de succès va retourner un objet Zend_Auth_Result contenant lui même un objet standard.
Cet objet standard doit avoir une propriété role et name, le rôle contiendra l’identifiant que vous avez définit dans vos autorisations ACL. Le name devra contenir le login de votre utilisateur.

Cette classe a été inspirée par Zend_Amf_Adobe_Auth. N’hésitez pas à l’adapter pour vos propres besoins.

Mots-clefs :, , , , ,
 

Authentification et Autorisation avec Zend AMF

Flash, Zend 22 Commentaires »

Nous allons voir comment mettre en place l’authentification et l’autorisation lorsque l’on souhaite travailler avec Zend et le protocole AMF.

Au niveau des pré-requit, vous devez avoir une architecture Zend et AMF opérationnelle.
Aussi, je vous conseils de lire la documentation sur Zend_Auth et Zend_Acl.
Vous devez avoir compris la notion de rôle et de ressource.

Objectifs

Si vous fournissez des services à travers le réseau, et qu’ils peuvent avoir un impact sur la cohérence des données, vous vous devez de sécuriser l’accès à ces services.

Sécurisé l’accès signifie restreinte l’accès, mais aussi chiffrer les communications.
Nous ne traiterons pas la partie chiffrement des échanges, pour cela je vous laissez chercher de la documentation sur HTTPS.

Point de départ

Ci-dessous, un exemple de contrôleur Zend offrant des services AMF.

class ServiceController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
    }
 
    public function amfAction()
    {
	$server = new Zend_Amf_Server();
 
	//Liste des services
	$server->setClass( "Service_User" );
	$server->setClass( "Service_Book" );
	$server->setClass( "ZendAmfServiceBrowser" );
 
	//Mapping des objets PHP avec les objets ActionScript		
	$server->setClassMap('UserDTO', 'Model_DTO_User');
	$server->setClassMap('BookDTO', 'Model_DTO_Book');
 
	$server->setProduction(false);
 
	ZendAmfServiceBrowser::$ZEND_AMF_SERVER = $server;
 
	echo ($server->handle());
    }
}

Nous avons donc deux services, et deux types d’objets pouvant être utilisés.

Vous remarquerez l’utilisation de ZamfBrowser, ce service couplé avec une application Adobe AIR permet de travailler facilement avec les services.

Voici à quoi ressemble les prototypes d’un de mes services.

class Service_Book
{
	public function createBook (Model_DTO_Book $oBook) {}
	public function readBook (Model_DTO_Book $oBook) {}
	public function updateBook (Model_DTO_Book $oBook) {}
	public function deleteBook (Model_DTO_Book $oBook) {}
	public function isRentBy (Model_DTO_User $oUser) {}
}

L’autre service est composé lui aussi des méthodes CRUD (Create, Read, Update, Delete), ainsi que d’autres fonctions métiers.

Sachant que mon application cliente Flash utilise ces services, il est très facile à un utilisateur de découvrir l’URI de la passerelle AMF.
En l’état, une personne ayant l’accès à ma passerelle AMF pourrai utiliser toutes les fonctions de mes services. Ce qui implique qu’il puisse modifier ma base de données.

Remarquer que si l’on supprime le service de ZamfBrowser, l’utilisateur n’aura pas accès à la liste exhaustive des services. Si vous êtes en production, je vous conseils donc de supprimer ce service pour des raisons de sécurité.

Mise en place de l’authentification

Nous allons commencer par mettre en place l’authentification,
Sachant que nous utilisons un client Flash, il est logique d’utiliser Zend_Amf_Adobe_Auth.

$authAdapter = new Zend_Amf_Adobe_Auth(APPLICATION_PATH . '/config/password.xml');
$server->setAuth($authAdapter );

Avec ces deux lignes, nous avons mis en place l’authentification au niveau du serveur.
Il vous reste à définir le fichier password.xml

<?xml version="1.0"?>
<roles>
   <role id="editor">
        <user name="stephane" password="P@ssword01"/>
        <user name="robert" password="P@ssword01"/>
   </role>
</roles>

Le fichier password.xml contient les identifiants et les mots de passe des utilisateurs.
C’est à ce niveau que vous définissez les affectations d’identifiants à un rôle.

Si vous avez besoin de plus de souplesse au niveau de la gestion des identifiants, je vous conseils la lecture de Authentification avec une table de base de données.

Il est à noter, que si vous ne spécifier aucun identifiant lors de votre connexion au serveur AMF vous serez considéré comme un invité : Zend_Amf_Constants::GUEST_ROLE

Mise en place de l’autorisation

Maintenant que nous avons correctement définit l’authentification, passons à l’autorisation.
C’est maintenant que nous allons donner les autorisations ou refus d’accès aux services.

$acl = new Zend_Acl();
$server->setAcl($acl);

Avec ces deux lignes, vous avez définit une Acces Control List.
Vous le constatez, aucune autorisation n’est définit; mais il est important de noter que maintenant, plus personne n’a accès à vos services.

Pour donner l’accès à nos deux services à n’importe qui, nous allons procéder comme suit :

$acl = new Zend_Acl();
$acl->addResource ( new Zend_Acl_Resource('Service_User') );
$acl->addResource ( new Zend_Acl_Resource('Service_Book') );
$acl->addResource ( new Zend_Acl_Resource('ZendAmfServiceBrowser') );
 
$acl->allow (null, 'Service_User');
$acl->allow (null, 'Service_Book');
$acl->allow (null, 'ZendAmfServiceBrowser);
$server->setAcl($acl);

Ci-dessus, nous avons une liste explicite des autorisations.
Si nous avions voulu faire dans l’implicite, nous aurions procédé ainsi :

$acl = new Zend_Acl();
$acl->allow ();
$server->setAcl($acl);

Pour aller plus loin dans l’explication, nous allons maintenant définir l’ensemble de nos autorisations.

Nous souhaitons que le rôle administrateur est accès à tout, et nous souhaitons que les utilisateurs non authentifiés n’est pas accès aux fonctions de mise à jour.

Rappelez-vous, nous avons vu plus haut que vous étiez connecter avec le rôle invité lorsque vous ne spécifiez aucun identifiant.

$acl = new Zend_Acl();
 
//Définition les rôles.
$acl->addRole ( new Zend_Acl_Role(Zend_Amf_Constants::GUEST_ROLE) );
 
//Définition des autorisations
$acl->allow ();
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "create");
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "update");
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "delete");
 
$server->setAcl($acl);

Premièrement,
Nous avons dû définir le rôle invité pour pouvoir travailler ses autorisations.

Deuxièmement,
Nous avons utilisé le principe des listes noires. Si nous avions utilisez un système de liste blanche, nous aurions du définir l’ensemble des rôles, et l’ensemble des autorisations.
C’est donc en partant du principe que tout le monde a accès à tout, que nous avons fermé les portes aux anonymes.

Explication des fonctions Deny & Allow :
Zend_Acl::deny et Zend_Acl::allow utilisent les mêmes arguments.
Le premier paramètre correspond à un rôle, cela ne change pas des ACL Zend classique.
Le deuxième paramètre correspond à une ressource. Avec Zend AMF, une ressource correspond à un Service.
Le troisième paramètre correspond ici à la fonction d’un service AMF.

Nous avons utiliser null au niveau du deuxième paramètre pour dire : tout les services.

initAcl

Ce dernier paragraphe pour vous parlez de mon opposition face aux spécifications de la documentation Zend_AMF_Server :

If the ACL object is set, and the class being called defines initAcl() method, this method will be called with the ACL object as an argument. The class then can create additional ACL rules and return TRUE, or return FALSE if no access control is required for this class.

En gros, il existe une autre manière de définir les autorisations,
Si vous avez définit un ACL au niveau de votre Serveur AMF. Ce dernier vérifiera l’existence d’une fonction initAcl sur les services lorsqu’ils seront appelés.

Cette fonction est ce que l’on appel un Hook, et vous permets de définir les autorisations et refus au sein de la définition même de vos services.
Autant vous dire que niveau maintenance et centralisation de l’information c’est très moyen..
De plus, si l’on pend l’exemple de ZendAmfServiceBrowser, vous allez devoir modifier la définition de ce service, et cela à chaque fois qu’il y aura une nouvelle version ?

Voici un exemple de fonctionnement

class Service_Book
{
	public function initAcl ($acl)
	{
		$acl->deny('editor', 'Services_Book', 'create');
		$acl->deny('editor', 'Services_Book', 'update');
		$acl->deny('editor', 'Services_Book', 'delete');
		return true;
	}
}

Pour aller plus loin : Vous trouverez un article dédié à l’authentification pour Zend AMF Server avec une base de données : AMF / Zend Authentication using Database

Mots-clefs :, , , , , , ,
 

Cours informatique gratuits

Elearning 15 Commentaires »

polymorphe

Ce site regroupe de nombreux supports de cours informatique portant sur divers domaines. Les cours et formations informatiques que vous pourrez trouver ici sont toutes à télécharger gratuitement et sous divers formats : doc, html, pdf, ps.

Après la description, voyons le contenu:

Soit 264 fichiers le 15 Mai 2009. Cela ne représente pas une si grande base de documents par rapport à OpenCourseWare (cf: Wikipédia); mais quand même, tout les supports de cours sont en Français ce qui peut être très appréciable.

PS: RSS des derniers documents

Mots-clefs :, , , ,
 

Une solution pour afficher un site bloqué

Web 1 Commentaire »

screenshot armetizDécouvert dans les commentaires de Korben.info qui demande à ses visiteurs une solution pour que son site puisse être consulté par les entreprises qui le blacklist.

Picidae propose d’afficher une image d’un site que vous souhaitez consulter tout en concevant les liens hypertextes.

Il semblerai que le serveur prenant la photo soit hébergé en Suisse, donc cela peut-être intéressant pour afficher des informations réservées aux connexions suisse :p

Maintenant, il suffit à votre entreprise de bloquer aussi Picidae pour que vous soyez obliger de trouver une autre solution.

PS : Grâce à ce site j’ai pu avoir une jolie photo de l’ensemble de mon site, du coups le programme WebKut tombe à l’eau.

Edit : Dans les commentaires, raph nous donne un lien pour monter son propre serveur et donc feinter encore plus votre administration ! Le mal est en vous comme en moi, j’en suis sûr :p

Mots-clefs :, , , ,
 

Et si monster.com se faisait pirater ?

Sécurité 1 Commentaire »

4.5 Millions de comptes piratés ? Des mots de passe stockés en clair ? Une identité numérique en péril ? Un scénario catastrophe qui rappelle l’histoire d’anna.

Logo monsterLe problème, c’est qu’il ne s’agit pas d’une histoire mais d’un fait.
Monster.com s’est fait pirater sa base de donnée contenant – juste – 4.5 Millions d’utilisateurs ainsi que les mots de passe associés.
Cette actualité a été vu sur le site d’un expert en sécurité qui pète un câble face à l’incompétence des DSI en matière de sécurité.

Monster s’explique :

Nous avons récemment appris qu’il y a eu un accès illégal à notre base de données et que certaines informations de contact et de compte ont été prises, notamment des identifiants utilisateur et des mots de passe, des adresses emails, des noms, numéros de téléphone et certaines données démographiques basiques. L’information ainsi collectée ne comprend pas de CV. Monster ne recueille généralement pas – et l’information collectée ne contient pas – de données sensibles telles que des numéros de sécurité sociale ou des données bancaires.

Seuls les identifiants, mots de passe et email on été volés, vos CV sont sains et saufs donc aucun risque.

Logo amazonQuelqu’un devrait peut-être expliquer aux DSI que 90% des personnes utilisent le même mot de passe sur tout les sites à authentification.
Et que d’autres sites comme Amazon qui ont une politique de sécurité digne d’un enfant peuvent fournir des informations très confidentielles : Carte Bleu / Cryptogramme …

Rappelons que les problèmes de sécurité informatique sont à deux niveaux : utilisateur final et administrateur.
Alors que les règles de sécurité sur les mots de passe complexes commencent à se répandre, si les administrateurs ne respectent pas les règles de sécurité élémentaires le Web sera encore et toujours un lieu unsecure.

De plus aucune excuse vis-à-vis des utilisateurs.

Mots-clefs :, , , ,
 

Phishing Hotmail, Gmail, Yahoo – Attaque de Kevin

Sécurité 1 Commentaire »

Cela fait quelques semaines qu’un nouveau contact MSN s’est ajouté à notre carnet d’adresse, nous ne le connaissons pas, et nous n’y portons pas d’attention spécifique.
Quelques jours après, ce contact nous parle, très peu et de manière courtoise.

Ce n’est qu’après plusieurs – mini – échanges qu’il dit avoir des informations personnelles obtenues sur un tchat… Surpris, on demande quel tchat, et c’est à ce moment qu’il nous envoi une URL qui pointe vers la page de connexion Hotmail.

A première vu, tout semble normal, mais si l’on regarde l’url de plus près, on y trouve :

http://login.live.com.msn-holmail.com/...

Et voila comment l’on devient victime de phishing.

Analyse de la page

En utilisant Firebug pour analyser les flux d’information, on se rend compte que beaucoup d’information provient du vrai Hotmail – JS / CSS – ce qui permet d’avoir une « fausse » page conforme à l’original et fonctionnel.
Deux autres URI tapent à l’œil :

  • http://www.50dh.com/rerapid.php
  • http://www.waspami.com/

Grâce à Google et à sa traduction, nous avons pu en déduire que 50dh.com permettait d’obtenir des accès VPN/Rapidshare/etc. Tandis que Waspami.com permet de générer des pages de phishing pour Hotmail, Yahoo Mail et Gmail.
D’une utilisation très simple, il suffit de rentrer un email – pas forcement valide – et de choisir la langue. On obtient par la suite l’URL qui servira pour l’attaque.

Chaque tentative de connexion est enregistrée par la fausse page, connexion qui échouera forcement et qui renverra vers la vrai page du service . L’utilisateur n’y verra donc que du feu, car il aura l’impression d’avoir tapé un mauvais mot de passe et ronchonnera sur le temps perdu à le retaper.
L’homme malveillant retournera sur l’URL qu’il envoi à toutes ses victimes et se connectera avec l’email qu’il a utilisé pour générer la page. Il aura ensuite accès à une liste de login, mot de passe et IP.

Comment se protéger ?

Et là c’est le drame, car je n’ai trouvé aucun moyen de protection automatique. La seul protection, c’est le bon sens. Mais aller dire cela à votre grand-mère qui utilise internet depuis 4 mois ?

Nous avons fait le test avec l’utilisation d’openDNS qui est relié avec PhishTank pour – justement – éviter les problèmes de phishing. Mais rien n’est bloqué, et nous pouvons tomber dans le panneau sans y faire gaffe.
PhishTank est un service de protection contre le phishing qui fonctionne sur un principe de blacklist, donc tant que l’url n’a pas été ajoutée, elle n’est pas connue comme néfaste. Donc si le service de phishing est tout nouveau, il n’est pas référencé.

Alors qu’openDNS aurait dû – à mes yeux – être la solution la plus efficace, nous pouvons nous demander que faire ?
Mais nous sommes techniquement impuissant contre cela, la seul solution possible, c’est l’éducation des utilisateurs. On y revient toujours, car c’est la dessus que se base les attaques du type phishing, sur l’imprudence des utilisateurs.
Un peu comme en voiture, on a beau mettre des radars, des ralentisseurs, une personne qui souhaite rouler à 180km/h roulera à cette vitesse.. Alors qu’en rabâchant du plus jeune age, au plus vielle age qu’il ne faut pas rouler vite, peut-être que là nous aurons des résultats, peut-être même sans radar ;)

Si l’attaque n’a pas fonctionné, c’est que les conditions étaient suspects. Donc Au moindre doute, il faut se méfier.

Histoire de l’article

L’article aurait dû paraitre plus tôt, et lorsqu’il y a eu la prise de décision sur sa publication, le service de phishing waspami.com n’existait plus dans son intégralité… Les liens qui sont données plus haut ne sont donc plus fonctionnels.
Il est quand même publié pour montrer que cela peut arriver à tout le monde, et pour moi c’était la première fois.
Et puis, c’est quand même de là que m’est venu l’inspiration de l’article sur les déboires d’anna ;)

PS : Qu’est-ce qu’un Kévin ?

Mots-clefs :, , , , ,
 

Avis à la population : la gestion des mots de passe

Sécurité, Système, Web 5 Commentaires »

Cet article fait suite à un petit raz le bol envers les développeurs et les concepteurs peu soucieux de la gestion des mots de passe.
Nous allons voir pourquoi il ne faut pas stocker les mots de passe en clair, les risques que cela peut engendrer et les alternatives du stockage en clair.

Stocker les mots de passe en clair

Avez-vous déjà eu ces mails désagréables vous confirmant votre inscription, ces mails qui vous font un rappel de login et de mot de passe ?

Rappel pour votre prochaine connexion :

  • login: armetiz
  • password: biloute

Mais comment diable ce fait-il que le site connaisse mon mot de passe et l’affiche en clair dans un email ?

  • Premièrement, le mail arrivera dans ma boite au lettre, il sera consulter sans condition de sécurité particulière, malheureusement quelqu’un qui regardait mon écran à vu cette information tellement confidentiel : mon mot de passe.
  • Deuxièmement, comme 95% des mails non publicitaire ne sont pas supprimés, cela signifie que si l’on subit un phising réussi, on offre à notre attaquant une vue complète de notre anatomie.
  • Troisièmement, le mot de passe en clair a de forte chance d’avoir été stocké en base de donnée. Comment l’utilisateur peut-être sur de la sécurité de l’entreprise ? Un développeur stagiaire qui a accès à la base de donnée peut récupérer tout ce qu’il désire pour les ré-utiliser autrement.

Dans la catégorie poids lourd, on peut nommer Amazon.fr qui stocke les numéros de carte bleu ainsi que le cryptogramme ! Une fois inscrit, on peut revenir et commander un article sans même avoir sa CB sous les yeux.

Les risques de l’individu

Nous allons commencer par les risques des individus.
D’après les exemples ci-dessus, il peut se produire pas mal de scénario catastrophiques. Voici l’exemple imaginé d’Anna.

Anna travaillant dans une grande PME, a suivie une formation interne sur les bases de la sécurité informatique, la chose qu’elle a retenue : des mots de passe diversifiés et complexes en fonction du type de site. Après cette formation, elle a modifiée son mot de passe, et utilise désormais trois mots de passe complexes pour trois types de site

  • Commerciaux.
  • Non commerciaux.
  • Professionnel – Accès VPN, Connexion système de fichier, etc…

Malheureusement, Anna a subit une attaque de phising Hotmail qu’elle utilise comme messagerie principal.
Cette attaque ayant été correctement orchestré, elle n’y a vue que du feu et ne s’est même pas rendue compte que son mot de passe non commercial venait de lui être volé.

Ses attaquants ont parcouru ses emails, ils sont tombés sur une confirmation d’inscription à un site de vente en ligne pour de la lingerie, rien de bien méchant, sauf que cet email contient le login de connexion, ainsi que le mot de passe affecté.
Ils ont aussi vu qu’une commande sur Amazon avait été passée.

Pas de bol pour Anna, les attaquants ont été voir sur Amazon si un des deux mots de passe fonctionnait, et c’est le cas, car elle a bien respectée la règle qu’on lui a apprise en formation, le mot de passe commercial utilisé pour la vente de lingerie est le même que pour Amazon.
Les attaquants ont commandés une télévision à 1000€, et ce n’est pas Anna qui sera livrée… Sachant qu’ils ont accès à la boite email, ils ont supprimés le bon de commande et elle ne sera rien avant que son banquier ne l’appel ou qu’elle consulte l’état de son compte.

Le calvaire de la pauvre Anna ne s’est pas arrêtée à un téléviseur, car quand on est acteur – pseudo – influant sur Internet, les choses vont vite. Et les attaquants se sont amusés avec l’identité numérique, les blogs qu’elle animait l’ont bannis, et la réputation qu’elle avait construit avec cœur s’est détériorées très rapidement.

Si l’on regarde l’expérience d’Anna, on se rend compte que le phising qu’elle a subit est sous sa responsabilité, car c’est son manque d’attention qui a mené à bien l’attaque.
Par contre, le fait que le mot de passe soit affiché en clair dans l’email est sous l’entière responsabilité du site web où s’est inscrit Anna.
Et si amazon avait ne serai-ce que demandé le cryptogramme de 3 chiffres avant de passer la commande, les 1000€ serai toujours sur son compte bancaire.

Les risques des hébergeurs / administrateur

« Moins on en sait, moins on cours de risque« . Si l’on part de ce principe, ceux qui conservent les mots de passe en clairs se heurtent à d’énormes risques légaux.

Nous allons continuer avec l’exemple d’Anna qui a été porté plainte, sachant que le débiteur des 1 000€ est Amazon, la banque se retournera contre cette enseigne qui devait s’assurer que la demande de la vente provenait bien d’Anna.
Comme nous ne pouvons pas être sur à 100% de l’identité de la personne connectée, ils ne doivent pas conserver les codes de carte bleu.

Anna qui n’a vraiment pas de chance, s’est fait usurpée son identité par un stagiaire de la boutique de vente de lingerie qui s’est amusé à récupérer les mots de passe et à tester l’accès à des forums en fonction de l’email et du mot de passe.
Le stagiaire est itinérant, mais pas la boutique, elle peut être accuser d’avoir utiliser des données confidentiels et d’une haute importance, car ces données peuvent ouvrir l’accès à d’autres données personnelles. Comment la boutique pourra justifier qu’elle n’a pas utiliser à des fins « personnels » le mot de passe d’Anna ?

Les alternatives du stockage en claire

Pour empêcher que d’autres personnes ne subissent l’expérience de la pauvre Anna, qui rappelons le, a usée de méthode d’utilisateur conscient de la sécurité informatique. Il existe des méthodes très simple à mettre en place.
Mais pour cela, il faut que les concepteurs, développeurs et même administrateur soit au courant de ces pratiques.

Lorsque l’on s’inscrit sur un site, on ne conserve qu’un Hash du mot de passe, et si un utilisateur redemande le mot de passe, on le ré-initialise avec un tout autre mot, libre à la personne de le changer par la suite.

Amazon a vraiment fait quelque chose de pas « secure ». A l’heure où l’on se bat pour que messieurs tout le monde ai droit à une sécurité informatique, si de grandes enseignes ne respectent pas les règles élémentaires, c’est mission impossible.

Car il faut le rappeler, la sécurité informatique tient du respect des règles par l’ensemble des acteurs de l’informatique.
Si les utilisateurs se forcent à utiliser des mots de passe complexe, et que les sites ne font rien pour en assurer leurs sécurités… Nous ne seront jamais tranquille.

PS : Si une loi obligeait tout les développeurs à avoir connaissance des règles de sécurité pour pouvoir exercer… Nous vivrions dans un monde sans pirate :p

Pour aller plus loin, voici une liste de livre traitant de la sécurité informatique, disponible sur Amazon bien sur ;)

Mots-clefs :, , , , , , , ,
 
Designed by NattyWP Wordpress Themes.
Images by desEXign.