ヘッダーをスキップ
Oracle Database Java開発者ガイド
10gリリース2(10.2)
B19189-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

9 Oracle Database Javaアプリケーションのセキュリティ

セキュリティの範囲は広く、接続に関するネットワーク・セキュリティ、オペレーティング・システム・リソースまたはJava仮想マシン(JVM)定義クラスやユーザー定義クラスのアクセス制御および実行制御などがあります。また、外部ソースからインポートされたJavaアーカイブ(JAR)ファイルのバイトコードの検証も含まれます。次の各項では、Oracle DatabaseのJavaアプリケーションに使用できる様々なセキュリティ・サポートについて説明します。

9.1 ネットワーク接続のセキュリティ

ネットワーク・セキュリティには、認証およびデータの機密保護という2つの主要な側面があります。認証およびデータの機密保護のタイプは、データベースにOracle Netを介して接続するか、またはJava Database Connectivity(JDBC)を介して接続するかによって決定します。次の表で、Oracle NetおよびJDBC接続のセキュリティについて説明します。

接続のセキュリティ 説明
Oracle Net データベースでは、ユーザーによるデータベースへの接続を許可する前に、そのユーザーの認証と認可の両方を要求できます。Oracle Netデータベース接続のセキュリティでは、次の条件を1つ以上満たす必要があります。
  • クライアント検証用のユーザー名とパスワード。各接続要求ごとに、Oracle Netに構成されたユーザー名とパスワードを入力する必要があります。

  • 暗号化、KerberosまたはSecureID用のAdvanced Networking Option。

  • 証明書認証用のSSL。

JDBC JDBC接続に求められるセキュリティは、Oracle Netデータベース接続に求められる制約と同じです。


関連項目:

  • 『Oracle Database Net Services Administrator's Guide』

  • 『Oracle Database Advanced Security管理者ガイド』

  • 『Oracle Database JDBC開発者ガイドおよびリファレンス』


9.2 データベース・コンテンツとOracle JVMセキュリティ

データベースに接続した後も、データベースに格納されたリソースにアクセスするには、適切なJava2セキュリティのパーミッションとデータベース権限が必要になります。次のようなリソースがあります。

これらのリソースは次の方式で保護されます。

リソース・セキュリティ 説明
データベース・リソース・セキュリティ データベース・リソースに対する認可では、リソースに対してデータベース権限(Java2セキュリティのパーミッションとは異なります)を付与する必要があります。たとえば、データベース・リソースには表、クラスおよびPL/SQLパッケージが含まれます。

すべてのユーザー定義クラスは、他のスキーマのユーザーから保護されます。loadjavaコマンドのオプションを使用して、他のユーザーまたはスキーマに対して実行権限を付与できます。

JVMセキュリティ Oracle JVMでは、オペレーティング・システム・リソースを保護するためにPermissionオブジェクトを使用するJava2セキュリティが使用されます。Java2セキュリティは、起動時に自動的にインストールされ、すべてのオペレーティング・システム・リソースとOracle JVMクラスをJAVA_ADMIN以外のすべてのユーザーから保護します。JAVA_ADMINユーザーは他のユーザーに、これらのクラスにアクセスするパーミッションを付与できます。

この項の内容は、次のとおりです。


関連項目:


9.2.1 Java2セキュリティ

各ユーザーまたはスキーマには、ソケット、ファイルおよびシステム・プロパティなどのオペレーティング・システム・リソースにアクセスするための適切なパーミッションを割り当てる必要があります。

Java2セキュリティは、Javaアプリケーションに柔軟で構成可能なセキュリティを提供します。Java2セキュリティでは、ロードされた各オブジェクトについてスキーマまたはロールに付与するパーミッションを正確に定義できます。Oracle8i リリース8.1.5では、次の保護ロールを使用できます。

  • JAVAUSERPRIV

    プロパティの検査を含むいくつかのパーミッション

  • JAVASYSPRIV

    Oracle JVMの保護パッケージの更新を含む主要なパーミッション


注意:

このリリースでは下位互換性を維持するために前述の2つのロールが残されています。しかし、これらは使用せずに、各パーミッションを明示的に指定することをお薦めします。

Oracle JVMセキュリティはJava2セキュリティに基づいているため、クラスに対するパーミッションはクラス単位で割り当てます。これらのパーミッションは、データベース管理ツールを使用して割り当てられます。各パーミッションは、Permissionオブジェクトにカプセル化され、Permission表に格納されます。 Permissionには、String値を取る、target属性とaction属性が含まれます。

Java2セキュリティはデータベースを対象に作成されていません。Java2セキュリティ・モデルをデータベース内で適用すると、いくつかの相違が明らかになります。たとえば、Java2セキュリティでは、すべてのアプレットは暗黙的に信頼がおけないと定義され、CLASSPATH内のクラスはすべて信頼できると定義されます。Oracle Databaseでは、すべてのクラスがセキュアなデータベースにロードされます。このため、信頼できるクラスとして処理されません。

次の表で、Sun社のJava2セキュリティとOracle Databaseのセキュリティ実装の違いを説明します。

