Meilleures pratiques concernant les droits d'accès de sécurité de l'API JavaMail
Dans la plupart de ses activités, l'API JavaMail doit accéder à certains fichiers de configuration. Les packages binaires JavaMail et JavaBeans Activation Framework contiennent déjà les fichiers de configuration nécessaires. Toutefois, l'API JavaMail permet à l'utilisateur de définir des fichiers de configuration personnalisés et spécifiques de l'installation afin de satisfaire des besoins spéciaux.
Ces fichiers de configuration peuvent être placés dans deux répertoires : <user.home> et <java.home>/lib.
Ainsi, si elle doit accéder à un fichier appelé mailcap lors de
l'envoi d'un message, l'API :
- essaiera d'accéder à <user.home>/mailcap
- si la première tentative échoue pour des raisons de droits d'accès insuffisants ou parce que le fichier n'existe pas, l'API fera une recherche dans <java.home>/lib/mailcap
- en cas d'échec de la deuxième tentative, l'API fera une recherche dans META-INF/mailcap sur le chemin des classes. A cette adresse se trouvent les fichiers de configuration contenus dans les fichiers mail-impl.jar et activation-impl.jar.
Le code de JavaMail tente d'accéder aux fichiers de configuration files présents dans <user.home> et <java.home>/lib,
ce qui peut faire lever une exception de contrôle d'accès, puisque par défaut la configuration n'accorde pas de droits de lecture sur les fichiers situés à ces deux emplacements. Cette activité n'affecte pas le fonctionnement de l'API JavaMail,
mais peut se traduire par un encombrement du journal système avec un grand nombre d'exceptions de sécurité liée à la messagerie,
qui peuvent avoir le fâcheux inconvénient d'éclipser d'autres messages d'erreurs bien plus nuisibles, elles.
Voici un exemple de message de sécurité, SECJ0314W :
[02/31/08 12:55:38:188 PDT] 00000058 SecurityManag W SECJ0314W: Current Java 2 Security policy reported a
potential violation of Java 2 Security Permission.
Pour plus d'informations, reportez-vous au guide d'identification des incidents.
Droit d'accès :
D:\o063919\java\jre\lib\javamail.providers : access denied (java.io.FilePermission
D:\o063919\java\jre\lib\javamail.providers read)
Code :
com.ibm.ws.mail.SessionFactory dans {file:/D:/o063919/lib/runtime.jar}
Trace de pile :
java.security.AccessControlException: accès refusé (java.io.FilePermission D:\o063919\java\jre\lib\javamail.providers read)
sur java.security.AccessControlContext.checkPermission(AccessControlContext.java(Compiled Code))
sur java.security.AccessController.checkPermission(AccessController.java(Compiled Code))
sur java.lang.SecurityManager.checkPermission(SecurityManager.java(Compiled Code))
sur com.ibm.ws.security.core.SecurityManager.checkPermission(SecurityManager.java(Compiled Code))
sur java.lang.SecurityManager.checkRead(SecurityManager.java(Compiled Code))
at java.io.FileInputStream.<init>(FileInputStream.java(Compiled Code))
at java.io.FileInputStream.<init>(FileInputStream.java:89)
sur javax.mail.Session.loadFile(Session.java:1004)
sur javax.mail.Session.loadProviders(Session.java:861)
at javax.mail.Session.<init>(Session.java:191)
sur javax.mail.Session.getInstance(Session.java:213)
sur com.ibm.ws.mail.SessionFactory.getObjectInstance(SessionFactory.java:67)
sur javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:314)
sur com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:894)
sur com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookup(Helpers.java:701)
sur com.ibm.ws.naming.jndicos.CNContextImpl.processResolveResults(CNContextImpl.java:1937)
sur com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1792)
sur com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1707)
sur com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1412)
sur com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:1290)
sur com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:145)
sur javax.naming.InitialContext.lookup(InitialContext.java:361)
sur emailservice.com.onlinebank.bpel.EmailService20060907T224337EntityAbstractBase$JSE_6.execute(EmailService20060907T224337EntityAbstractBase.java:32)
sur com.ibm.bpe.framework.ProcessBase6.executeJavaSnippet(ProcessBase6.java:256)
sur emailservice.com.onlinebank.bpel.EmailService20060907T224337EntityBase.invokeSnippet(EmailService20060907T224337EntityBase.java:40)
Remarque : Si cette situation pose un problème, vous pouvez ajouter plus d'autorisations d'accès en lecture pour davantage d'emplacements. Elles devraient éliminer la plupart ou la totalité des exceptions de sécurité liées à JavaMail dans le fichier journal.
Les droits requis par JavaMail sont les suivants :
grant codeBase "file:${application}" {
// Autorise l'accès aux fichiers de configuration par défaut
permission java.io.FilePermission "${java.home}${/}jre${/}lib${/}javamail.address.map", "read";
permission java.io.FilePermission "${java.home}${/}jre${/}lib${/}javamail.providers", "read";
permission java.io.FilePermission "${java.home}${/}jre${/}lib${/}mailcap", "read";
permission java.io.FilePermission "${java.home}${/}lib${/}javamail.address.map", "read";
permission java.io.FilePermission "${java.home}${/}lib${/}javamail.providers", "read";
permission java.io.FilePermission "${java.home}${/}lib${/}mailcap", "read";
permission java.io.FilePermission "${user.home}${/}.mailcap", "read";
permission java.io.FilePermission "${was.install.root}${/}lib${/}activation-impl.jar", "read";
permission java.io.FilePermission "${was.install.root}${/}lib${/}mail-impl.jar", "read";
permission java.io.FilePermission "${was.install.root}${/}plugins${/}com.ibm.ws.prereq.javamail.jar", "read";
// En cas d'utilisation d'un fournisseur de messagerie isolé,
// ajoute des droits de lecture de fichier supplémentaires pour chaque fichier JAR défini
// pour le fournisseur de messagerie isolé
permission java.io.FilePermission "path${/}mail.jar, "read";
// Autorise la connexion au serveur de messagerie avec SMTP
permission java.net.SocketPermission "*:25", "connect,resolve";
// Autorise la connexion au serveur de messagerie avec SMTPS
permission java.net.SocketPermission "*:465", "connect,resolve";
// Autorise la connexion au serveur de messagerie avec IMAP
permission java.net.SocketPermission "*:143", "connect,resolve";
// Autorise la connexion au serveur de messagerie avec IMAPS
permission java.net.SocketPermission "*:993", "connect,resolve";
// Autorise la connexion au serveur de messagerie avec POP3
permission java.net.SocketPermission "*:110", "connect,resolve";
// Autorise la connexion au serveur de messagerie avec POP3S
permission java.net.SocketPermission "*:995", "connect,resolve";
// Autorise l'utilisation de System.getProperties()
permission java.util.PropertyPermission "*", "read,write";
// Sinon, utilise le droit suivant pour autoriser la lecture des propriétés système
permission java.util.PropertyPermission "*", "read";
};