Authentification et Autorisation avec Zend AMF

Flash, Zend 4 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;
	}
}
Mots-clefs :, , , , , , ,
 

Cours informatique gratuits

Elearning 9 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 :, , , , ,
 
Designed by NattyWP Wordpress Themes.
Images by desEXign.