Java2セキュリティ標準 Oracle Databaseのセキュリティ実装
CLASSPATHに格納されたJavaクラスは信頼できます。 Javaクラスはすべてデータベース内にロードされます。複数のクラスは、付与されたパーミッションに基づいて、クラスごとに信頼されます。
javaコマンドの-usepolicyフラグを使用してポリシーを指定できます。 ポリシーはPolicyTableに指定する必要があります。
独自にSecurityManagerを作成するか、またはLauncherを使用できます。 独自にSecurityManagerを作成できます。ただし、Oracle DatabaseのSecurityManagerのみを使用するか、またはそれを拡張することをお薦めします。動作を変更する場合は、SecurityManagerを定義しないでください。かわりに、oracle.aurora.rdbms. SecurityManagerImplを拡張して特定のメソッドをオーバーライドしてください。
SecurityManagerはデフォルトでは初期化されません。SecurityManagerは手動で初期化する必要があります。 Oracle JVMは、起動時に常にSecurityManagerを初期化します。
パーミッションは、アプリケーションまたはアプレットのロード先(URL)またはキーコード(符号付きコード)によって決まります。 パーミッションは、クラスのロード先のスキーマによって決まります。Oracle Databaseは、符号付きコードをサポートしていません。
セキュリティ・ポリシーはファイルに定義されます。 PolicyTable定義はセキュアなデータベース表に保持されます。
セキュリティ・ポリシー・ファイルは、適切なパーミッションがある場合、テキスト・エディタまたはツールを使用して更新できます。 PolicyTableは、DBMS_JAVAプロシージャを使用して更新できます。初期化後、JAVA_ADMINのみがPolicyTableを変更するパーミッションを保持します。他のユーザーにパーミッションを付与できるように、JAVA_ADMINからPolicyTableを変更する権限を付与される必要があります。
パーミッションは保護ドメインに割り当てられます。クラスはこの保護ドメインに属すことができます。 同じスキーマ内のすべてのクラスは同じ保護ドメイン内に存在します。
コードの識別には、CodeSourceクラスを使用できます。
  • URLと証明書が等しい場合、equals()メソッドはtrueを戻します。

  • 最初のCodeSourceが特定のCodeSourceオブジェクトを含む汎用表記の場合、implies()メソッドはtrueを戻します。

スキーマの識別には、CodeSourceクラスを使用できます。
  • スキーマが同じ場合、equals()メソッドはtrueを戻します。

  • スキーマが同じ場合、implies()メソッドはtrueを戻します。

正(grant)のパーミッションのみサポートします。 正(grant)および制限(restrict)の両方のパーミッションをサポートします。

9.2.2 パーミッションの設定

Java2セキュリティと同様に、Oracle Databaseはセキュリティ・クラスをサポートしています。 通常は、ツールを使用するか、またはセキュリティ・ポリシー・ファイルを編集して、コードベースにパーミッションを設定します。Oracle Databaseでは、DBMS_JAVAプロシージャを使用してパーミッションを動的に設定します。これらのプロシージャは、データベースのポリシー表を変更します。

ポリシー表を表示するために、USER_JAVA_POLICYDBA_JAVA_POLICYの2つのビューが用意されています。いずれのビューにも、付与されているパーミッションと制限パーミッションに関する情報が含まれています。DBA_JAVA_POLICYビューにはポリシー表内のすべての行が表示されます。USER_JAVA_POLICYビューには現行ユーザーに関連するパーミッションのみが表示されます。次に、各ビューに表示される行について説明します。

表の列 説明
Kind(種類) GRANTまたはRESTRICT。このパーミッションが正または制限のどちらであるかが表示されます。
Grantee(権限受領者) Permissionオブジェクトが割り当てられたユーザー、スキーマまたはロールの名前。
Permission_schema(パーミッションのスキーマ) Permissionオブジェクトのロード先スキーマ。
Permission_type(パーミッション・タイプ) java.io.FilePermissionなど、完全なクラス名を含む文字列によって指定されたPermissionクラス・タイプ。
Permission_name(パーミッション名) Permissionオブジェクトのtarget属性。パーミッションを定義するときにこの名前を使用します。PolicyTablePermissionタイプのPermissionオブジェクトのターゲットを定義すると、名前が複雑になる場合があります。

関連項目: 「ポリシー表を更新するための管理パーミッションの取得」

Permission_action(パーミッションのアクション) Permissionオブジェクトのaction属性。多くのパーミッションでは、そのパーミッションに対して適切なアクションがない場合、NULL値と想定されます。
Status(状態) ACTIVEまたはINACTIVEPermissionオブジェクトの行を作成した後は、その行を使用禁止にしたり、再び使用可能にできます。この列には、パーミッションが使用可能または使用禁止のどちらであるかが表示されます。
Key(キー) この行を識別するために使用する順序番号。パーミッションを使用禁止、使用可能または削除するときにこの番号を指定します。

パーミッションを設定するには、次の2つの方法があります。


注意:

完全なセキュリティ設定を確保するには、ファイングレイン定義を実装してください。一般的な定義の方が実装は簡単ですが、必要なレベルのセキュリティ設定を得られない場合があります。

9.2.2.1 各パーミッションのファイングレイン定義

ファイングレイン定義を使用して、特定のユーザーまたはロールに対してパーミッションを個別に付与できます。アクセスするためのパーミッションを付与しないと、そのスキーマでのアクセスは拒否されます。ポリシー表に個別にパーミッションを設定するには、次の情報を指定する必要があります。

パラメータ 説明
Grantee(権限受領者) 権限を適用するユーザー、スキーマまたはロールの名前。PUBLICに指定すると、その行がすべてのユーザーに適用されます。
Permission type(パーミッション・タイプ) パーミッションの付与対象となるPermissionクラス。たとえば、あるファイルへのアクセスを定義する場合、パーミッション・タイプはFilePermissionになります。このパラメータには、java.lang.security.Permissionを拡張するクラスの完全修飾名を指定します。クラスがSYSに入っていない場合は、クラス名に接頭辞schema:を付ける必要があります。たとえば、mySchema:myPackage.MyPermissionは、ユーザー生成のパーミッションの有効な名前です。
Permission name(パーミッション名) Permissionクラスによって定義されたターゲット属性の意味。適切なPermissionクラスで関連する名前を調べてください。
Permission action(パーミッションのアクション) 指定できるアクションのタイプ。パーミッション・タイプによって異なります。たとえば、FilePermissionには、読取りまたは書込みのアクションを指定できます。
Key(キー) パーミッションを付与または制限すると戻される番号で、enable、disableまたはdeleteの各メソッドに使用します。

パーミッションは、SQLまたはJavaのいずれかを使用して付与できます。いずれの場合もパーミッション表内の行を識別する行キー識別子が戻されます。DBMS_JAVAのJavaバージョンでは、各メソッドによって、行キー識別子が戻りパラメータまたはパラメータ・リストのOUT変数として戻されます。PL/SQLのDBMS_JAVAパッケージでは、行キーはkey OUTパラメータを定義するプロシージャでのみ戻されます。このキーを使用して、特定のパーミッションを使用可能または使用禁止にします。

権限付与を実行した後、該当のパーミッション用に行がすでに存在している場合、更新は発生しませんが、その行のキーが戻されます。行が使用禁止になっている場合は、権限付与を実行すると既存の行が使用可能になります。


注意:

FilePermissionを付与する場合は、/private/oracleのように、ディレクトリまたはファイルの物理的な名前を指定する必要があります。$ORACLE_HOMEなどの環境変数、またはシンボリック・リンクは指定できません。ディレクトリ内のすべてのファイルを示すには、次のように「*」記号を指定します。
/private/oracle/*

ディレクトリ内のすべてのディレクトリとファイルを示すには、次のように「-」記号を指定します。

/private/oracle/-


DBMS_JAVAパッケージを使用してパーミッションを付与するには、次のように記述します。

procedure grant_permission ( grantee varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2 )

procedure grant_permission ( grantee varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2, key OUT number)

Javaを使用してパーミッションを付与するには、次のように記述します。

long oracle.aurora.rdbms.security.PolicyTableManager.grant ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name, java.lang.String permission_action);

void oracle.aurora.rdbms.security.PolicyTableManager.grant ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name, java.lang.String permission_action, long[] key);

DBMS_JAVAパッケージを使用してパーミッションを制限するには、次のように記述します。

procedure restrict_permission ( grantee varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2)

procedure restrict_permission ( grantee varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2, key OUT number)

Javaを使用してパーミッションを制限するには、次のように記述します。

long oracle.aurora.rdbms.security.PolicyTableManager.restrict ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name, java.lang.String permission_action);

void oracle.aurora.rdbms.security.PolicyTableManager.restrict ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name, java.lang.String permission_action, long[] key);

例9-1に、grant_permission()メソッドを使用してパーミッションを付与する方法を示します。例9-2に、restrict()メソッドを使用してパーミッションを制限する方法を示します。

例9-1 パーミッションの付与

ポリシー表を変更するための適切なパーミッションがあることを前提とすると、DBMS_JAVAパッケージ内にあるgrant_permission()メソッドを使用してPolicyTableを変更し、指定ファイルへのユーザー・アクセスを許可できます。この例のユーザーLarryには、PolicyTableを変更するパーミッションを持っています。SQLパッケージ内で、Larryは、次のように、ユーザーDaveに対してファイルの読取り/書込みのパーミッションを付与できます。

connect larry/larry

REM Grant DAVE permission to read and write the Test1 file.
call dbms_java.grant_permission('DAVE', 'java.io.FilePermission', '/test/Test1',  'read,write');

REM commit the changes to PolicyTable
commit;

例9-2 パーミッションの制限

一般的な規則に対する制限または例外を指定するには、restrict()メソッドを使用できます。一般的な規則とは、ほとんどの場合、パーミッションがtrueの状態(付与されている)の規則を指します。ただし、この規則には例外がある場合があります。この例外に対して、制限パーミッションを指定します。

ディレクトリ全体に対して読取りまたは書込みを禁止する一般的な規則を定義してある場合は、restrict()メソッドを使用してこの規則の一部を制限するように定義できます。たとえば、/tmpディレクトリに格納されている自分のパスワード・ファイルを除いて、このディレクトリ内のすべてのファイルへのアクセスを許可するには、/tmpディレクトリ内のすべてのファイルに対する読取り/書込みのパーミッションを付与した後、パスワード・ファイルに対する読取り/書込みアクセスを制限します。

制限に対する例外を指定する場合は、明示的な権限付与パーミッションを作成して制限パーミッションをオーバーライドする必要があります。前述の例では、ファイルの所有者がパスワードファイルを変更できるようにするには、1人のユーザーに対して、アクセスを許可するためのさらに明示的なパーミッションを付与することによって、制限をオーバーライドできます。Oracle JVMセキュリティではすべての規則を考慮して、パスワード・ファイルへのアクセス権を持つユーザーを判断します。次の図にこれを示します。

/tmpディレクトリのファイル
画像の説明

明示的な規則は次のとおりです。

制限パーミッションに暗黙的な要求が含まれている場合に、付与パーミッションを有効にするには、その制限パーミッションにも暗黙的な付与が含まれている必要があります。

次に、この例を実装するコードを示します。

connect larry/larry

REM Grant permission to all users (PUBLIC) to be able to read and write
REM all files in /tmp.
call dbms_java.grant_permission('PUBLIC', 'java.io.FilePermission', '/tmp/*', 'read,write');

REM Limit permission to all users (PUBLIC) from reading or writing the
REM password file in /tmp.
call dbms_java.restrict_permission('PUBLIC', 'java.io.FilePermission', '/tmp/password', 'read,write');

REM By providing a more specific rule that overrides the limitation,
REM Larry can read and write /tmp/password.
call dbms_java.grant_permission('LARRY', 'java.io.FilePermission', '/tmp/password', 'read,write');

commit;

このコードでは、次の処理が実行されます。

  1. すべてのユーザーに、/tmp内のすべてのファイルに対する読取り/書込みのパーミッションを付与します。

  2. すべてのユーザーについて、/tmp内のpasswordファイルに対する読取り/書込みを制限します。

  3. Larrypasswordファイルに対する読取り/書込みの明示的なパーミッションを付与します。

ポリシー表を更新するための管理パーミッションの取得

すべてのパーミッションはPolicyTable内の行です。ポリシー表はデータベース内の表であるため、変更には適切なパーミッションが必要です。特に、PolicyTablePermissionオブジェクトは表を変更するために必要です。Oracle JVMを初期化した時点では、PolicyTablePermissionを付与されたJAVA_ADMINロールのみがPolicyTableを変更できます。データベース管理者(DBA)にはただちにJAVA_ADMINロールが割り当てられます。したがって、DBAグループに割り当てられているユーザーは、JAVA_ADMINの全パーミッションを自動的に取得できます。

この表にパーミッションを行として追加する必要がある場合は、JAVA_ADMINによって、PolicyTablePermissionを使用してスキーマに更新権限が付与されている必要があります。このパーミッションは、スキーマが表に行を追加できるように定義します。各PolicyTablePermissionは、特定のパーミッション・タイプに対応しています。たとえば、あるファイルへのアクセスを制御するパーミッションを追加するには、FilePermissionに対するパーミッションを付与または制限できるPolicyTablePermissionが必要です。一度これを実行すると、FilePermissionに対する管理パーミッションを持つことができます。

管理者は、他のパーミッションと同様の方法でPolicyTablePermissionを付与または制限できますが、構文は複雑になります。使いやすくするため、grant_policy_permission()またはgrantPolicyPermission()メソッドを使用して、管理パーミッションを付与できます。

DBMS_JAVAを使用してポリシー表の管理パーミッションを付与するには、次のように記述します。

procedure grant_policy_permission ( grantee varchar2, permission_schema varchar2,
permission_type varchar2, permission_name varchar2 )

procedure grant_policy_permission ( grantee varchar2, permission_schema varchar2,
permission_type varchar2, permission_name varchar2, key OUT number )

Javaを使用してポリシー表の管理パーミッションを付与するには、次のように記述します。

long oracle.aurora.rdbms.security.PolicyTableManager.grantPolicyPermission ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name);

void oracle.aurora.rdbms.security.PolicyTableManager.grantPolicyPermission ( java.lang.String grantee, java.lang.String permission_type, java.lang.String permission_name, long[] key);

パラメータ 説明
Grantee(権限受領者) 権限を適用するユーザー、スキーマまたはロールの名前。PUBLICに指定すると、その行がすべてのユーザーに適用されます。
Permission_schema(パーミッションのスキーマ) Permissionクラスのロード先のスキーマ。
Permission_type(パーミッション・タイプ) パーミッションの付与対象となるPermissionクラス。たとえば、あるファイルへのアクセスを定義する場合、パーミッション・タイプはFilePermissionになります。このパラメータには、java.lang.security.Permissionを拡張するクラスの完全修飾名を指定します。クラスがSYSに入っていない場合は、クラス名に接頭辞schema:を付ける必要があります。たとえば、mySchema:myPackage.MyPermissionは、ユーザー生成のパーミッションの有効な名前です。
Permission_name(パーミッション名) Permissionクラスによって定義されたtarget属性の意味。適切なPermissionクラスで関連する名前を調べてください。
Row_ number(行番号) パーミッションを付与または制限すると戻される番号で、enable、disableまたはdeleteの各メソッドに使用します。


注意:

ポリシー表のPolicyTablePermission行の名前には、#で区切られたパーミッション・タイプとパーミッション名の両方が含まれています。たとえば、ファイルを読み込むための管理権限をユーザーに付与する場合は、この行の名前にjava.io.FilePermission#readを含めます。Permissionクラスとパーミッション名は#で区切ります。

例9-3に、PolicyTableの変更方法を示します。

例9-3 PolicyTableパーミッションの付与

この例では、JAVA_ADMINロールが割り当てられているSYSが、Larryに、FilePermissionについてPolicyTableを更新するパーミッションを付与します。このパーミッションが付与されると、Larryは他のユーザーにファイルの読取り、書込みおよび削除のパーミッションを付与できます。

REM Connect as SYS, which is assigned JAVA_ADMIN role, to give Larry permission
REM to modify the PolicyTable
connect SYS/SYS as SYSDBA

REM SYS grants Larry the right to administer permissions for
REM FilePermission
call dbms_java.grant_policy_permission('LARRY', 'SYS', 'java.io.FilePermission', '*');

パーミッションの作成

独自のパーミッション・タイプを作成する手順は、次のとおりです。

  1. ユーザーのパーミッションの作成とロード

    java.security.Permissionクラスを拡張して独自のパーミッションを作成します。ユーザーが定義するパーミッションはすべて、Permissionを拡張したパーミッションである必要があります。次の例では、MyPermissionを作成します。これは、BasicPermissionPermissionを拡張するパーミッション)を拡張するパーミッションです。

    package test.larry;
    import java.security.Permission;
    import java.security.BasicPermission;
    
    public class MyPermission extends BasicPermission
    {
    
      public MyPermission(String name)
      {
        super(name);
      }
    
      public boolean implies(Permission p)
      {
        boolean result = super.implies(p);
        return result;
      }
    }
    
    
  2. 指定したユーザーへの管理とアクションのパーミッションの付与

    パーミッションを作成すると、作成者がそのパーミッションの所有者になります。所有者には、暗黙的に管理パーミッションが付与されます。つまり、所有者はこのパーミッションの管理者になり、grant_policy_permission()を実行できます。管理パーミッションを付与されたユーザーは、ユーザー定義のパーミッションについてポリシー表を更新できます。

    たとえば、LARRYMyPermissionというパーミッションを作成した場合は、本人のみが自分または他のユーザーのためにgrant_policy_permission()をコールできます。このメソッドは、MyPermissionに対する権限を付与できるユーザーについて、PolicyTableを更新します。次のコードでその方法を示します。

    REM Since Larry is the user that owns MyPermission, Larry connects to
    REW the database to assign permissions for MyPermission.
    connect larry/larry
    
    REM As the owner of MyPermission, Larry grants himself the right to
    REM administer permissions for test.larry.MyPermission within the JVM
    REM security PolicyTable. Only the owner of the user-defined permission
    REM can grant administrative rights.
    call dbms_java.grant_policy_permission ('LARRY', 'LARRY', 'test.larry.MyPermission', '*');
    
    REM commit the changes to PolicyTable
    commit;
    
    

    管理権限を付与された後は、作成したパーミッションに対してアクションのパーミッションを付与できます。たとえば、次のSQL文は、LARRYMyPermission内のすべてのアクションを実行するパーミッションを付与し、DAVEには「act.」で始まるアクションのみを実行するパーミッションを付与します。

    REM Since Larry is the user that creates MyPermission, Larry connects to
    REW the database to assign permissions for MyPermission.
    connect larry/larry
    
    REM Once able to modify PolicyTable for MyPermission, Larry grants himself
    REM full permission for MyPermission. Notice that the Permission is prepended
    REM with its owner schema.
    call dbms_java.grant_permission( 'LARRY', 'LARRY:test.larry.MyPermission', '*', null);
    
    REM Larry grants Dave permission to do any actions that start with 'act.*'.
    call dbms_java.grant_permission
     ('DAVE', 'LARRY:test.larry.MyPermission', 'act.*', null);
    
    REM commit the changes to PolicyTable
    commit;
    
    
  3. パーミッションを使用したセキュリティ・チェックの実装

    MyPermissionに対してパーミッションを作成、ロードおよび割り当てた後は、パーミッションをチェックするためにSecurityManagerのコールを実装する必要があります。次の例には、sensitive()act()print()およびhello()の4つのメソッドがあります。前述の手順のSQLを使用してパーミッションが付与されているため、この例のクラスでは次のユーザーがメソッドを実行できます。

    • LARRYはすべてのメソッドを実行できます。

    • DAVEには、act()メソッドのみを実行するパーミッションが付与されています。

    • print()メソッドとhello()メソッドはすべてのユーザーが実行できます。print()メソッドはパーミッションをチェックしません。そのため、このメソッドはすべてのユーザーが実行できます。hello()メソッドはAccessController.doPrivileged()を実行します。つまり、このメソッドはLARRYに割り当てられたパーミッションを使用して実行します。これは定義者権限と呼ばれます。

    package test.larry;
    import java.security.AccessController;
    import java.security.Permission;
    import java.security.PrivilegedAction;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    /**
    * MyActions is a class with a variety of public methods that
    * have some security risks associated with them. We will rely
    * on the Java security mechanisms to ensure that they are
    * performed only by code that is authorized to do so.
    */
    
    public class Larry {
    
      private static String secret = "Larry's secret";
      MyPermission sensitivePermission = new MyPermission("sensitive");
    
    /**
    * This is a security sensitive operation. That is it can
    * compromise our security if it is executed by a "bad guy".
    * Only larry has permission to execute sensitive.
    */
      public void sensitive()
      {
        checkPermission(sensitivePermission);
        print();
      }
    
    /**
    * Will print a message from Larry. We need to be
    * careful about who is allowed to do this
    * because messages from Larry may have extra impact.
    * Both larry and dave have permission to execute act.
    */
      public void act(String message)
      {
        MyPermission p = new MyPermission("act." + message);
        checkPermission(p);
        System.out.println("Larry says: " + message);
      }
    
    /**
    * Print our secret key
    * No permission check is made; anyone can execute print.
    */
      private void print()
      {
        System.out.println(secret);
      }
    
    /**
    * Print "Hello"
    * This method invokes doPrivileged, which makes the method run
    * under definer's rights. So, this method runs under Larry's
    * rights, so anyone can execute hello. Only Larry can execute hello
    */
      public void hello()
      {
        AccessController.doPrivileged(new PrivilegedAction() {
          public Object run() { act("hello"); return null; }
        });
      }
    
    /**
    * If a security manager is installed ask it to check permission
    * otherwise use the AccessController directly
    */
      void checkPermission(Permission permission)
      {
        SecurityManager sm = System.getSecurityManager();
        sm.checkPermission(permission);
      }
    }
    
    

