TP4-5 : Authentification Java

publicité
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.
Téléchargement