Vous êtes sur la page 1sur 222

Scurit

en Java 2
Universit de Nice - Sophia Antipolis
Version 4.9 24/10/07
Richard Grin
Plan de cette partie
Introduction
O intervient la scurit
Comment amliorer la scurit des
programmes
Politique de scurit
Cryptographie
Les outils pour la scurit
Complments
JAAS
JCA/JCE
R. Grin Java : scurit page 2
Introduction

R. Grin Java : scurit page 3


La scurit en informatique
Authentifier les utilisateurs, ou les programmes
avec des signatures
Contrler les autorisations daccs aux
ressources (systme et utilisateur) dune entit
authentifie ; par exemple, empcher des
lectures, suppressions ou des modifications non
autorises sur des fichiers
Assurer par le cryptage la confidentialit des
transmissions ou des donnes stockes

R. Grin Java : scurit page 4


Le soucis de la scurit
Ds sa conception, Java a attach beaucoup
dimportance la scurit
Les classes Java peuvent tre charges
dynamiquement depuis des machines non
sres et il faut un moyen de contrler les
actions excutes par ces classes
En particulier, lexcution des applets
rcupres sur le Web prsente un grand
risque

R. Grin Java : scurit page 5


Interdire pour protger
Pour effectuer la protection des ressources,
Java interdit aux classes Java non sres
(essentiellement celles qui viennent d'une autre
machine) d'effectuer des oprations
potentiellement dangereuses :
n obtenir des informations sur l'utilisateur ou
la machine locale
n crire sur le disque local

n se connecter sur une tierce machine non


connue de l'utilisateur
n ...

R. Grin Java : scurit page 6


Le bac sable des applets
Par dfaut les applets s'excutent dans un
bac sable duquel elles ne peuvent sortir
et qui leur interdit toute action dangereuse
Mais les contraintes imposes par le bac
sable sont trop strictes pour certaines applets
qui souhaitent obtenir des informations
locales ou crire des donnes sur les disques
locaux
Java 2 permet dassouplir cette politique de
scurit
R. Grin Java : scurit page 7
Sujet du cours
Les exemples suivants montrent les
restrictions imposes par le bac sable
Il faudra contourner ces restrictions si on veut
faire fonctionner les applications
Mais il ne faut pas pour cela ouvrir la porte
aux utilisateurs mal intentionns
Cest le sujet de la 1re partie de ce cours :
comment permettre juste ce qu'il faut pour
qu'une application ou applet (et pas les
autres) puisse effectuer des oprations qui lui
sont interdites normalement
R. Grin Java : scurit page 8
Exemple
Applet qui pose des QCM et gre les rsultats
Pour cela, l'utilisateur se connecte une
adresse Web et rcupre une page qui
contient une applet qui affiche les questions
Pour obtenir l'identit de la personne qui
rpond, l'applet contient l'instruction
System.getProperty("user.name");
Le bac sable dans lequel s'excutent les
applets interdit la lecture de la proprit
systme user.name

R. Grin Java : scurit page 9


Exemple (2)
Cette mme application range les rsultats
des tudiants dans une base de donnes
Le SGBD est plac sur une autre machine
que le serveur Web
L'applet se voit refuser l'accs ce SGBD car
le bac sable interdit les connexions rseaux
sur une autre machine que celle du serveur
Web do vient lapplet

R. Grin Java : scurit page 10


Exemple (3)
Lapplet souhaite crire sur le disque de
lutilisateur des informations sur les QCM
auxquels il a dj rpondu
La politique de scurit lie au bac sable
interdit lapplet dcrire un fichier sur le disque
local de lutilisateur
En fait une applet ne peut lire que les fichiers
qui sont placs dans le rpertoire do elle vient
ou dessous (et placs dans le mme jar si elle
est dans un jar)
R. Grin Java : scurit page 11
Il ny pas que les applets
Des restrictions comme celles imposes par
le bac sable des applets se retrouvent aussi
n pour les applications qui chargent des
classes dynamiquement depuis une autre
machine (RMI en particulier)
n pour les applications qui dcident, pour
une raison quelconque, dinstaller un
gestionnaire de scurit
n lorsque lutilisateur la dcid en lanant
lapplication
R. Grin Java : scurit page 12
O intervient la scurit

R. Grin Java : scurit page 13


Plan
Dans le langage Java
Dans les API standard
Injection de code SQL
Vrificateur de bytecode
Chargeur de classes
Les diffrentes versions de Java et la scurit

R. Grin Java : scurit page 14


La scurit dans le langage
Vrifications la compilation :
n Java est fortement typ

n Pas d'arithmtique des pointeurs

n Les variables non initialises sont


inutilisables
n Protection des variables d'tat (private,)

n Possibilit de dclarer final les variables,

mthodes et classes

R. Grin Java : scurit page 15


La scurit dans le langage
Vrifications l'excution :
n Contrle des dbordements dans les
tableaux
n Contrle des casts

n Vrification des classes au chargement

R. Grin Java : scurit page 16


La scurit dans les API
Les API lis la scurit permettent de
n dlimiter ce qui est autoris pour chaque
programme Java, selon
le lieu d'o les classes ont t charges

l'utilisateur qui les a signes

l'utilisateur qui l'excute (JAAS ; pas


pris en compte pour cette partie)
n protger la confidentialit des informations
par le cryptage

R. Grin Java : scurit page 17


crire des programmes srs
Favoriser l'encapsulation : les variables doivent
tre private, sauf raison contraire
viter autant que possible les variables
protected
viter de passer des rfrences vers des
variables sensibles en sortie ou en entre des
mthodes ; cloner (ou copier) les valeurs avant
de les passer
Dclarer final les mthodes ou les classes
dont le fonctionnement ne doit pas tre modifi
R. Grin Java : scurit page 18
Injection de code SQL
Danger si le texte d'une requte SQL
comporte une partie fournie par lutilisateur

R. Grin Java : scurit page 19


Exemple dinjection de code SQL
Un programme demande le nom et le mot de
passe dun utilisateur et les range dans 2
variables nom et mdp
Il vrifie la validit du nom et du mot de passe
par cette requte qui doit renvoyer une ligne :
"select * from utilisateur"
+ " where nom = '" + nom
+ "' and mdp = '" + mdp + "'"
Quel est le problme ?

R. Grin Java : scurit page 20


Le problme
Un pirate sait quun des utilisateurs autoriss
sappelle Dupond
Il saisit Dupond' -- pour le nom et a
pour le mot de passe
La requte devient :
select * from utilisateur
where nom = 'Dupond' --' and mdp = 'a'
Mais -- indique un commentaire avec le
SGBD utilis ; donc la requte excute sera :
select * from utilisateur
where nom = 'Dupond'

R. Grin Java : scurit page 21


Les parades
Toujours vrifier la saisie dun utilisateur
avant de sen servir pour construire une
requte SQL
Pour lexemple, il aurait suffit dinterdire le
caractre '
Avec JDBC, il est plus sr dutiliser une
PreparedStatement et les mthodes
setXXX plutt que de concatner des
String et dutiliser Statement ; la valeur de
la variable ainsi saisie ne sera jamais
considre comme un mot cl SQL
R. Grin Java : scurit page 22
Exemple
Si le code est
PreparedStatement stmt2 = conn.prepareStatement(
"select * from utilisateur "
+ " where nom = ? + and mdp = ?");
stmt2.setString(1, matr);
rset = stmt2.executeQuery();
La saisie par lutilisateur de Dupond' --
pour le login et de a pour le mot de passe
lancera la requte SQL suivante :
select * from utilisateur
where nom = 'Dupond'' --' and mdp = 'a
qui ne renverra aucune ligne
R. Grin Java : scurit page 23
Vrificateur de bytecode
Il fait partie de la JVM
Son rle est d'examiner le bytecode des
classes au moment de leur transformation en
objet Class par le chargeur de classe
Il vrifie que la structure des classes
charges par la JVM est correcte
En plus des avantages pour la scurit, il
vite ainsi la JVM deffectuer certaines
vrification lexcution (par exemple, les
dpassements de capacit de la pile), ce qui
amliore les performances

R. Grin Java : scurit page 24


Les 4 passes de la vrification

Vrification de la structure du fichier


Vrifications qui ne dpendent pas du code
particulier des mthodes
Vrification du code de chaque mthode
Vrifications sur le code des mthodes, qui
sont repousses pour des raisons defficacit
jusquau moment o le code est excut pour
la premire fois

R. Grin Java : scurit page 25


Passes 1 et 2
Structure du fichier :
n nombre magique correct au dbut du fichier
(0xCAFEBABE)
n pool des constantes a une structure correcte
Vrifications qui ne dpendent pas du code
particulier des mthodes :
n pas de classe fille dune classe final
n pas de mthode final redfinie
n toute classe a bien une classe mre (sauf Object)
n rfrences vers le pool des constantes sont valables

R. Grin Java : scurit page 26


Passe 3 (1)
Jusqu maintenant les vrifications ne prenaient
en compte que la classe vrifie
Les passes 3 et 4 prennent en compte les
classes utilises par la classe vrifie
La passe 3 ncessite une analyse du
cheminement dexcution ; elle est la vrification
la plus complexe

R. Grin Java : scurit page 27


