TP4-5 : Authentication Java V. Danjean V. Marangozova-Martin Résumé Le but de ce TP est double : se familiariser avec le mécanisme classique d'authentication en Java ; apprendre à utiliser la documentation disponible (javadoc, etc. 1 ) pour découvrir de nouveaux concepts Le sujet vous guidera tout au long de ce travail, mais vous aurez besoin de chercher et lire les documentations associées. 1 Introduction à l'authentication Java Pour autoriser l'utilisation d'une ressource, les applications doivent d'abord authentier l'entité qui demande l'accès à la ressource. Dans le modèle de sécurité de Java (JAAS pour Java Authentication and Authorization Service ), les entités qui demandent d'accéder à des ressources sont appelés sujets. Les sujets peuvent représenter des personnes ou bien des services. Par exemple, pour autoriser la lecture de l'intranet, l'application doit s'assurer que la personne demandant l'accès est bien une personne de l'entreprise. Dans JAAS, les sujets sont représentés à l'aide de la classe prédénie javax.security.auth.Subject. L'authentication est le processus qui vérie l'identité d'une entité. Elle doit être eectuée de manière sécurisée sinon le système peut subir une attaque et laisser passer quelqu'un de non autorisé. Lors de l'authentication, l'entité doit fournir une preuve comme quoi elle est bien celle qu'elle prétend être. La preuve peut être la paire (login, mot de passe), de l'information stockée sur une carte à puce, des paramètres biométriques (rétine, voix, etc.) Une fois authentié, le sujet se voit attacher des identités, appelées principaux et représentées par la classe javax.security.Principal. Par exemple, une personne peut avoir un principal de nom ("Pierre Martin"), ainsi qu'un principal de numéro de sécurité sociale (017804. . .). 1. Voir notamment la page suivante : http://download.oracle.com/javase/6/docs/ technotes/guides/security/jaas/tutorials/index.html 1 M1 Miage 2 En plus des principaux, les sujets peuvent avoir des attributs de sécurité qui dénissent des droits. Un droit peut contenir de l'information permettant l'authentication, de l'information permettant aux sujets d'eectuer des opérations, etc. Par exemple, un droit peut contenir des clés secrètes pour le chirement et le déchirement de messages cryptés. Les droits ne sont pas prédénis dans JAAS et peuvent être implémentés de manière arbitraire. Remarque : la technologie JAAS est essentiellement utilisée dans le contexte des applications réparties mais, par souci de simplication, ce TP considère le cas d'une application centralisée. 2 Application d'authentication Nous vous fournissons un exemple simple de programme qui utilise l'authentication Java. Les sources contiennent : SimpleAuthenticationTest.java M1MiagePrincipal.java M1MiageLoginModule.java m1miage_jaas.config SimpleAuthenticationTest.java Le chier SimpleAuthenticationTest.java contient les classes SimpleAuthenticationTest et M1MiageCallbackHandler. La première contient la méthode main, alors que la deuxième participe à la gestion de la procédure d'authentication. M1MiagePrincipal.java Le chier M1MiagePrincipal.java contient la classe du même nom qui dénit un type d'identité pour les utilisateurs authentiés. M1MiageLoginModule.java Le chier M1MiageLoginModule.java contient le traitement principal d'authentication. m1miage_jaas.config Le chier m1miage_jaas.config est un chier de conguration qui spécie quel type d'authentication va être utilisé. M1 Miage 3 3 Installation et test Eectuer les opérations suivantes : 1. Récupérer l'archive du code source dans le placard électronique. 2. Décompresser. Normalement vous obtenez un répertoire Auth contenant le sujet de TP et un sous répertoire src. 3. Compiler les sources en mettant les classes dans Auth/classes. Pour cette étape, vous disposez d'indications dans le document "Rappels Java". 4. Exécuter. Pour cela, faites attention au positionnement de votre CLASSPATH qui doit pouvoir retrouver les classes compilées, ainsi qu'au contenu de m1miage_jaas.config qui suppose que vous vous êtes positionnés dans le répertoire Auth. La commande à exécuter est (sur la même ligne) : java -Djava.security.auth.login.config=m1miage_jaas.config m1miage.SimpleAuthenticationTest Tester : 1. Essayer de se connecter avec le login test1 et le password test2. 2. Essayer de se connecter avec le login testUser et le password test2. 3. Essayer de se connecter avec le login testUser et le password testPassword. 4. Observer l'exécution du programme. 4 Questions et compléments Question 4.1 La classe contenant la méthode main est SimpleAuthenticationTest. Identier l'endroit dans le code qui détermine le nombre autorisé d'essais de connexion. Question 4.2 Regarder le code de la classe M1MiageLoginModule. Identier la portion de code qui eectue la vérication du nom de login et du mot de passe. Modier le code pour permettre à un autre utilisateur avec un autre mot de passe à se connecter. Tester. Modier la gestion des échecs d'authentication an d'acher le même message quelque soit la cause de l'échec (mauvais nom d'utilisateur ou mauvais mot de passe). Quel est l'intérêt de cette stratégie ? M1 Miage 4 Question 4.3 Modier le programme pour qu'il prenne en compte un chier de mots de passe formaté de la manière suivante : user0:password0 user1:password1 ... Indications Pour spécier le nom de chier de mots de passe, utiliser le chier de conguration (m1miage_jaas.config) et utiliser les options. Vous pouvez vous inspirer de la dénition de l'option debug et de son traitement dans la méthode initialize dans la classe M1MiageLoginModule. Pour la lecture d'un chier utiliser les classes FileReader et BufferedReader. Pour traiter une ligne du chier, utiliser la classe StringTokenizer. Tester votre implémentation. Question 4.4 Modier la solution précédente an d'éviter de stocker les mots de passe de façon directement visible dans le chier. L'idée consiste à utiliser appliquer une fonction de hash (par exemple md5) à chaque mot de passe et à stocker le résultat dans le chier. On pourra s'aider de la classe MessageDigest pour le calcul de hash dans le code java. Question 4.5 Rôle des callbacks Dans le code de la méthode login de la classe M1MiageLoginModule, il y a la création d'un objet de type NameCallback et d'un autre objet de type PasswordCallback. Pouvez-vous expliquer à quoi ils servent ? Question 4.6 Cheminement des callbacks . Regarder le code de la classe M1MiageCallbackHandler et trouver l'endroit d'utilisation d'un NameCallback et d'un PasswordCallback. Prendre la section concernant PasswordCallback et comprendre le fonctionnement du code. À quel endroit, par exemple, récupère-t-on le mot de passe tapé par l'utilisateur ? Trouver l'endroit où est initialisé M1MiageCallbackHandler (il est passé en paramètre à quoi ?) Regarder la méthode login dans M1MiageLoginModule et l'appel à handle. Pouvez expliquer (énumérer les étapes) comment les callbacks sont utilisés ? Question 4.7 Modier le code pour rajouter un troisième callback de choix (ChoiceCallback) qui permet de choisir ROOT ou NORMAL. Pour cela, M1 Miage 5 rajouter l'instanciation de ce callback, son traitement, ainsi qu'une fonction readChoice qui imprime les diérents choix et lit celui tapé par l'utilisateur. Question 4.8 Authentication d'un utilisateur Regarder la méthode commit dans la classe M1MiageLoginModule. Quand cette méthode est-elle exécutée ? Cette méthode rajoute une identité (un principal) à l'utilisateur identié. Modier le code pour rajouter des identités diérentes en fonction du choix eectué (normal ou root). Pour cela, dénir deux classes M1MiageNormalPrincipal et M1MiageRootPrincipal qui étendent la classe M1MiagePrincipal. 5 Autorisations Java Dans le modèle de sécurité de Java, des opérations peuvent être exécutées soit parce qu'elle proviennent d'une source sûre (droits basés sur la provenance du code, code-based ), soit parce qu'elle sont demandées par des entités authentiées (droits basés sur l'identité). Pour utiliser l'autorisation Java, il faut fournir un chier de conguration qui décrit les droits qui sont donnés aux codes source ou aux entités identiés. Le format de ce chier de conguration est le suivant : grant signedBy "identité de source", codebase "provenance du code" principal "principal_class_name", "principal_name" principal "principal_class_name", "principal_name" ...{ permission permission_class_name "target_name", "action", signedBy "noms"; permission permission_class_name "target_name", "action", signedBy "noms"; ... } 6 Rajout de l'autorisation à l'application Nous voulons diérencier les utilisateurs authentiés selon le critère NORMAL ou ROOT. Pour les utilisateurs connectés en mode NORMAL, certaines actions ne seront pas autorisées. Pour les utilisateurs en mode ROOT, toutes les actions seront autorisées. M1 Miage 6 Question 6.1 Modication des sources 1. Rajouter le chier m1miage.policy. Regarder son contenu et expliquer quels sont les droits spéciés. 2. Les autorisations concernent des actions, appelées des actions privilégiées. Rajouter la classe M1MiageAction (chier M1MiageAction.java) dans les sources. Cette classe étendra la classe prédénie PrivilegedAction et implémentera la méthode run(). Dans la méthode run, il faudra mettre les traitements "privilégiés" qui vont être appelés par les utilisateurs authentiés. D'après le chier de conguration m1miage.policy, ces traitements sont la lecture de deux propriétés système et la vérication de l'existence d'un chier foo.txt. Pour la lecture des propriétés système, regarder la classe System. Pour la manipulation des chiers, regarder la classe File. 3. Compiler et créer les jars. Compilez les chiers Java. Créez l'archive M1MiageTest.jar pour qu'elle contienne m1miage.M1MiageAction.class, m1miage.SimpleTest.class et m1miage.M1MiageCallbackHandler.class. La commande est (sur une ligne) : jar -cfv M1MiageTest.jar <répertoire_des_ classes>/m1miage/M1MiageAction.class <répertoire_des_classes>/m1miage/SimpleTest.class <répertoire_des_classes>/m1miage/M1MiageCallbackHandler.class Créez l'archive M1MiageAction.jar contenant M1MiageAction.class Créez l'archive M1MiageLM.jar contenant M1MiageLoginModule.class 4. Tester. Question 6.2 Modication des droits Modier le chier de conguration pour qu'il donne les droits uniquement aux utilisateurs de mode ROOT. Question 6.3 Rajouter une classe M1MiageNormalAction qui ache "Hello user !". Modier le chier de conguration m1miage.policy pour donner aux utilisateurs en mode NORMAL le droit d'évoquer le traitement dans M1MiageNormalAction. Recompiler. Tester.