パーミッションの使用可能または使用禁止

パーミッションを定義する行を作成した場合は、その行が適用されないように使用禁止にできます。ただし、行アクションを再度実行する場合には、その行を使用可能にできます。不要になった行は表から削除できます。行を削除するには、最初にその行を使用禁止にする必要があります。行を使用禁止にしないと、削除できません。

行を使用禁止にするには、次のいずれかのメソッドを使用できます。

  • revoke_permission()

    このメソッドには、grant()メソッドおよびrestrict()メソッドと同じパラメータを指定します。このメソッドは、指定されたパラメータと一致するすべての行をポリシー表で検索します。

  • disable_permission()

    このメソッドは、ポリシー表の1行のみを使用禁止にします。そのためには、パラメータとしてこのメソッドにポリシー表のキーを指定します。このキーは、パーミッションを使用可能にしたり、削除する場合にも必要になります。パーミッションのキー番号を取り出すには、次のいずれかを実行します。

    • パーミッションの付与コールまたは制限コールで戻されたキーを保存します。そのパーミッションを使用可能または使用禁止にする必要がないと判断した場合は、パーミッション番号を戻さない付与コールまたは制限コールを使用できます。

    • DBA_JAVA_POLICYまたはUSER_JAVA_POLICYを参照して、適切なパーミッションのキー番号を調べます。