Passe 3 (2)
La rpartition des tches entre les passes 3 et 4
nest pas compltement spcifie et peut
dpendre des JVM
Le principe gnral est quon essaie de
repousser dans la passe 4 les vrifications qui
ncessiteraient le chargement de nouvelles
classes
Par exemple, si le profil de f est B f() , B b
= f(); peut tre vrifi par la passe 3 sans
charger la classe B, mais A b = f(); va
ncessiter le chargement des classes A et B pour
sassurer que B est une classe fille de A
R. Grin Java : scurit page 28
Passe 3 (3)
Vrifications effectues :
n variables locales pas utilises sans tre
initialises
n les mthodes sont appeles avec des
paramtres corrects (nombre et type) et
retournent les bons types
n les accs aux membres (public, protected,)
sont autorises
n les affectations sont effectues avec les bons
types

R. Grin Java : scurit page 29


Passe 4
Les vrifications effectues sont celles de la
passe 3 qui ncessitent le chargement de
classes
La JVM peut alors remplacer les instructions qui
ont dclench la vrification par dautres
instructions spciales de telle sorte quaucune
vrification ne sera plus dclenche par la suite

R. Grin Java : scurit page 30


Classes vrifies par le
vrificateur de bytecode
Les classes de l'API standard (et des
extensions) ne sont pas vrifies
Depuis la version 1.2, les classes venant du
classpath sont vrifies

R. Grin Java : scurit page 31


Protection par le chargeur de classes
Les chargeurs de classes sont les piliers de
la gestion de la scurit en Java 2
Lors du chargement des classes ils mettent
en place tout le contexte qui sera utilis par
les gestionnaires de scurit pour dlimiter
ce qui sera autoris pendant l'excution
En particulier, ils associent les classes
charges un domaine de protection (voir
suite du cours)
Les chargeurs de classes sont tudis en dtails
dans un autre cours
R. Grin Java : scurit page 32
Espaces de noms lis
aux chargeurs de classes
Un chargeur de classes dfinit un espace de
noms : 2 classes de mme nom charges par 2
chargeurs de classes diffrents sont
considres comme diffrentes
Les navigateurs crent un chargeur de classes
diffrent pour chaque codebase
Ainsi, par exemple, 2 applets venant de 2 URL
diffrents ont des chargeurs de classes
diffrents et ne partagent pas les mmes
classes distantes (mme si elles ont le mme nom)
R. Grin Java : scurit page 33
La scurit dans les
diffrentes versions
La politique de scurit de Java a volu au
cours des diffrentes versions : JDK 1.0, JDK
1.1 et Java 2
Au fil des versions Java a ajout de la
souplesse aux possibilits offertes aux
utilisateurs, dveloppeurs et administrateurs

R. Grin Java : scurit page 34


Les versions de la politique de
scurit de Java 1 Bac sable des applets

JDK 1.0 JDK 1.1


Tout ou (presque) rien Tout (aussi pour le code sign)
(Images du tutoriel en ligne de Sun) ou (presque) rien
R. Grin Java : scurit page 35
La politique de scurit de Java 2

Plusieurs domaines de scurit Les domaines de scurit


avec plus ou moins dautorisations sont dtermins par les
(de tout jusqu presque rien) chargeurs de classe
R. Grin Java : scurit page 36
Politiques de scurit
en Java 2

R. Grin Java : scurit page 37


Plan
Les grands principes
Les acteurs
Les fichiers de scurit

R. Grin Java : scurit page 38


Contrle des applications
Par dfaut les applications locales, cest--
dire, lances par une classe place dans le
classpath ne sont pas contrles
Toutes les autres sont contrles
automatiquement par un gestionnaire de
scurit
On peut aussi faire contrler les applications
locales si on le souhaite

R. Grin Java : scurit page 39


Principe gnral
de la scurit en Java 2

Les droits d'un code ne sont pas crits en dur


dans du code
Ils sont dfinis par une politique/police de
scurit enregistre part dans des fichiers

R. Grin Java : scurit page 40


Exemple de fichier
de police de scurit
keystore ".keystore";
grant signedBy "toto" {
permission java.io.FilePermission
"${user.home}${/}-", "read";
};
grant codeBase
"http://deptinfo.unice.fr/~toto/*" {
permission java.util.PropertyPermission
"user.home", "read";
};
Noubliez pas les ; !
R. Grin Java : scurit page 41
Domaine de scurit
Quand elle est charge dans la JVM, une
classe se voit associer un domaine de
scurit
Un domaine de scurit ajoute des
permissions une classe (en plus de ce que
permet le bac sable)
Cest une sorte de bac sable largi et
assoupli

R. Grin Java : scurit page 42


Ce qui dtermine
un domaine de scurit
Un domaine de scurit est dtermin par
n lorigine de la classe : d'o vient-elle, qui l'a
signe
n la politique de scurit au moment o la
classe est charge par le chargeur de
classes
La politique de scurit peut tre modifie en
cours dexcution, mais a ne change pas les
permissions associes aux classes dj
charges
R. Grin Java : scurit page 43
Exemple
Lutilisateur qui a lanc lexcution a ceci
dans son fichier de police de scurit :
grant signedBy "toto" {
permission java.io.FilePermission
"${user.home}${/}-", "read";
};
Alors, si une classe signe par toto est
charge en mmoire, le domaine de scurit
qui lui est associ contiendra la permission
de lire les fichiers placs dans toute
larborescence du rpertoire HOME de
lutilisateur
R. Grin Java : scurit page 44
Toutes les API sont concernes
Toute action potentiellement dangereuse
effectue par une mthode des API Java est
contrle par le gestionnaire de scurit
Les paquetages java.io et java.net sont
particulirement concerns, mais aussi les
autres paquetages comme java.lang,
java.awt ou javax.swing

R. Grin Java : scurit page 45


API et outils
spcifiquement destins la scurit
Paquetage java.security et ses sous-
paquetages : classes pour les permissions,
les signatures, les polices de scurit,...
Outils pour la scurit fournis avec le SDK :
jarsigner, keytool, policytool

R. Grin Java : scurit page 46


Les acteurs de la
politique de scurit

R. Grin Java : scurit page 47


Acteurs de la politique de scurit
n Politique de scurit
n Domaines de scurit
n Gestionnaire de scurit et contrleur d'accs
n Contexte d'appel
La politique de scurit dtermine le domaine de
scurit d'une classe au moment de son
chargement
Si une mthode veut excuter une action
potentiellement dangereuse, le gestionnaire de
scurit charge le contrleur d'accs de vrifier
qu'elle en a le droit dans le contexte de l'appel
R. Grin Java : scurit page 48
Politique de scurit
Elle est dtermine par la lecture de fichiers de
proprits au dmarrage de la JVM (voir section
Fichiers de police de scurit )
Elle est utilise au moment du chargement dune
classe pour lui associer un domaine de scurit
La vrification des droits de la classe n'utilise
ensuite plus que ce domaine de scurit

R. Grin Java : scurit page 49


Classe Policy
La politique de scurit en cours un moment
donn est reprsente par la classe Policy
La mthode static Policy.getPolicy()
renvoie la politique en cours
La mthode refresh() de la classe Policy
permet de relire le fichier de police de scurit
(pour lattribution des domaines des nouvelles
classes charges ; pas pour les classes dj
charges)

R. Grin Java : scurit page 50


Domaine de scurit
Une classe appartient un et un seul domaine
dtermin par
n la politique de scurit au moment de son
chargement
n et par son code source , cest--dire
lorigine du code
Un domaine de protection est compos dun
codesource, dune collection de permissions,
dun chargeur de classes et dun tableau de
principals (servent identifier un utilisateur)
Reprsent par la classe ProtectionDomain
R. Grin Java : scurit page 51
Notion de CodeSource
En Java 2, l'origine du code d'une classe est
constitue
n de l'URL d'o a t charge la classe

n du signataire de la classe, avec les


certificats qui ont t utiliss pour vrifier la
signature
Reprsent par la classe CodeSource

R. Grin Java : scurit page 52


Domaine systme
Le domaine systme est form des classes
charges par la chargeur de classe primordial
(celui qui charge les classes au dmarrage de Java)
Les classes du domaine systme ne sont pas
contrles
Actuellement, toutes les classes du JDK sont
places dans le domaine systme
Les applets ou les applications appartiennent
d'autres domaines dtermins par leur
codeSource

R. Grin Java : scurit page 53


Gestionnaire de scurit

Il contrle l'accs aux ressources protges


Reprsent par la classe
java.lang.SecurityManager ou par une classe
descendante
En fait, le SecurityManager dlgue le travail
au contrleur d'accs (nouvelle classe
java.security.AccessController de Java 2)

R. Grin Java : scurit page 54


Choix du gestionnaire de scurit
Ordinairement, il est install par le contexte
d'excution (par exemple, par le navigateur Internet ou
par une option de la commande java)
Par dfaut, les application locales, cest--dire
celles qui sont lances par une classe principale
venant du classpath, ne sont pas contrles par
un gestionnaire de scurit
Aucun contrle daccs nest donc effectu pour
les applications locales, mme pour les classes
distantes charges par lapplication, par
exemple, en utilisant un URLClassLoader
R. Grin Java : scurit page 55
Choix du gestionnaire de scurit
sur la ligne de commande
On peut installer un gestionnaire de scurit au
lancement d'une application :
n gestionnaire par dfaut (bac sable, instance
de java.lang.SecurityManager) :
java -Djava.security.manager Classe
n gestionnaire particulier :
java -Djava.security.manager=MonSecurityManager
Classe

R. Grin Java : scurit page 56


