エンタープライズ:特集 2003/08/24 23:01:00 更新

[JAVA Developer特別企画]
Tomcatで試すJava 2 セキュリティ (4/6)

JAVA Developer 2003年10月号より転載

パーミッションクラス
 ここでは、サーバーサイドでもよく利用するパーミッションとして8種類のクラスと、デバッグなどに利用すると便利なパーミッションクラスを1つ紹介します。いずれも直接的、または間接的にjava.security.Permissionクラスを拡張して作られていますが、その機能(設定方法)は単純なものと複雑なものとで大きな差があります。ここでは単純なものから紹介してきましょう。

●RuntimePermission
 ランタイムというリソースに関するアクセス権をコントロールします。たとえば仮想マシンの停止、クラスローダーの操作、セキュリティマネージャの操作などがこれに含まれます。この記事の冒頭に書いたSystem.exit(0)の例なども、阻止するにはこのパーミッションを与えないようにすればいいわけです。
 RuntimePermissionにはアクションがありませんので、ターゲット名だけを記述します。利用できる主なターゲット名を表1にまとめます。たとえば、


RuntimePermission "exitVM";

と記述すれば、そのコードはSystem.exit(0)を利用して終了できるようになります。
 なお、ターゲットを複数記述する際はカンマで区切って列挙します。


RuntimePermission
"createSecurityManager,
setSecurityManager";

 これは、もう1つのパーミッションエントリを作って並べても同じ意味になります。


RuntimePermission
   "createSecurityManager";
RuntimePermission "setSecurityManager";

 ターゲット名としてアスタリスク(*)を指定すると、全ターゲットを指定したことになります。

表1 RuntimePermissionの主なターゲット

ターゲット名 許可される機能
createClassLoader クラスローダーの作成
getClassLoader クラスローダーの取得
setContextClassLoader スレッドが使うコンテキストクラスローダーの設定
setSecurityManager セキュリティマネージャの設定
createSecurityManager 新しいセキュリティマネージャの作成
exitVM Java仮想マシンの停止
shutdownHooks 仮想マシンのシャットダウンフックの登録と解除
setFactory ServerSocketまたはSocketが使うソケットファクトリ、あるいはURLが使うストリームハンドラファクトリの設定
setIO System.out、System.in、System.errの設定を許可する
loadLibrary.{library name} 特定のライブラリへの動的リンク
accessClassInPackage.{package name} クラスローダーがセキュリティマネージャのcheckPackageAcesssメソッドを呼び出したときに、クラスローダーのloadClassメソッドを介して、指定されたパッケージへアクセスを許可する
accessDeclaredMembers クラスの宣言されたメンバへのアクセス
queuePrintJob 印刷ジョブ要求の初期化

●BasicPermission
 このクラスは、特別なパーミッションを表現するクラスではありません。RuntimePermissionの説明の最後で「*」は全ターゲットを示すと書きましたが、このワイルドカードを用いた命名規則を担うのがBasicPermissionです。そのための便宜的なクラスです。裏返せば、このクラスを拡張したパーミッションクラスでは、この規約のワイルドカードが使えることを意味しています。
 BasicPermissionでは、ターゲットの記述にワイルドカードを含めることを許します。ただし、ファイルシステムで用いるものと少し異なるので注意してください。単独のアスタリスク(*)、ピリオドのあとにある末尾のアスタリスク(com.example.*)が有効です。
 BasicPermissionはPermissionのサブクラスですが、BasicPermissionを拡張したパーミッションクラスでは、この命名規則が利用できます。

●PropertyPermission
 プロパティに対するアクセス権をコントロールします。プロパティも立派なリソースです。この設定によって挙動が変わりますので、デフォルトではアクセスが制限されます。許可したいものだけを読み取り(read)か書き込み(write)で指定します。
 このクラスもBasicPermissionのサブクラスですので、ワイルドカードが利用できます。たとえば「java.*」などとしてまとめてアクセスを制御できます。


permission java.util.PropertyPermission
"file.encoding", "read";

 プロパティはさまざまな状況で利用されているため、予想もしないような状況で「プロパティにアクセス権がない」という例外メッセージに出くわすことが頻繁にあります(※5)。例外メッセージにプロパティの名前と、アクセスしたい権利の種類(readかwrite)が含まれますので、最初はそれを見ながらポリシーを作っていく必要があると思います。セキュリティ上、できるだけワイルドカードは使わないようにしてください。

※5 デフォルトでは読み取りすらできませんから。

●NetPermission
 ネットワークリソースに関するアクセス権をコントロールします。似たものにSocketPermissionがありますが、その名のとおり、ソケットに関するセキュリティがSocketPermissionで、NetPermissionはそれより上位のものを扱います。表2のターゲット名を指定して利用します。
 BasicPermissionのサブクラスですのでターゲット名にはアスタリスクが利用できます。アクションはありません。

表2 NetPermissionのターゲット

ターゲット名 許可される機能
setDefaultAuthenticator プロキシやHTTPサーバーが認証を求めたときの、認証情報の取得方法の設定
requestPasswordAuthentication システムに登録されたオーセンティケータへの、パスワードの要求
specifyStreamHandler URLを構築するときのストリームハンドラの指定

●SerializablePermission
 直列化可能なオブジェクトに関連するセキュリティのアクセス権をコントロールします。
 直列化(シリアライズ)というのは、あまり意識することはありませんし、意識するときもセキュリティで守るべきリソースであるという認識は少ないかもしれません。しかし、重要なデータ(パスワードなど)を持つオブジェクトをWebサービスなどでやりとりするとき、重要なデータがどのようにしてネットワークを流れるかを考えてみると、その危険性が認識できると思います。
 このクラスもBasicPermissionのサブクラスです。アクションはありません。

表3 SerializablePermissionのターゲット

ターゲット名 許可される機能
enableSubclassImplementation ObjectOutputStreamまたはObjectInputStreamのサブクラスの実装で、各オブジェクトのデフォルトの直列化、直列化復元をオーバーライドする
enableSubstitution 直列化、直列化復元時に、オブジェクトを別のオブジェクトと置き換える

[JAVA Developer特別企画]
Tomcatで試すJava 2 セキュリティ
・Tomcatとプラットフォームセキュリティ
・パーミッションクラス
・Tomcatにおけるポリシー設定例

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店

JAVA Developer10月号表紙 JAVA Developer 10月号

大特集
再入門 J2SE

特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2)
 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ

前のページ | 1 2 3 4 5 6 | 次のページ

[水沢典行,JAVA Developer]