DBMS_JAVAを使用してパーミッションを使用禁止にするには、次のように記述します。

procedure revoke_permission (permission_schema varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2)

procedure disable_permission (key number)

Javaを使用してパーミッションを使用禁止にするには、次のように記述します。

void revoke (String schema, String type, String name, String action);

void oracle.aurora.rdbms.security.PolicyTableManager.disable (long number);

DBMS_JAVAを使用してパーミッションを使用可能にするには、次のように記述します。

procedure enable_permission (key number)

Javaを使用してパーミッションを使用可能にするには、次のように記述します。

void oracle.aurora.rdbms.security.PolicyTableManager.enable (long number);

DBMS_JAVAを使用してパーミッションを削除するには、次のように記述します。

procedure delete_permission (key number)

Javaを使用してパーミッションを削除するには、次のように記述します。

void oracle.aurora.rdbms.security.PolicyTableManager.delete (long number);

パーミッション・タイプ

表9-1は、インストールされているパーミッション・タイプの一覧です。パーミッションを付与または制限する場合は、パーミッション・タイプを指定する必要があります。アクセス制御に使用できるパーミッション・タイプは次のとおりです。

  • Java2パーミッション・タイプ

  • Oracle固有のパーミッション・タイプ

  • java.security.Permissionを拡張するユーザー定義のパーミッション・タイプ