Choix du gestionnaire de scurit
dans un programme
Installer un gestionnaire de scurit (pour RMI
sur cet exemple) :
System.setSecurityManager(
new RMISecurityManager())
Cet appel ncessite le droit
java.lang.RuntimePermission("setSecurityManager")
Rcuprer le gestionnaire de scurit :
System.getSecurityManager()

R. Grin Java : scurit page 57


Dboguer les problmes
lis aux permissions
Pour les applications, la proprit
java.security.debug offre plusieurs
options pour faire afficher les problmes lies
aux permissions ; ces options saffichent par :
java Djava.security.debug=help
Pour les applets, il faut faire afficher la
console Java du navigateur ou du plugin Java
de Sun

R. Grin Java : scurit page 58


Contrleur d'accs
C'est lui qui dcide si un accs une ressource
est autoris
Il tient compte
n du contexte d'appel de la mthode qui veut
accder la ressource systme
n du domaine de scurit de toutes les classes
qui sont dans le contexte d'appel
Il est reprsent par la classe
AccessController qui ne contient que des
mthodes static (checkPermission en
particulier)
R. Grin Java : scurit page 59
Contexte d'appel
Il est utilis pour vrifier les droits d'une
mthode
Il est form des classes dont les mthodes
sont dans les piles d'excution des diffrents
threads qui ont conduit l'appel de la
mthode
Pour qu'un mthode ait un droit, il faut que
tous les domaines des classes du contexte
d'appel aient ce droit
Reprsent par la classe
AccessControlContext

R. Grin Java : scurit page 60


Extrait de FileOutputStream
public FileOutputStream(String name,
boolean append)
throws FileNotFoundException {
SecurityManager
security = System.getSecurityManager();
if (security != null) {
security.checkWrite(name);
}
fd = new FileDescriptor();
if (append) { openAppend(name); }
else { open(name); }
}
R. Grin Java : scurit page 61
Extrait de SecurityManager
public void checkWrite(String file) {
checkPermission(
new FilePermission(file, "write"));
}

public void checkPermission(Permission perm) {


AccessController.checkPermission(perm);
}
Appel la classe
AccessController

R. Grin Java : scurit page 62


AccessControlException

Si un appel est rejet par le contrleur d'accs,


une AccessControlException (paquetage
java.security) est leve
Cette classe d'exception hrite de la classe
java.lang.SecurityException qui elle-
mme hrite de RuntimeException
Il n'est donc pas obligatoire de dclarer cette
exception dans la dfinition des mthodes

R. Grin Java : scurit page 63


Algorithme pour le contrle d'accs
Les domaines A, B et C doivent
check Access avoir la permission write
Permission() Controller sinon, lancement d'une
AccessControlException
write() FileWriter

mc() classe C domaine C permissions

mb() classe B domaine B permissions

ma() classe A domaine A permissions


Pile d'excution Contexte d'appel
R. Grin Java : scurit page 64
Code privilgi
La mthode de la classe AccessController
static <T>
doPrivileged(PrivilegedAction<T> action)
permet de donner des droits particuliers du
code
Tout code excut par un appel
doPrivileged est considr comme du code
privilgi

R. Grin Java : scurit page 65


Interface PrivilegedAction<T>
Cette interface ne comprend quune mthode
T run()
La mthode doPrivileged excute cette
mthode run() et renvoie lobjet renvoy par
run()
Tout le code contenu dans la mthode run()
est donc considr comme privilgi par le
contrleur daccs

R. Grin Java : scurit page 66


Autorisations du code privilgi
Les autorisations d'accs du code privilgi sont
dtermines uniquement par les droits
n du domaine de la classe qui a appel
doPrivileged
n des mthodes appeles par le code privilgi

Il y a donc moins de vrifications faire : les


limitations lies aux mthodes places en
dessous de la pile dexcution ne sont plus
prises en compte
Soyez donc trs prudent avec ce que vous
permettez dans du code privilgi !!
R. Grin Java : scurit page 67
Exceptions et code privilgi
La mthode run() ne doit pas renvoyer
dexception
Sinon, on doit utiliser linterface
PrivilegedExceptionAction dont la
mthode run() renvoie une
PrivilegedException ; on peut rcuprer
lexception lance par run en appelant la
mthode getException() de
PrivilegedException

R. Grin Java : scurit page 68


Restriction des droits accords
du code privilgi
On peut passer un 2me paramtre de type
AccessControlContext la mthode
doPrivileged
La classe AccessControlContext contient
une mthode checkPermission qui peut
tre redfinie pour restreindre les droits
accords

R. Grin Java : scurit page 69


Permissions pour excuter
du code privilgi
Aucune permission spciale nest requise
pour excuter du code privilgi
a nest pas ncessaire car le code privilgi
ne permet pas dexcuter du code qui nest
pas autoris normalement par la classe

R. Grin Java : scurit page 70


Exemple de code privilgi
Code extrait du constructeur de la classe
java.io.PrintWriter :
lineSeparator =
(String)AccessController.doPrivileged(
new sun.security.action.GetPropertyAction(
"line.separator"));
La variable lineSeparator est utilise par le code
de la mthode println() ; doPrivileged assure
que la proprit line.separator pourra tre lue
quelle que soit la politique de scurit et les
mthodes qui ont appel ce code (puisque
PrintWriter a tous les droits, tant dans le JDK)
R. Grin Java : scurit page 71
Autre exemple de code privilgi :
le problme rsoudre
On a un fichier sensible password dans lequel il
faut absolument respecter un format spcial
Comment permettre lcriture dans ce fichier
sans permettre lcriture de lignes qui ne
respectent pas ce format ?

R. Grin Java : scurit page 72


Une solution
crire une classe spciale, seule autorise
crire dans le fichier (utiliser son codebase dans le
fichier de police), comportant une mthode
ecrire qui effectue les critures dans le fichier
password en mode privilgi
Les autres classes devront dlguer cette
classe les critures dans le fichier
Elles pourront ainsi enregistrer dans le fichier,
mais sans risquer de casser le format du fichier
Sans le mode privilgi, elles nauraient pas eu
le droit dcrire dans le fichier
R. Grin Java : scurit page 73
Exemple de code privilgi
static void ecrire(final String s) throws IOException {
if (s na pas le bon format)
throw new IOException("Mauvais format");
try {
AccessController.doPrivileged(
new PrivilegedExceptionAction() {
. . .
public Object run() throws IOException {
Ecriture de s dans le fichier password
}
});
} catch(PrivilegedException e) { Renvoie
throw e.getException();
lexception
}
}
leve par run()
R. Grin Java : scurit page 74
Threads et hritage du contexte
pour le contrle d'accs
Quand un nouveau thread est cr, le
contexte pour le contrle d'accs est hrit
par ce thread
L'hritage se fait au moment de la cration et
pas du lancement du thread

R. Grin Java : scurit page 75


Les fichiers de
police de scurit

R. Grin Java : scurit page 76


Configuration de la scurit

Les grandes lignes pour la scurit sont


configures par le fichier de proprits
<java.home>/lib/security/java.security
o <java.home> est le rpertoire o est
install le programme jre (Java Runtime
Environment), en gnral le sous-rpertoire
jre du rpertoire o a t install le SDK

R. Grin Java : scurit page 77


Fichiers de police (.policy)

Ces fichiers sont utiliss pour dfinir les droits


des classes Java
Leur emplacement est donn par les proprits
policy.url.n (n=1, 2,) du fichier de
proprits java.security
La convention est de donner l'extension
.policy aux fichiers de police

R. Grin Java : scurit page 78


Emplacement par dfaut des
fichiers de police (.policy)
Emplacement de fichiers des polices systme
et utilisateur dans le fichier java.security :
policy.url.1=
file:${java.home}/lib/security/java.policy
policy.url.2=
file:${user.home}/.java.policy
S'il n'existe pas de fichiers de police, la politique de
scurit correspond aux restrictions du bac sable
des applets (presque rien n'est autoris)
${java.home} =
valeur de la proprit java.home
R. Grin Java : scurit page 79
Ajouter un fichier de police
Remplace les fichiers de
Nom d'un fichier
police par dfaut si ==
2 moyens pour ajouter un fichier :
n option -Djava.security.policy=maPolice
des commandes java ou appletviewer
n ajouter une proprit policy.url.n dans un
fichier de proprit ; par exemple,
policy.url.3=file:${user.home}/mapolice
La 1re solution est la meilleure pendant les tests
Remarque : ne pas oublier loption
Djava.security.manager

R. Grin Java : scurit page 80


Contenu des fichiers de police
Un fichier de police de scurit contient des entres
du type grant (signedBy et codeBase sont
optionnels) :
grant signedBy "signataires", codeBase "url"
{
permission1; Ne pas oublier les ;
permission2; en particulier celui-ci !!
};
Il peut aussi contenir une entre keystore :
keystore "emplacement", "type";

jks par dfaut (format de Sun)


R. Grin Java : scurit page 81
Exemple de fichier
de police de scurit
// Un commentaire
keystore ".keystore";
grant signedBy "toto" {
permission java.io.FilePermission
"${user.home}${/}-", "read";
};
grant codeBase "http://truc.fr/~toto/*" {
permission java.util.PropertyPermission
"user.home", "read";
};
R. Grin Java : scurit page 82
Entre grant
Une entre grant commence par grant suivi
optionnellement d'un signedBy et/ou d'un
codeBase (dans un ordre quelconque) :
grant
grant signedBy "signataire[,signataire2,]"
grant codeBase "unURL"
grant signedBy "signataire", codeBase "unURL"

R. Grin Java : scurit page 83


signedBy et codeBase
signedBy indique par qui la classe doit tre
signe ; si plusieurs signataires sont
mentionns, la classe doit tre signes par
tous les signataires (un seul ne suffit pas)
codeBase indique de quel URL la classe a
t charge par le chargeur de classes
Par dfaut, les permissions du grant sont
accordes toutes les classes, signes ou
non, et venant de n'importe quel URL

R. Grin Java : scurit page 84


URL pour le codeBase
Diffrentes significations selon la fin de l'URL :
n "/" dsigne toutes les classes (pas les JAR)
situes dans le rpertoire plac avant le "/"
n "/*" dsigne toutes les classes (y compris les
classes dans les fichiers JAR) situes dans le
rpertoire
n "/-" dsigne toutes les classes (y compris les
classes dans les fichiers JAR) situes dans
l'arborescence du rpertoire
Si le codeBase dsigne un rpertoire, les classes se
trouvent dessous avec les chemins correspondant
leur paquetage
R. Grin Java : scurit page 85
Format des URL
Le sparateur est / dans tous les systmes
(mme sous Windows ou MacOS) : la notion d'URL est
universelle et ne doit pas dpendre d'un systme
particulier
LURL dun fichier local commence par
file:
Exemples dURL sous Windows :
/C:/rep1/

R. Grin Java : scurit page 86


Entre permission
Le format standard est
permission classePermission "but", "action";
n classePermission indique le type de permission
que l'on donne (nom d'une classe de permission)
n but indique sur quel objet on donne la permission
n action indique quel type d'action on autorise sur
le but
Certaines permissions peuvent ne pas avoir daction, ni
mme de but
Une permission peut comporter une clause signedBy
"noms" (classePermission doit tre signe)
R. Grin Java : scurit page 87
Quelques classes de permissions
java.security.Permission

