|
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
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 10月号
大特集
再入門 J2SE
特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2) 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ
|
|