表9-1 事前定義のパーミッション

タイプ パーミッション
Java2
  • java.util.PropertyPermission
  • java.io.SerializablePermission

  • java.io.FilePermission

  • java.net.NetPermission

  • java.net.SocketPermission

  • java.lang.RuntimePermission

  • java.lang.reflect.ReflectPermission

  • java.security.SecurityPermission

Oracle固有
  • oracle.aurora.rdbms.security.PolicyTablePermission
  • oracle.aurora.security.JServerPermission



注意:

SYSには、Oracle Databaseに付属するライブラリをロードするためのパーミッションが付与されています。ただし、データベースにCライブラリをロードすることはセキュアでないため、Oracle JVMでは他のユーザーによるライブラリのロードはサポートされていません。このため、loadLibrary.*に対してRuntimePermissionを付与することは許可されません。

Oracle固有のパーミッションについて説明します。

  • oracle.aurora.rdbms.security.PolicyTablePermission

    このパーミッションは、ポリシー表を更新できるユーザーを制御します。特定のパーミッション・タイプについてポリシー表を更新する権限を付与されたユーザーは、一部のリソースへのアクセスを制御できます。

    Oracle JVMを初期化した時点では、JAVA_ADMINロールのみがPolicyTablePermissionを使用してポリシー表の管理権限を付与できます。JAVA_ADMINからこの権限を付与されたユーザーは、自分の付与パーミッションおよび制限パーミッションを使用してポリシー表を更新できます。

    ポリシー表の更新権限を付与する場合は、DBMS_JAVAパッケージのgrant_policy_permission()メソッドを使用できます。表を更新した後は、DBA_JAVA_POLICYまたはUSER_JAVA_POLICYビューのいずれかを表示して、パーミッションを付与したユーザーを参照できます。

  • oracle.aurora.security.JServerPermission

    このパーミッションを使用して、Oracle JVMリソースへのアクセス権を付与および制限します。JServerPermissionは、BasicPermissionを拡張するパーミッションです。次の表は、JServerPermissionによってアクセス権を付与するパーミッション名を示します。

    パーミッション名 説明
    LoadClassInPackage.package_name 指定されたパッケージにクラスをロードするパーミッションを付与します。
    Verifier バイトコード検証機能をオンまたはオフに切り替えるパーミッションを付与します。
    Debug デバッガをセッションに接続するパーミッションを付与します。
    JRIExtensions MEMSTATを使用するパーミッションを付与します。
    Memory.Call コール設定時にoracle.aurora.vm.OracleRuntimeの特定のメソッドをコールする権限を付与します。
    Memory.Stack スタック設定時にoracle.aurora.vm.OracleRuntimeの特定のメソッドをコールする権限を付与します。
    Memory.SGAIntern SGA設定時にoracle.aurora.vm.OracleRuntimeの特定のメソッドをコールする権限を付与します。
    Memory.GC ガベージ・コレクタ設定時にoracle.aurora.vm.OracleRuntimeの特定のメソッドをコールする権限を付与します。

初期のパーミッションの付与

Oracle JVMを最初に初期化すると、特定のパーミッションを付与された複数のロールが移入されます。次の表は、それらのロールとその初期のパーミッションを示します。

JAVA_ADMINロールには、すべてのパーミッションについてポリシー表を変更するためのアクセス権が付与されます。SYSを含むすべてのDBAにはJAVA_ADMINが付与されます。表9-1にリストされているパーミッションについては、ポリシー表を更新する完全な管理権限が付与されます。SYSには、JAVA_ADMINのパーミッションに加えて、表9-2にリストされているパーミッションも付与されます。全ユーザーには、表9-3で定義されているパーミッションが最初に付与されます。

表9-2 SYSの初期のパーミッション

パーミッション・タイプ パーミッション名 アクション
oracle.aurora.rdbms.security.PolicyTablePermission *
ポリシー表を変更するための管理権限
oracle.aurora.security.JServerPermission *
NULL
java.net.NetPermission *
NULL
java.security.SecurityPermission *
NULL
java.util.PropertyPermission *
書込み
java.lang.reflect.ReflectPermission *
NULL
java.lang.RuntimePermission *
NULL

loadLibrary.xaNative NULL

loadLibrary.corejava NULL

loadLibrary.corejava_d NULL

表9-3 PUBLICのデフォルトのパーミッション

パーミッション・タイプ パーミッション名 アクション
oracle.aurora.rdbms.security. PolicyTablePermission java.lang.RuntimePermission.loadLibrary.* NULL
java.util.PropertyPermission *
読取り

user.language 書込み
java.lang.RuntimePermission _
NULL

exitVM NULL

createSecurityManager NULL

modifyThread NULL

modifyThreadGroup NULL
oracle.aurora.security. JServerPermission loadClassInPackage.*loadClassInPackage.java.*loadClassInPackage.oracle.aurora.*およびloadClassInPackage.jdbc.*を除く) NULL

