Procedimientos recomendados sobre permisos de seguridad de API JavaMail
En muchas de sus actividades, la API JavaMail tiene que acceder a determinados archivos de configuración. Los propios paquetes binarios JavaBeans y JavaMail Activation Framework (infraestructura de activación) contienen los archivos de configuración necesarios. No obstante, la API JavaMail permite al usuario definir archivos de configuración específicos del usuario y de la instalación para que cumplan requisitos especiales.
Las dos ubicaciones en las que puede colocar estos archivos de configuración son
los directorios <user.home> y
<java.home>/lib.
Por ejemplo, si la API JavaMail
debe acceder a un archivo denominado mailcap cuando envía un mensaje, la API:
- Intenta acceder al directorio <user.home>/mailcap.
- Si el primer intento falla debido a la falta del permiso de seguridad o a que el archivo no existe, la API busca en el directorio <java.home>/lib/mailcap.
- Si el segundo intento también falla, la API busca en la ubicación META-INF/mailcap de la vía de acceso a clases. Esta ubicación en realidad lleva a los archivos de configuración contenidos en los archivos mail-impl.jar y activation-impl.jar.
El código JavaMail intenta acceder a los archivos de configuración de los
directorios <user.home> y
<java.home>/lib, lo que puede dar lugar a la emisión
de una excepción de control de acceso, ya que la configuración predeterminada
no otorga permiso de lectura de archivos para estas dos ubicaciones de forma
predeterminada. Esta actividad no afecta al correcto funcionamiento de la API
JavaMail, pero es posible que se muestren muchas excepciones relacionadas con
la seguridad del correo en el registro del sistema, y estos errores podrían
eclipsar errores graves que esté buscando.
A continuación se muestra un ejemplo de mensaje de
seguridad, SECJ0314W:
[02/31/08 12:55:38:188 PDT] 00000058 SecurityManag W SECJ0314W: La política de seguridad actual Java 2 ha informado de una
posible violación del permiso de seguridad de Java 2.
Consulte la guía de determinación de problemas para
obtener más información.
Permiso:
D:\o063919\java\jre\lib\javamail.providers : acceso denegado (java.io.FilePermission
D:\o063919\java\jre\lib\javamail.providers lectura)
Código:
com.ibm.ws.mail.SessionFactory en {file:/D:/o063919/lib/runtime.jar}
Rastreo de pila:
java.security.AccessControlException: access denied (java.io.FilePermission D:\o063919\java\jre\lib\javamail.providers read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java(Compiled Code))
at java.security.AccessController.checkPermission(AccessController.java(Compiled Code))
at java.lang.SecurityManager.checkPermission(SecurityManager.java(Compiled Code))
at com.ibm.ws.security.core.SecurityManager.checkPermission(SecurityManager.java(Compiled Code))
at 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)
at javax.mail.Session.loadFile(Session.java:1004)
at javax.mail.Session.loadProviders(Session.java:861)
at javax.mail.Session.<init>(Session.java:191)
at javax.mail.Session.getInstance(Session.java:213)
at com.ibm.ws.mail.SessionFactory.getObjectInstance(SessionFactory.java:67)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:314)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:894)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookup(Helpers.java:701)
at com.ibm.ws.naming.jndicos.CNContextImpl.processResolveResults(CNContextImpl.java:1937)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1792)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1707)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1412)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:1290)
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:145)
at javax.naming.InitialContext.lookup(InitialContext.java:361)
at emailservice.com.onlinebank.bpel.EmailService20060907T224337EntityAbstractBase$JSE_6.
execute(EmailService20060907T224337EntityAbstractBase.java:32)
at com.ibm.bpe.framework.ProcessBase6.executeJavaSnippet(ProcessBase6.java:256)
at emailservice.com.onlinebank.bpel.EmailService20060907T224337EntityBase.invokeSnippet
(EmailService20060907T224337EntityBase.java:40)
Nota: Si esta situación es un problema, puede añadir más permisos
de acceso de lectura para más ubicaciones. Así se eliminaría del archivo de anotación cronológica la mayoría (si
no todas) de las excepciones de seguridad inocuas relacionadas con JavaMail.
JavaMail necesita los permisos siguientes:
grant codeBase "file:${application}" {
// Permitir el acceso a los archivos de configuración predeterminados
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";
// Si se utiliza un proveedor de correo aislado,
// añada más permisos de lectura de archivo para cada jar definido
// para el proveedor de correo aislado
// permission java.io.FilePermission "path${/}mail.jar, "read";
// Permitir conexión a servidor de correo con SMTP
permission java.net.SocketPermission "*:25", "connect,resolve";
// Permitir conexión a servidor de correo con SMTPS
permission java.net.SocketPermission "*:465", "connect,resolve";
// Permitir conexión a servidor de correo con IMAP
permission java.net.SocketPermission "*:143", "connect,resolve";
// Permitir conexión a servidor de correo con IMAPS
permission java.net.SocketPermission "*:993", "connect,resolve";
// Permitir conexión a servidor de correo con POP3
permission java.net.SocketPermission "*:110", "connect,resolve";
// Permitir conexión a servidor de correo con POP3S
permission java.net.SocketPermission "*:995", "connect,resolve";
// Permitir utilización de System.getProperties()
// permission java.util.PropertyPermission "*", "read,write";
// En caso contrario, utilice esto para permitir la lectura de las propiedades del sistema
permission java.util.PropertyPermission "*", "read";
};