java.security.AllPermission

java.net.SocketPermission

java.io.FilePermission

java.security.BasicPermission

java.net.NetPermission
java.security.SecurityPermission
java.lang.RuntimePermission
java.util.PropertyPermission
java.awt.AWTPermission
javax.sound.sampled.AudioPermission
java.lang.reflect.ReflectPermission
java.sql.SQLPermission
java.io.SerializablePermission

R. Grin Java : scurit page 88


Exemples de permissions
Les classes places la racine du serveur Web de
machine ont la permission de lire les fichiers de
/tmp et le droit de lire les valeurs de toutes les
proprits comme user.home ou user.name
grant codeBase "http://machine/*" {
permission java.io.FilePermission "/tmp/*",
"read";
permission java.util.PropertyPermission
"user.*", "read";
};

R. Grin Java : scurit page 89


Exemples de permissions (2)
Toutes les classes peuvent se connecter partout par
socket et peuvent lire tous les fichiers du rpertoire
indiqu
grant {
permission java.io.SocketPermission "*",
"connect";
permission java.io.FilePermission
"C:\\users\\truc\\*", "read";
};
Doubler les "\"
sous Windows

R. Grin Java : scurit page 90


Exemples de permissions (3)
Permission de lire les fichiers du rpertoire HOME de
l'utilisateur
Cet exemple utilise la valeur de la proprit systme
user.home (${user.home}), et ${/} qui
dsigne le sparateur utilis dans les noms de
fichiers (qui dpend du systme d'exploitation)
grant {
permission java.io.FilePermission
"${user.home}", "read";
permission java.io.FilePermission
"${user.home}${/}*", "read";
};

R. Grin Java : scurit page 91


Exemples de permissions (4)
Certaines permissions n'ont pas d'action :
permission java.lang.RuntimePermission
"getClassLoader";
Ou mme pas de but comme la permission
AllPermission

R. Grin Java : scurit page 92


Exemples de permissions (5)
Si on veut tester du code indpendamment des
problmes dautorisation, on peut donner
momentanment toutes les permissions
grant {
permission java.security.AllPermission;
};
Trs dangereux ! Ne jamais utiliser un tel fichier
quand lordinateur est connect Internet
nutiliser quavec loption D de java ; sinon,
limiter la porte par un codebase ; par exemple :
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
R. Grin Java : scurit page 93
Exemples de permissions (6)
Si on veut donner lautorisation daccder aux
membres non public dune classe avec la
rflexivit, on peut donner la permission suivante :
permission
java.lang.reflect.ReflectPermission
"suppressAccessChecks";
Cest videmment trs dangereux et doit tre
rserv des classes trs particulires comme les
dbuggeurs ou les outils interactifs pour construire
des applications

R. Grin Java : scurit page 94


BasicPermission
Les derniers exemples de permissions,
comme les PropertyPermission sont des
classes filles de BasicPermission
Elles permettent de donner un nom de but
hirarchique de type user.home, qui peut
comporter un * la place dun des noms
Par exemple,
permission java.util.PropertyPermission
"user.*"
donne des permissions sur les proprits
user.home, user.dir, user.name,

R. Grin Java : scurit page 95


FilePermission
Le but peut tre de plusieurs types :
n fichier ou rpertoire
n repertoire/* (ou *) : fichiers ou rpertoires situs
juste sous repertoire
n repertoire/- (ou -) : fichiers ou rpertoires situs
dans l'arborescence de repertoire
n <<ALL FILES>>
Attention, repertoire/* et repertoire/- ne
donnent pas la permission sur le rpertoire lui-
mme !
Pour Windows, remplacer / par \\ ou par
${/}
R. Grin Java : scurit page 96
FilePermission

L'action peut tre read, write, delete, execute,


mais pas "read,write" (2 entres sont ncessaires)

R. Grin Java : scurit page 97


Exemples de FilePermission
grant {
permission java.net.FilePermission
"/tmp/*" "read";
};

grant codeBase "http://deptinfo.unice.fr/-",


signedBy "paul" {
permission java.net.FilePermission
"C:\\users\\bibi\\*", "write";
};

R. Grin Java : scurit page 98


Permissions pour le Web
Ds quune connexion avec une machine
distante a lieu, il est vraisemblable que des
sockets sont utiliss et on devra ajouter des
permissions java.net.SocketPermission
Par exemple, pour charger un fichier depuis la
machine deptinfo.unice.fr, en passant par un
serveur HTTP, on devra ajouter la permission
suivante :
permission "deptinfo.unice.fr",
"connect,accept,resolve";

R. Grin Java : scurit page 99


Messages d'erreur lis la scurit
Exception occurred during event dispatching:
java.security.AccessControlException: access denied
(java.io.FilePermission C:\ read)
at
java.security.AccessControlContext.checkPermission(...)
at java.security.AccessController.checkPermission(...)
at java.lang.SecurityManager.checkPermission(...)
at java.lang.SecurityManager.checkRead(...)
at java.io.File.isDirectory(...)

Il manque cette permission


dans les fichiers de police de scurit
R. Grin Java : scurit page 100
Trouver les permissions
qui manquent
Pour faire afficher les noms des permissions
ncessaires lexcution, on peut lancer une
application avec
java Djava.security.debug=access,failure

R. Grin Java : scurit page 101


Faire afficher les permissions
accordes une classe
ProtectionDomain domain =
this.getClass().getProtectionDomain();
PermissionCollection pcoll =
Policy.getPolicy().getPermissions(domain);
Enumeration enum = pcoll.elements();
while (enum.hasMoreElements()) {
Permission p =
(Permission)enum.nextElement();
}

R. Grin Java : scurit page 102


Reprer la bonne JVM
Si malgr tous vos efforts, lapplet ou
lapplication refuse de tenir compte de vos
fichiers de permissions, vous vous trompez
peut-tre de JVM
Il est en effet possible davoir plusieurs JVM
sur une machine, en particulier quand on
utilise un navigateur Web qui a sa propre
JVM, ou qui utilise le plugin Java de Sun,
avec sa propre JVM

R. Grin Java : scurit page 103


Entre keystore
keystore "urlFichier" [, "type"];
Cette entre est obligatoire ds qu'une entre
grant fait rfrence une signature
Elle doit alors tre unique
Elle peut tre n'importe o dans le fichier de police
emplacement est un URL absolu, ou relatif
l'emplacement du fichier de police de scurit
type dfinit le format de stockage et de cryptage
des informations contenues dans le fichier
n "jks" est un type dfini par Sun ; c'est le type par dfaut
R. Grin Java : scurit page 104
Cryptographie

R. Grin Java : scurit page 105


Plan
Concepts
Signature digitale
Certificat

R. Grin Java : scurit page 106


Concepts pour la cryptographie

R. Grin Java : scurit page 107


changer des messages confidentiels
On veut
n confidentialit : seul le destinataire peut lire le
message
n authentification de lexpditeur

n intgrit du contenu du message : un tiers ne


peut modifier le message sans que a se voit
n non-rpudiation : lexpditeur ne peut nier
avoir envoyer le message et le destinataire ne
peut nier lavoir reu

R. Grin Java : scurit page 108


Cryptographie
Science et techniques pour chiffrer des
informations
Les algorithmes reposent sur la notion de cl
Une cl est une information utilise pour
chiffrer ou dchiffrer une information
2 types principaux dalgorithmes de
chiffrement/dchiffrement :
n cl cache (ou symtrique)

n cl publique (ou asymtrique)

R. Grin Java : scurit page 109


Dans ce cours nous n'tudierons pas les
algorithmes de chiffrement, ni le chiffrement
des messages
Nous verrons comment
n signer des documents

n fournir des certificats pour assurer

l'authentification de l'auteur d'un message

l'intgrit du message

la non-rpudiation de l'auteur du message

R. Grin Java : scurit page 110


Cryptographie cl cache
Cest la plus ancienne technique de
cryptographie
Une mme cl permet de chiffrer et de
dchiffrer les messages
Cette cl doit tre partage par lexpditeur et
le destinataire

R. Grin Java : scurit page 111


Problmes de la cryptographie
cl cache
Comment schanger la cl ?
Si un tiers peut intercepter la cl pendant
lchange, il peut lire tous les messages

R. Grin Java : scurit page 112


Comparaison cl cache -
cl publique
La cryptographie cl publique na pas le
problme de la transmission de la cl
Les possibilits sont plus riches avec la
cryptographie cl publique
Mais le chiffrement/dchiffrement est souvent
plus rapide avec une cl cache

R. Grin Java : scurit page 113


Cryptographie cl publique
Chaque acteur (expditeur ou destinataire) a
2 cls diffrentes :
n une cl publique connue de tous

n une cl prive connue seulement par


lacteur
Un message chiffr avec une des 2 cls est
dcrypte avec l'autre cl
Permet dviter le problme dchange de cl
symtrique et offre de nouvelles possibilits

R. Grin Java : scurit page 114


Principe essentiel de la
cryptographie cl publique
Les 2 cls sont gnres par des algorithmes
qui sappuient sur des thories mathmatiques
(arithmtique des grands nombres premiers) qui leur
assurent la proprit suivante :
n il est facile de chiffrer un message avec la cl
publique
n il est extrmement difficile de dchiffrer le
message si on ne connat pas la cl prive

R. Grin Java : scurit page 115


Infrastructure cl publique
Lutilisation des cls publiques-prives
impose la gestion et mise disposition des
cls publiques, la certification des identits
associes ces cls
Des tiers effectuent ces tches : autorits
denregistrement et de certification
Pour travailler grande chelle avec les cls
publiques il est donc ncessaire dinstaller
une infrastructure cl publique (ICP en
abrg, PKI en anglais)
R. Grin Java : scurit page 116
Utilisation de la cryptographie
cl publique
Nous allons tudier comment elle permet
n la confidentialit

n lauthentification

n la non-rpudiation

n lintgrit

R. Grin Java : scurit page 117


Chiffrement avec cl publique
Envoi dun message chiffr :
1. lexpditeur chiffre son message avec la cl
publique du destinataire (elle est connue de
tous)
2. le destinataire dchiffre avec sa cl prive,
reste chez lui bien en scurit
On assure ainsi la confidentialit et
lauthentification du destinataire
Pour lintgrit, lauthentification et la non-
rpudiation de lexpditeur, il faut ajouter
une signature
R. Grin Java : scurit page 118
Signatures digitales

R. Grin Java : scurit page 119


Signature

Une signature numrique cl publique


permet :
n authentification de lexpditeur

n intgrit : vrifier que ces donnes n'ont


pas t modifies depuis que le document
a t sign
n non rpudiation : le signataire ne peut pas
nier avoir sign le document

R. Grin Java : scurit page 120


Cryptage
Un message peut tre crypt avec une cl
publique ; ce message pourra tre dcrypt par
la cl prive correspondante
Ce sens sert transmettre des messages
secrets
Un message peut tre crypt avec une cl
prive ; ce message pourra tre dcrypt par la
cl publique correspondante
Ce sens sert pour les signatures digitales

R. Grin Java : scurit page 121


Proprits des signatures
cls asymtriques
Elle permet d'affirmer que le signataire du
message a bien une certaine cl publique
Elle ne peut tre imite si on ne connat pas la
cl prive du signataire

R. Grin Java : scurit page 122


Rsum
Un rsum (message digest en anglais) est
une information de taille fixe calcule partir
du contenu du message par une fonction de
hachage
La taille du rsum est bien plus petite que la
taille du message

R. Grin Java : scurit page 123


Fonctions de hachage
Une fonction de hachage h : T C associe
tout texte T un condens (empreinte, rsum)
C de longueur fixe de ce texte
Une bonne fonction de hachage h a les
proprits suivantes :
n il est facile de calculer C
n il est trs difficile (sinon impossible) de calculer T
partir de C
n il est trs difficile de trouver T' tel que h(T) = h(T')
n h est presque injective ; si T1 T2, il est
presque sr que h(T1) h(T2)
R. Grin Java : scurit page 124
Fonctions de hachage
Les fonctions les plus couramment utilises :
n MD5 (128 bits)
n SHA
n SHS (160 bits)

R. Grin Java : scurit page 125


Comment signer
Une signature est compose en chiffrant un
rsum du message avec la cl prive du
signataire
Le destinataire va dcrypter le rsum avec la
cl publique du signataire
Si le rsultat du dcryptage correspond bien au
rsum du message reu, a signifie que
n le signataire est bien le bon (celui qui a cette cl
publique)
n le message na pas t modifi depuis le calcul de la
signature
R. Grin Java : scurit page 126
Envoi par E de donnes signes

Hachage Donnes

Signature
Rsum
Identit
Transmis au
Cl destinataire
Cryptage
prive
de E

R. Grin Java : scurit page 127


Rception par R des donnes
Donnes Hachage Rsum

Comparaison
Signature
Dcryptage Rsum
Identit
Reu par le
destinataire Cl publique

Cl
Mais a ne marche que si Lit cl publique
celui qui reoit a dj la cl expditeur de E
publique de l'expditeur
R. Grin Java : scurit page 128
Certificats

R. Grin Java : scurit page 129


Association cls-identits
Celui qui reoit un message sign doit
possder la cl publique du signataire et avoir
un moyen dassocier cette cl publique
lidentit du signataire (base de donne ou autre)
Imaginez le travail pour
n recevoir et grer les milliers de cls
publiques des clients et des partenaires
n sassurer que ces cls publiques
appartiennent bien ces correspondants

R. Grin Java : scurit page 130


Certificats
Comment a se passe en ralit :
Le plus souvent, celui qui reoit le message
n'a pas la cl de l'expditeur
La cl publique du signataire est transmise
avec le message, dans un certificat qui
associe cette cl avec lidentit du signataire

R. Grin Java : scurit page 131


Utilisation des certificats
Comment avoir confiance en ce certificat ?
Ce certificat est sign par une autorit publique
de certification (comme Verisign) qui a une cl
publique bien connues de tous (ou il existe des
moyens srs et faciles de lobtenir)
On se retrouve alors dans le cas o on connat
la cl de l'expditeur des donnes (la donne
est le certificat) ; on peut donc s'assurer que le
certificat contient des donnes exactes
On a donc la cl publique de l'expditeur, et on
peut donc vrifier la signature des donnes
R. Grin Java : scurit page 132
Ce que contient un certificat
Lautorit fournit un certificat sign par elle, qui
contient
n des informations sur le possesseur du
certificat : nom, adresse, etc.
n la cl publique de ce possesseur

n des informations lies au certificat : dates de


validation, numro de srie, etc.

R. Grin Java : scurit page 133


Ce qui est envoy
Un certificat
est un message MESSAGE
sign.
Si on connat
la cl publique Signature
de l'autorit,
et si on a CERTIFICAT
confiance en
Cl publique de E
cette autorit,
on peut tre sr Informations sur possesseur
des informations
Signature de lautorit
qu'il contient.
Informations sur le certificat
R. Grin Java : scurit page 134
Stockage des cls
Toute application Java peut avoir un lieu de
stockage des cls publiques
Cette base de donnes contient des cls
publiques et des chanes de certificats qui
authentifient les cls publiques
Elle peut aussi contenir des cls prives locales
(celles de l'utilisateur de l'application) avec leurs
chanes de certificats
Des mots de passe peuvent tre associs au
lieu de stockage et chacune des cls

R. Grin Java : scurit page 135


Entrept des certificats par dfaut
Par dfaut les certificats sont entreposs
dans le fichier java.home/lib/security/cacerts
(java.home est le rpertoire jre dinstallation
de java)
Pour lister les certificats : keytool -list
On peut indiquer un autre fichier entrept :
keytool list file entrepot

R. Grin Java : scurit page 136


Envoi de donnes signes

Hachage Donnes

Signature
Rsum
Certificat
Cl
prive de E Cryptage Transmis au
destinataire
certificat

R. Grin Java : scurit page 137


Rception des donnes
Donnes Hachage Rsum

Signature Comparaison

Certificat Dcryptage Rsum

Reu par le
destinataire Cl publique
de E vrifie
Cl
Extraction publique
cl autorit

R. Grin Java : scurit page 138


La chane de vrification
Le vrificateur du certificat doit dj connatre la
cl publique de l'autorit de certification
(appelons-la CA1)
Sinon, le vrificateur doit avoir un certificat, mis
par une autorit de certification CA2 dont il
connat la cl publique, et qui authentifie la cl
publique de CA1
On peut ainsi avoir une chane de certificats
signs par CA1, CA2, CA3, ...
Cette chane confirme l'identit du signataire si
un des certificats a t sign par une autorit
dj connue par le vrificateur
R. Grin Java : scurit page 139
Comment obtenir un certificat
1. Gnration dune paire de cls publique-prive
2. Fournir lautorit qui dlivre le certificat
n la cl publique
n des documents qui certifient lidentit
3. Lautorit fournit un certificat sign par elle, qui
permet d'associer la cl publique et l'identit
Pour les cas de diffusion restreinte, on peut se contenter
d'un certificat auto-sign que l'on distribue aux
utilisateurs

R. Grin Java : scurit page 140


Types de certificats
Les autorits universellement connues ne sont
pas les seules dlivrer des certificats
Un organisme peut aussi utiliser en interne sa
propre autorit de certification
Un certificat peut aussi tre auto-sign, c'est--
dire sign par la personne qui est authentifie
par le certificat (convient si le destinataire connat la
cl publique de celui qui a sign)

R. Grin Java : scurit page 141


Les outils

R. Grin Java : scurit page 142


Plan
Plugin Java pour les navigateurs Web
Les outils pour la signature

R. Grin Java : scurit page 143


Plugin Java pour
les navigateurs Web

R. Grin Java : scurit page 144


Quest-ce que cest ?
Sun fournit un plugin Java pour les
navigateurs Web qui permet aux applets de
sexcuter indpendamment de la version de
la machine virtuelle Java installe dans le
navigateur
Des informations sur le plugin en
http://java.sun.com/products/plugin/
FAQ :
http://java.sun.com/j2se/1.5.0/docs/guide/plug
in/developer_guide/faq/index.html
R. Grin Java : scurit page 145
Installation du plugin
Ce plugin sinstalle sur la machine dun client
Web en mme temps que le JRE Java
Sil nest pas install, lapplet peut demander
son installation
Linstallation est longue mais elle ne se fait
quune fois ; les applets suivantes pourront
utiliser le plugin install par la premire applet

R. Grin Java : scurit page 146


Pratique de la signature avec les
outils fournis par Sun

R. Grin Java : scurit page 147


Outils pour la scurit
policytool facilite la saisie d'une police de
scurit (vite les fautes de syntaxe que lon peut
faire si on modifie la main les fichiers de police)
jarsigner permet de signer un fichier JAR ou
de vrifier sa signature
keytool permet de grer des cls et des
certificats

R. Grin Java : scurit page 148


Algorithmes utiliss dans les API
Fonction de hachage par dfaut : SHA1
Chiffrement par dfaut pour les signatures :
DSA, ce qui donne l'algorithme de signature
de nom interne SHA1withDSA
Autres possibilits : MD2withRSA, MD5withRSA,
SHA1withRSA
Certificats selon la norme X.509

R. Grin Java : scurit page 149


Nous allons donner 2 exemples concrets :
n signer du code qui sera excut par un
autre (une applet)
n signer un document que l'on envoie un
autre

R. Grin Java : scurit page 150


Crer les cls
Cration des cls prive et publique de toto, et
d'un certificat auto sign valable 90 jours (rangs
dans le fichier .keystore) :
> keytool -genkey -alias toto -keystore .keystore
Enter keystore password: abc123
cr s'il n'existe
What is your first and last name? pas ; par dfaut
[Unknown]: Pierre Toto $HOME/.keystore
What is the name of your organizational unit?
[Unknown]: Dept informatique
What is the name of your organization?
[Unknown]: UNSA
What is the name of your City or Locality?
[Unknown]: Nice
. . .
R. Grin Java : scurit page 151
Obtenir un certificat
Obtenir un certificat (ou une chane de
certificats) pour certifier la cl publique de toto,
mis par une autorit publique connue
Pour cela il faut envoyer la cl publique de toto
et les documents demands par l'autorit pour
identifier toto
En retour lautorit publique envoie un certificat
qui certifie que la cl publique envoye est bien
celle de toto

R. Grin Java : scurit page 152


Obtenir un certificat
Lorsque lon a obtenu le certificat, on lajoute au
fichier o sont entreposes les cls (ici le fichier
.keystore) de toto :
> keytool -import -alias toto
-keystore .keystore -file reponseCA
Cette tape n'est pas obligatoire, on peut se
contenter du certificat auto-sign si la
communaut qui change des informations nest
pas trop importante

R. Grin Java : scurit page 153


Exporter un certificat
Exporter le certificat :
> keytool -export -alias toto
keystore .keystore -file toto.crt
Ce certificat pourra tre import dans la base de
donnes des cls de ceux qui feront confiance
toto

R. Grin Java : scurit page 154


Exporter un certificat
Exporter le certificat :
> keytool -export -alias toto
keystore .keystore -file toto.crt
Ce certificat pourra tre import dans la base de
donnes des cls de celui qui fera confiance
toto

R. Grin Java : scurit page 155


Signer un fichier jar
Crer le fichier unjar.jar
> jar cvf unjar.jar Classe.class
toto signe le fichier unjarsigned.jar qui ajoute son
certificat au contenu du fichier unjar.jar
> jarsigner -keystore .keystore
-signedjar unjarsigne.jar unjar.jar toto

R. Grin Java : scurit page 156


Exemple de fichier MANIFEST.MF
d'un fichier jar sign
Manifest-Version: 1.0
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: TestAppletEcriture.class
SHA1-Digest: mOaQUgZhHj1ksr53hHk/FAGLdWE=

Name: rep/Classe.class
SHA1-Digest: xrQEm9gZhHj1ksr53hHkYV4XIt0=

rsum du fichier
R. Grin Java : scurit rep/Classe.class page 157
Etapes la rception des messages
L'utilisateur qui recevra de toto le fichier sign
va vrifier que c'est bien toto qui a sign
1. il vrifie d'abord que le certificat de toto qu'on lui a
envoy contient des informations qui
correspondent aux informations qu'il a reu par
d'autres voies fiables
2. il doit tout d'abord importer le certificat de toto
dans sa base de cls
2. il peut ensuite utiliser cette base de cl en
donnant son emplacement dans le fichier de
police de scurit (entre "keystore")
R. Grin Java : scurit page 158
Importer un certificat
Vrifier le certificat en comparant les
informations imprimes par keytool avec des
informations fiables obtenues par ailleurs :
keytool -printcert -file toto.cer
Importer le certificat de toto utilisateur en qui
on peut avoir confiance :
keytool -import -alias toto
-file toto.cer -keystore .keystore

R. Grin Java : scurit page 159


Certificats rvoqus
Java ne vrifie pas auprs de lautorit de
certification si le certificat a t rvoqu (en
cas, par exemple, de vol ou de certificat
attribu par erreur)
Pour les cas o une scurit renforce est
ncessaire, il faudra ajouter du code pour
effectuer cette vrification

R. Grin Java : scurit page 160


Signature et plugin Java
Depuis la version JDK 1.3, une applet signe
et certifie peut avoir tous les droits si
lutilisateur dclare avoir confiance dans cette
applet signe (le navigateur lui pose la
question)
Cette fonctionnalit a t ajoute pour
faciliter lexcution des applets sans
installation de fichiers de police de scurit
spciaux chez les clients Web

R. Grin Java : scurit page 161


Signature et plugin Java
Mais cette possibilit peut tre juge
dangereuse
Le fichier de police de scurit du client peut
comporter une ligne
permission java.lang.RuntimePermission
"usePolicy";
pour indiquer que seule la police de scurit
doit tre examine, et que mme une applet
signe devra sy tenir

R. Grin Java : scurit page 162


Signature et plugin Java
Le plugin Java a chang de politique de scurit
chaque version du jre, ce qui ne favorise pas
la portabilit
Les fonctionnalits ont t ajoutes pour faciliter
le dploiement des applets
n avec le jre 1.2, seuls les fichiers de police de scurit
sont pris en compte
n avec le jre 1.3, il nest pas tenu compte de ces fichiers
de police si lapplet est signe avec un certificat
obtenu par une autorit connue de certification, et si
lutilisateur affirme avoir confiance en ce certificat
n avec le jre 1.4, a marche aussi avec les certificats
auto-signs
R. Grin Java : scurit page 163
Complments

R. Grin Java : scurit page 164


Utiliser MD5
Exemple de code qui renvoie le MD5 dun
tableau doctets (il faut importer
java.security) :
try {
MessageDigest md =
MessageDigest.getInstance("MD5");
return md.digest();
}
catch(NoSuchAlgorithmException e) {
. . .
}

R. Grin Java : scurit page 165


Utiliser MD5
Une petite difficult : les mots de passe sont
rcuprs dans un char[] (par exemple avec
getPassword() de JPasswordField) et
digest prend un byte[] en paramtre
Pour transformer un char[] en byte[] on
peut utiliser Charset :
Charset charset =
Charset.forName("ISO-8859-1");
CharsetEncoder encoder =
charset.newEncoder();
ByteBuffer bbuf =
encoder.encode(CharBuffer.wrap(mdp));
byte[] mdpByte = bbuf.array();
R. Grin Java : scurit page 166
Protger les paquetages
Par dfaut, les paquetages ne sont pas protgs
Un programmeur peut ajouter une classe dans
nimporte quel paquetage et avoir ainsi accs
tous les membres des classes du paquetage qui
ont un accs rserv au paquetage
On peut empcher lajout de nouvelles classes
dans les paquetages par divers moyens :
n par les mcanismes de protection lis aux fichiers de
polices de scurit
n par les fichiers jar "scells"

R. Grin Java : scurit page 167


Protger des paquetages avec les
fichiers de scurit
On peut empcher
n le chargement direct dune classe dun paquetage
n lajout de nouvelles classes dans un paquetage
Pour commencer, il faut ajouter des entres dans le
fichier de scurit (.security)
Ces entres sont des listes de noms spars par des , ;
tout paquetage dont le nom commence ainsi est protg
Pour empcher le chargement direct :
package.access=fr.unice.librairie,com.truc
Pour empcher lajout de nouvelles classes :
package.definition= fr.unice,com.truc
R. Grin Java : scurit page 168
Permissions pour les paquetages
Si on a protger un paquetage on peut autoriser
laction interdite en ajoutant des entres dans les
fichiers de police de scurit (.policy)
Lautorisation suivante permettra un accs direct aux
classes du paquetage fr.unice.toto.truc
RuntimePermission
"accessClassInPackage.fr.unice.toto.truc"
De mme, il faudra ajouter une autorisation
RuntimePermission "defineClassInPackage.."
pour permettre lajout dune classe dans un
paquetage
R. Grin Java : scurit page 169
Exemple
grant codeBase "http:mezzo.unice.fr/-" {
java.lang.RuntimePermission
"accessClassInPackage.fr.unice.librairie";
};

R. Grin Java : scurit page 170


Prise en compte
des protections des paquetages
La protection des paquetage nest pas
vraiment prise en compte par les chargeurs
de classes de la version 1.3
La protection daccs nest prise en compte
que par la classe URLClassLoader, et
encore, seulement si linstance du chargeur
de classes a t obtenue par la mthode
static newInstance() et pas par new
La protection pour lajout dune classe dans
un paquetage nest prise en compte par
aucun chargeur de classes
R. Grin Java : scurit page 171
Fichiers jar scells
L'entre "Sealed: true" dans la section
principale du fichier MANIFEST d'un fichier
jar empche l'ajout de classes des
paquetages de ce fichier, venant d'une autre
source que ce fichier jar
On peut aussi ne protger que certains
paquetages du fichier jar en donnant des
entres du type
Name: fr/unice/p1
Sealed: true
R. Grin Java : scurit page 172
Protger des objets
On peut protger un objet particulier
GuardedObject permet de faire garder un
objet par un autre objet qui est d'une classe
qui implmente l'interface Guard :
GuardedObject go = new GuardedObject(
new ClasseProtegee(),
new GardeObjet());

La classe
implmente
linterface Guard
R. Grin Java : scurit page 173
Interface Guard
Elle contient la seule mthode checkGuard()
qui doit lancer une SecurityException si
l'accs l'objet est interdit
Cette interface est implmente par les classes
filles de la classe java.Security.Permission
Dans ce cas, checkGuard() fait un appel
securityManager.checkPermission(this);

R. Grin Java : scurit page 174


Exemple
Si on garde un objet avec une instance de
FilePermission, l'accs l'objet sera
autoris dans les mmes conditions que
l'accs un certain fichier
Avec le code suivant, objet ne pourra tre
rcupr que par le code qui aura
lautorisation de lire le fichier /rep1/fichier :
GuardedObject go =
new GuardedObject(
objet,
new FilePermission("/rep1/fichier",
"read"));

R. Grin Java : scurit page 175


Rcupration de lobjet
Quand on veut rcuprer l'objet protg, on
appelle la mthode getObject() de la
classe GuardedObject
getObject() fait un appel automatique la
mthode checkGuard() qui lancera une
SecurityException pour signaler que
l'accs l'objet est interdit

R. Grin Java : scurit page 176


JAAS
(Java Authentification and
Authorization Service)

R. Grin Java : scurit page 177


Prsentation
Le mcanisme des autorisations de Java 2
est centr sur le code : les permissions sont
donnes ou non selon lorigine du code (do
vient-il, qui la sign)
JAAS est centr sur lutilisateur : il va
permettre de donner des permissions en se
basant sur lutilisateur qui excute le code
Les utilisateurs doivent sauthentifier et
certaines parties du code ne pourront tre
excutes que par les utilisateurs autoriss
R. Grin Java : scurit page 178
Concepts de base de JAAS
Sujet (subject) : reprsente une entit
authentifie ; utilisateur, administrateur,
service Web, processus,
Identit (principal) : une des identits dun
sujet ; un sujet peut en avoir plusieurs, sur le
modle dun utilisateur qui peut avoir
plusieurs noms pour des services diffrents,
un numro de scurit sociale, une adresse
mail, etc.
Pice didentit (credential) : justificatif pour
une identit ; peut tre un objet quelconque
R. Grin Java : scurit page 179
Paquetages et quelques classes
Depuis la version 1.4, JAAS est inclus dans le
J2SE
javax.security.auth contient la classe
Subject
javax.security.auth.login contient la
classe LoginContext
javax.security.auth.spi contient
linterface LoginModule

R. Grin Java : scurit page 180


Paquetages et quelques classes
javax.security.auth.callback contient
les interfaces Callback et CallbackHandler,
et quelques classes qui implmentent
Callback

R. Grin Java : scurit page 181


2 parties dans JAAS
Lauthentification de lutilisateur (souvent
avec un systme de mot de passe)
Les autorisations, lies lutilisateur qui sest
authentifi, qui sajoutent au systme des
autorisations de Java 2 dj tudi

R. Grin Java : scurit page 182


Exemple minimal de code
LoginContext lc = new LoginContext("Appli1");
try { utilise des CallbackHandler pour
lc.login(); demander lutilisateur des
} informations
catch(LoginException e) {
// Le login na pas march
. . .
}
// Le login a march
Subject sujet = lc.getSubject();
Subject.doAs(sujet, new ActionProtegee());
R. Grin Java : scurit page 183
Authentification
Elle est effectue par une instance de la
classe LoginContext
Quand on cre cette instance, on lui passe
un identificateur qui va permettre JAAS de
savoir comment se fera lauthentification de
lutilisateur
Cet identificateur correspond une entre
dans un fichier de configuration ; il indique le
type dauthentification qui sera effectue

R. Grin Java : scurit page 184


Emplacement du
fichier de configuration
Il peut tre donn par
n la proprit Java
java.security.auth.login.config
n une ou plusieurs entres dans le fichier
java.security :
login.config.url.1=file:${java.home}/
lib/security/truc.config

R. Grin Java : scurit page 185


Fichier de configuration
Il contient des entres qui indiquent quels
modules de login devront tre utiliss :
entree1 {
ClasseModule1 flag options;
ClasseModule2 flag options;
. . .
}
entree2 {
. . .
}

R. Grin Java : scurit page 186


Exemple de fichier de configuration
Identifiant pass en paramtre du
Appli1 { constructeur de LoginContext
fr.unice.SgbdLoginModule Required
driver="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://m.unice.fr/jaas?user=adm"
debug="true";
}
Appli2 {
fr.unice.FichierLoginModule Required
fichier="rep/motdepasse";
}

R. Grin Java : scurit page 187


Classe LoginContext
Classe du paquetage
javax.security.auth.login
Elle contient une mthode login() pour
authentifier une entit lie lapplication
Le nom du contexte est fourni au
constructeur
Ce nom correspond une entre du fichier
de configuration
Cette entre indique les LoginModules qui
seront utiliss pour authentifier lentit
R. Grin Java : scurit page 188
Systme de plugin
Le LoginContext utilise des plugins, appels
modules de login, qui permettent dauthentifier
lutilisateur suivant diffrents modes ; par
exemple, en consultant une base de donnes
ou en vrifiant que lutilisateur est bien
enregistr dans un registre ou dans le systme
dexploitation de lordinateur
Les modules de login sont des classes qui
implmentent linterface
javax.security.auth.spi.LoginModule
R. Grin Java : scurit page 189
Modules de login
Le paquetage
com.sun.security.auth.module contient
des modules JAAS pour authentifier avec :
n nom et mot de passe Unix
(UnixLoginModule) ou Windows
(NTLoginModule)
n un service JNDI (JndiLoginModule)

n le protocole Kerberos (Kbr5LoginModule)

n une cl enregistre dans un fichier KeyStore


(KeyStoreLoginModule)
R. Grin Java : scurit page 190
Modules de login
On peut aussi crire ses propres modules de
login, ou les acheter ; par exemple des modules
pour authentifier avec
n un nom et mot de passe enregistrs dans une
base de donnes, ou un fichier

R. Grin Java : scurit page 191


Interface LoginModule
boolean login() : authentifie un Subject ;
utilise le plus souvent des callbacks pour
communiquer avec lentit authentifier si cest
ncessaire (par exemple pour obtenir un nom et
un mot de passe) ; elle rcupre auprs des
callback les informations obtenues
boolean commit() : appele si lauthentification
a bien eu lieu, cette mthode associe des identits
(Principal) au Subject
boolean abort() : appele si lauthentification
a chou
R. Grin Java : scurit page 192
Interface LoginModule
void initialize() : appele juste aprs la
cration du LoginModule pour lui passer le
Subject, le CallbackHandler.
Un des paramtres est une map qui contient les
options associes au module (voir le format du
fichier de configuration).
Par exemple, si le module authentifie les
utilisateurs grce une table dune base de
donnes relationnelle, ces valeurs dcriront la
base de donnes et la table (driver, URL,)
boolean logout() : sort du Subject en cours

R. Grin Java : scurit page 193


Classe javax.security.auth.Subject

Contient les mthodes static doAs,


doAsPriviledged et getSubject (renvoie
le Subject associ au contexte actuel)
et des accesseurs pour les Principal et les
Credential qui sont associs ce
Subject

R. Grin Java : scurit page 194


Interface java.security.Principal

Elle ne contient que la mthode


String getName()
qui renvoie le nom de lidentit

R. Grin Java : scurit page 195


Interface
javax.security.auth.callback.
CallbackHandler
Contient la seule mthode
void handle(Callback[] callbacks)
Cette mthode utilise les diffrents callbacks
pour obtenir des informations pour
authentifier lutilisateur
Limplmentation dpend du type
dapplication ; par exemple, si lapplication
utilise un GUI et quun callback a besoin dun
nom et dun mot de passe, elle peut faire
afficher une fentre de dialogue pour cela
R. Grin Java : scurit page 196
Interface Callback
Interface de javax.security.auth.callback
qui ne contient aucune mthode
Un callback permet lapplication dobtenir les
informations qui seront utilises pour
lauthentification et de passer ces informations
au code qui va authentifier lutilisateur
Par exemple, un callback peut avoir besoin dun
nom et un mot de passe et conserver ces
informations pour pouvoir les redonner ensuite
au code de la mthode login() du
LoginModule qui a appel la mthode
handle du CallbackHandler
R. Grin Java : scurit page 197
Interface Callback
Un callback est indpendant du type de
lapplication
Il a seulement besoin de certaines informations
pour pouvoir les redonner au code qui va
authentifier lutilisateur
Cest le callbackHandler qui va sadapter
lapplication pour obtenir ces informations

R. Grin Java : scurit page 198


Autorisations
Une fois que lutilisateur sest authentifi, on
peut rcuprer une instance de Subject par
loginContext.getSubject()
Ensuite, on peut nautoriser certaines actions
qu des utilisateurs particuliers
Lexcution de ces actions devra tre lance par
la mthode static doAs de la classe
Subject ; par exemple :
ActionSpeciale action =
new ActionSpeciale();
Subject.doAs(subject, action);

R. Grin Java : scurit page 199


Interface PrivilegedAction
Les actions passes la mthode doAs doivent
appartenir une classe qui implmente linterface
PrivilegedAction
Cette interface contient la mthode run() qui
contient laction excuter
La mthode doAs renvoie un Object, renvoy
par la mthode run()
Comme avec la mthode doPrivileged
tudie avant, si une action peut lancer des
exceptions, elle doit implmenter
PrivilegedExceptionAction
R. Grin Java : scurit page 200
Mode privilgi
Une mthode doAsPrivileged permet de
lancer laction dans un autre contexte
dexcution (en mode privilgi si on lui
passe null comme contexte)
Attention ne pas ouvrir des portes aux
pirates !

R. Grin Java : scurit page 201


Permissions indispensables
Les classes qui crent des LoginContext
ou appellent la mthode doAsPrivileged
doivent avoir certaines autorisations :
permission
javax.security.auth.AuthPermission
"createLoginContext"
permission
javax.security.auth.AuthPermission
"doAsPrivileged"

R. Grin Java : scurit page 202


Autorisations
Il est possible dattribuer certaines autorisations
des utilisateurs authentifis par JAAS dans les
fichiers de police de scurit
La syntaxe est :
grant codebase , signed by ,
Principal classePrincipal utilisateur {
permission . . .;
permission . . .;
}

R. Grin Java : scurit page 203


Exemple dautorisation
grant codebase "http://. . . "
Principal fr.truc.Principal1 "pierre" {
permission java.util.PropertyPermission
"user.home", "read";
. . .
}

R. Grin Java : scurit page 204


CallbackHandler
Pour accrotre la portabilit des applications,
la mthode login change des informations
avec lutilisateur authentifier, par
lintermdiaire dun callbackHandler
Un callbackHandler est dpendant de
lapplication, au contraire des callbacks quil
utilise

R. Grin Java : scurit page 205


Exemples de CallbackHandler
En changeant ainsi de handler, on pourra,
par exemple, demander le nom et le mot de
passe dun utilisateur en mode texte dans
une console, ou dans une fentre Swing, ou
par tout autre moyen, sans changer le code
de la mthode login

R. Grin Java : scurit page 206


Utilit des callbacks
Les changes avec lutilisateur sont
dtermins par un tableau de callbacks qui
va tre pass au handler
Un callback na pas daction directe avec
lutilisateur ; il sert seulement passer les
informations changes entre lapplication et
lutilisateur
Cest le handler qui va, selon les callbacks,
afficher des informations lutilisateur et lui
demander des informations quil va ensuite
ranger dans les callbacks
R. Grin Java : scurit page 207
Utilisation des callbacks (1)
La mthode login cre des callbacks, par
exemple, 2 callbacks NameCallback et
PasswordCallback
Elle lance alors un handler en lui passant les
callbacks dans un tableau
Le handler connat les interactions quil doit faire
avec lutilisateur, associes chaque type de
callback
Il peut interroger un callback (mthodes getXXX)
sil veut des prcisions ; pour obtenir, par
exemple, un texte afficher lutilisateur
R. Grin Java : scurit page 208
Utilisation des callbacks (2)
Le handler met dans les callback les
informations recueillies auprs de lutilisateur
(mthodes setXXX)
La mthode login rcupre ces informations
avec les mthodes getXXX de la classe du
callback

R. Grin Java : scurit page 209


Exemple de callback
NameCallback implmente linterface marqueur
Callback (obligatoire)
Il a les 2 constructeurs (utiliss au dbut de la mthode
login) :
n NameCallback(String prompt)

n NameCallback(String prompt, String

nomParDefaut)
Il a les mthodes suivantes :
n getPrompt()

n getName()

n setName(String nom)

n getDefaultName()

R. Grin Java : scurit page 210


Callbacks du JDK
Le plus souvent le dveloppeur utilisera les
classes de callbacks fournies avec lAPI (ou
avec un module de login JAAS)
Ils sont dans le paquetage
javax.security.auth.callback :
NameCallback, PasswordCallback,
TextOutputCallback,
ChoiceCallback,
Il peut cependant avoir crire ses propres
callback
R. Grin Java : scurit page 211
CallbackHandlers du JDK
Le plus souvent le dveloppeur aura crire un
callbackHandler pour indiquer comment
demander des informations lutilisateur laide
des callbacks
Il ny en a pas dans lAPI de base mais on en
trouve 2 qui demandent un nom et un mot de
passe dans le paquetage
com.sun.security.auth.callback :
DialogCallbackHandler (utilise une fentre
de dialogue Swing), TextCallbackHandler
(demande dans une console)
R. Grin Java : scurit page 212
crire un CallbackHandler
Il doit implmenter linterface
CallbackHandler du paquetage
javax.security.auth.callback, cest-
-dire implmenter la mthode void
handle(Callback[])
Un exemple est donn dans le tutorial
distribu avec le J2SE
(docs/guide/security/jaas/tutorials)

R. Grin Java : scurit page 213


JCA/JCE

R. Grin Java : scurit page 214


Les 2 APIs
LAPI pour la cryptographie est partage en 2
parties cause des restrictions dexportation
dans certains pays en dehors des tats-Unis
JCA (Java Cryptography Architecture) est
livre avec le SDK ; elle contient le
paquetage java.security ; elle est
exportable
JCE (Java Cryptography Extension) est une
extension ; elle contient le paquetage
javax.crypto ; elle nest pas exportable
dans tous les pays
R. Grin Java : scurit page 215
Annexes

R. Grin Java : scurit page 216


Fichier .security par dfaut
security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.rsajca.Provider
policy.provider=sun.security.provider.PolicyFile
policy.url.1=file:${java.home}/lib/security/java
.policy
policy.url.2=file:${user.home}/.java.policy
policy.expandProperties=true
policy.allowSystemProperty=true
policy.ignoreIdentityScope=false
keystore.type=jks
system.scope=sun.security.provider.IdentityDatab
ase
package.access=sun.
R. Grin Java : scurit page 217
Fichier .policy par dfaut
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
grant {
permission java.lang.RuntimePermission
"stopThread";
permission java.net.SocketPermission
"localhost:1024-", "listen";
permission java.util.PropertyPermission
"java.version", "read";
permission java.util.PropertyPermission
"java.vendor", "read";
permission java.util.PropertyPermission
"java.vendor.url", "read";
R. Grin Java : scurit page 218
Fichier .policy par dfaut (suite)
permission java.util.PropertyPermission
"java.class.version", "read";
permission java.util.PropertyPermission
"os.name", "read";
permission java.util.PropertyPermission
"os.version", "read";
permission java.util.PropertyPermission
"os.arch", "read";
permission java.util.PropertyPermission
"file.separator", "read";
permission java.util.PropertyPermission
"path.separator", "read";
permission java.util.PropertyPermission
"line.separator", "read";
R. Grin Java : scurit page 219
Fichier .policy par dfaut (suite 2)
permission java.util.PropertyPermission
"java.specification.version", "read";
permission java.util.PropertyPermission
"java.specification.vendor", "read";
permission java.util.PropertyPermission
"java.specification.name", "read";
permission java.util.PropertyPermission
"java.vm.specification.version", "read";
permission java.util.PropertyPermission
"java.vm.specification.vendor", "read";
permission java.util.PropertyPermission
"java.vm.specification.name", "read";

R. Grin Java : scurit page 220


Fichier .policy par dfaut (fin)
permission java.util.PropertyPermission
"java.vm.version", "read";
permission java.util.PropertyPermission
"java.vm.vendor", "read";
permission java.util.PropertyPermission
"java.vm.name", "read";
};

R. Grin Java : scurit page 221


Principaux algorithmes
de chiffrement
DES (Data Encryption Standard), cls
symtriques
RSA (Rivest, Shamir, Adleman), cls
asymtriques
RC4, RC5 (Rivest), cls symtriques
AES (Advanced Encryption Standard), tout
rcent, cls asymtriques

R. Grin Java : scurit page 222