表9-4 JAVAUSERPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション
java.net.SocketPermission *
接続、解決
java.io.FilePermission <<ALL FILES>> 読取り
java.lang.RuntimePermission modifyThreadGroupstopThreadgetProtectionDomainreadFileDescriptoraccessClassInPackage.*およびdefineClassInPackage.* NULL

表9-5 JAVASYSPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション
java.io.SerializablePermission *
適用できるアクションなし
java.io.FilePermission <<ALL FILES>> 読取り、書込み、実行、削除
java.net.SocketPermission *
アクセプト、接続、リスニング、解決
java.lang.RuntimePermission createClassLoader NULL

getClassLoader NULL

setContextClassLoader NULL

setFactory NULL

setIO NULL

setFileDescriptor NULL

readFileDescriptor NULL

writeFileDescriptor NULL

表9-6 JAVADEBUGPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション
oracle.aurora.security.JServerPermission Debug NULL
java.net.SocketPermission *
接続、解決

9.2.2.2 ロールに割り当てられる一般的なパーミッション定義

Oracle8i リリース8.1.5では、JAVASYSPRIVJAVAUSERPRIVまたはJAVADEBUGPRIVロールをスキーマに付与することによって、Oracle JVMセキュリティが制御されていました。Oracle Database 10gでは、これらのロールはパーミッション・グループとして存在しています。ユーザー独自のパーミッションの組合せを設定および定義できます。パーミッションを定義した後は、任意のユーザーまたはロールに任意のパーミッションの組合せを付与できます。付与されたユーザーには、そのロールに設定されている内容と同じパーミッションが付与されます。さらに、追加のパーミッションが必要な場合は、指定したユーザーまたはロールのいずれかに個別にパーミッションを追加できます。ポリシー表に定義されたパーミッションには累積の効果があります。


注意:

PropertyPermissionの書込みアクションを使用して付与したプロパティへの書込み権限は、現行バージョンでは全ユーザーに付与されません。かわりに、JAVA_ADMINからこのパーミッションを付与するか、またはJAVASYSPRIVロールを付与することによって、このパーミッションを取得する必要があります。

次の例では、LarryとDaveに次のパーミッションが付与されます。

  • LarryにはJAVASYSPRIVパーミッションが付与されます。

  • Daveには、JAVADEBUGPRIVパーミッション、およびシステム上の全ファイルへの読取りと書込みのパーミッションが付与されます。

REM Granting Larry the same permissions as those existing within JAVASYSPRIV
grant javasyspriv to larry;

REM Granting Dave the ability to debug
grant javadebugpriv to dave;

commit;

REM I also want Dave to be able to read and write all files on the system
call dbms_java.grant_permission('DAVE', 'SYS:java.io.FilePermission',
 '<<ALL FILES>>', 'read,write', null);

9.2.3 デバッグのパーミッション

デバッグ・ロールJAVADEBUGPRIVは、デバッガを実行するパーミッションを付与するために作成されました。このロールに割り当てられるパーミッションの一覧は、表9-6を参照してください。デバッグ・エージェントをコールするパーミッションを取得するには、次のように、コール元にJAVADEBUGPRIVまたはデバッグJServerPermissionが付与されている必要があります。

REM Granting Dave the ability to debug
grant javadebugpriv to dave;

REM Larry grants himself permission to start the debug agent.
call dbms_java.grant_permission(
  'LARRY', 'oracle.aurora.security.JServerPermission', 'Debug', null);

デバッガはサーバー上のコードとデータの両方に広範囲にアクセスできますが、デバッガの使用は開発環境に限定する必要があります。

9.2.4 クラスをロードするためのパーミッション

クラスをロードするには、次のパーミッションが必要です。

JServerPermission("LoadClassInPackage." + class_name)

class_nameには、ロードするクラスの完全修飾名を指定します。

このパーミッションには、システム・パッケージへのロードやシステム・クラスの置換は含まれません。システム・クラスをロードするパーミッションが付与されている場合でも、Oracle Databaseではロードを実行できません。システム・クラスとは、Oracle DatabaseでCREATE JAVA SYSTEM文を使用してインストールされるクラスです。システム・クラスを置換しようとすると、次のエラーがスローされます。

ORA-01031 "Insufficient privileges"

次に、データベースのインストール後、各ユーザーが実行できる処理について説明します。

  • SYSはシステム・クラス以外の全クラスをロードできます。

  • すべてのユーザーは、java.*oracle.aurora.*およびoracle.jdbc.*以外のパターンで始まるクラスを自分のスキーマにロードできます。このようなクラスを別のスキーマにロードする場合は、JServerPermission(LoadClassInPackage.class)のパーミッションを付与する必要があります。

    次の例は、oracle.aurora.*パッケージにクラスをロードするパーミッションをSCOTTに付与する方法を示します。

    dbms_java.grant_permission('SCOTT', 'SYS:oracle.aurora.tools.*', null)
    
    

9.3 データベース認証のメカニズム

次のデータベース認証のメカニズムが使用可能です。