JavaMail API セキュリティー権限のベスト・プラクティス

JavaMail API は、多くのアクティビティーで、 特定の構成ファイルへのアクセスを必要とします。 のJavaMailそしてJavaBeans Activation Framework バイナリ パッケージ自体には、必要な構成ファイルがすでに含まれています。 ただし、JavaMail API では、ユーザーが、ユーザー固有の構成ファイルおよび インストールごとに固有の構成ファイルを定義して、特殊な要求に応えることができます。

これらの構成ファイルは、<user.home><java.home>/lib の 2 つのディレクトリーに配置できます。 例えば、JavaMail API は、メッセージの送信時に mailcap という名前のファイルにアクセスする必要がある場合、以下を行います。
  1. <user.home>/mailcap へのアクセスを試みます。
  2. セキュリティー権限がないため、またはファイルが存在していないために最初の試みが失敗した場合、この API は <java.home>/lib/mailcap 内を検索します。
  3. 2 番目の試みも失敗した場合、この API は、クラスパスの META-INF/mailcap という場所を検索します。 この場所は、実際には mail-impl.jar ファイルおよび activation-impl.jar ファイルに含まれる構成ファイルに通じています。
Application Server は、mail-impl.jar ファイルおよび activation-impl.jar ファイル内に格納されている JavaMail API 構成ファイルを使用しますが、<user.home> ディレクトリーおよび <java.home>/lib ディレクトリーにはメール構成ファイルはありません。 JavaMail API が適切に動作するためには、Application Server は、インストールされているすべてのアプリケーションに mail-impl.jar と activation-impl.jar の両方のファイルに対するファイル読み取り許可を付与します。
JavaMail コードは、<user.home> および <java.home>/lib にある構成ファイルへのアクセスを試みますが、これによりアクセス制御例外がスローされることがあります。これは、デフォルト構成では、それら 2 つの場所にはデフォルトではファイル読み取り許可が付与されていないためです。 このアクティビティーは JavaMail API の正常な動作には影響を与えることはありませんが、メール関連の大量のセキュリティー例外がシステム・ログで報告され、これらのエラーにより、探している有害なエラーが見つかりにくくなることがあります。 以下に、セキュリティー・メッセージ 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. 
Please refer to Problem Determination Guide for further information.

Permission:

      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  in  {file:/D:/o063919/lib/runtime.jar}



Stack Trace:

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)
注記:この状況が問題になる場合は、さらに多くの場所に読み取りアクセス権限を追加することを検討してください。 これにより、すべて、またはほとんどの JavaMail 関連の重大ではないセキュリティー例外が、ログ・ファイルから除去されます。
JavaMail で必要なアクセス権は、以下のとおりです。
grant codeBase "file:${application}" {
  // Allow access to default configuration files
  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";
  // If using an isolated mail provider, 
  // add additional file read permissions for each jar defined
  // for the isolated mail provider
  // permission java.io.FilePermission "path${/}mail.jar, "read";
  
  // Allow connection to mail server using SMTP
  permission java.net.SocketPermission "*:25", "connect,resolve";
  // Allow connection to mail server using SMTPS
  permission java.net.SocketPermission "*:465", "connect,resolve";
  
  // Allow connection to mail server using IMAP
  permission java.net.SocketPermission "*:143", "connect,resolve";
  // Allow connection to mail server using IMAPS
  permission java.net.SocketPermission "*:993", "connect,resolve";
  
  // Allow connection to mail server using POP3
  permission java.net.SocketPermission "*:110", "connect,resolve";
  // Allow connection to mail server using POP3S
  permission java.net.SocketPermission "*:995", "connect,resolve";
  
  // Allow System.getProperties() to be used
  // permission java.util.PropertyPermission "*", "read,write";
  // Otherwise use the following to allow system properties to be read
  permission java.util.PropertyPermission "*", "read";
};