ヘッダーをスキップ
Oracle® Database Java開発者ガイド
12cリリース1 (12.1)
B72466-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

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

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

ネットワーク・セキュリティには、認証およびデータの機密保護という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管理者ガイド』

  • 『Oracle Databaseセキュリティ・ガイド』

  • 『Oracle Database JDBC開発者ガイド』


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

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

  • 表やPL/SQLパッケージなどのデータベース・リソース

  • ファイルやソケットなどのオペレーティング・システム・リソース

  • Oracle JVMクラス

  • ユーザーによってロードされたクラス

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

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

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

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


注意:

  • Oracle JVMは、出荷時の状態では、JDK1.5およびJDK 6に含まれる制限付きの強い暗号化を使用しています。アプリケーションで無制限強度の暗号化を使用するには、適切なバージョン固有のファイルを次のWebサイトからダウンロードし、インストールする必要する必要があります。

    http://www.oracle.com/technetwork/indexes/downloads/index.html

  • 権限の付与または取消しに使用されるOracle JVMクラスは、サーバー上でのみ実行できます。


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

Java 2セキュリティ

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

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

  • JAVAUSERPRIV

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

  • JAVASYSPRIV

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


注意:

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

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

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

次の表で、標準のJava 2セキュリティとOracle Databaseのセキュリティ実装の違いを説明します。

Java 2セキュリティ標準 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)の両方のパーミッションをサポートします。

パーミッションの設定

Java 2セキュリティと同様に、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) ENABLEDおよびDISABLEDPermissionオブジェクトの行を作成した後は、その行を使用禁止にしたり、再び使用可能にできます。この列には、パーミッションが使用可能または使用禁止のどちらであるかが表示されます。
Key(キー) この行を識別するために使用する順序番号。パーミッションを使用禁止、使用可能または削除するときにこの番号を指定します。

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


注意:

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

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

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

パラメータ 説明
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);

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

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

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

connect larry
Enter password: password

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;

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

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

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

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

limitper.gifの説明が続きます
図limitper.gifの説明

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

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

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

connect larry
Enter password: password

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_schema,
 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_schema, 
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クラスとパーミッション名は#で区切ります。

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

例10-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 as SYSDBA
Enter password: password

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を作成します。これは、BasicPermission (Permissionを拡張するパーミッション)を拡張するパーミッションです。

    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
    Enter password: password
    
    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
    Enter password: password
    
    REM Once able to modify PolicyTable for MyPermission, Larry grants himself
    REM full permission for MyPermission. Notice that the Permission is prefixed
    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 display a message from Larry. You must 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);
      }
    
    /**
    * display secret key
    * No permission check is made; anyone can execute print.
    */
      private void print()
      {
        System.out.println(secret);
      }
    
    /**
    * Display "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 (grantee varchar2, permission_type varchar2, permission_name varchar2, permission_action varchar2)

procedure disable_permission (key number)

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

void oracle.aurora.rdbms.security.PolicyTableManager.revoke (java.lang.String grantee, java.lang.String permission_type,
 java.lang.String permission_name, java.lang.String permission_action_type);

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

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

procedure enable_permission (key number)

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

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

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

procedure delete_permission (key number)

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

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

パーミッション・タイプ

パーミッションを付与または制限する場合は、パーミッション・タイプを指定する必要があります。アクセス制御に使用できるパーミッション・タイプは次のとおりです。

  • Java 2の許可タイプ

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

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

表10-1は、インストールされているパーミッション・タイプの一覧です。

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

タイプ パーミッション

Java 2

  • 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を使用してポリシー表の管理権限を付与できます。この権限を付与されると、そのユーザーは、自分の付与パーミッションおよび制限パーミッションを使用してポリシー表を更新できます。

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

  • oracle.aurora.security.JServerPermission

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

    表10-2 JServerPermissionの説明

    Grantee(権限受領者) パーミッション・タイプ パーミッション名 パーミッションの付与または制限 アクション

    JAVADEBUGPRIV

    SYS:oracle.aurora.security.JServerPermission

    Debug

    付与

    NULL

    SYS

    SYS:oracle.aurora.security.JServerPermission

    *


    付与

    NULL

    SYS

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.java.*

    付与

    NULL

    SYS

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.oracle.aurora.*

    付与

    NULL

    SYS

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.oracle.jdbc.*

    付与

    NULL

    PUBLIC

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.*

    付与

    NULL

    PUBLIC

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.java.*

    制限

    NULL

    PUBLIC

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.oracle.aurora.*

    制限

    NULL

    PUBLIC

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.oracle.jdbc.*

    制限

    NULL

    JAVA_DEPLOY

    SYS:oracle.aurora.security.JServerPermission

    LoadClassInPackage.oracle.aurora.deploy.*

    付与

    NULL

    JAVA_DEPLOY

    SYS:oracle.aurora.security.JServerPermission

    Deploy

    付与

    NULL


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

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

JAVA_ADMINロールには、すべてのパーミッションについてポリシー表を変更するためのアクセス権が付与されます。SYSを含むすべてのDBAにはJAVA_ADMINが付与されます。表10-1にリストされているパーミッションについては、ポリシー表を更新する完全な管理権限が付与されます。SYSには、JAVA_ADMINのパーミッションの他に、JDKの標準的な機能およびOracle JVMの詳細をサポートするために必要な追加のパーミッションも付与されます。

表10-3は、SYSに付与される追加のパーミッションの一部です。

表10-3 SYSの初期のパーミッション

パーミッション・タイプ パーミッション名 アクション

oracle.aurora.rdbms.security. PolicyTablePermission

oracle.aurora.rdbms.security.PolicyTablePermission#*

NULL

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


表10-4は、最初にすべてのユーザーに付与または制限されるパーミッションの一覧です。

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

パーミッション・タイプ パーミッション名 パーミッションの付与または制限 アクション

oracle.aurora.rdbms.security. PolicyTablePermission

java.lang.RuntimePermission#loadLibrary.*

制限

NULL

java.util.PropertyPermission

*


付与

読取り


user.language

付与

書込み


oracle.net.tns_admin

付与

書込み

java.lang.RuntimePermission

_


付与

NULL


exitVM

付与

NULL


createSecurityManager

付与

NULL


modifyThread

付与

NULL


modifyThreadGroup

付与

NULL


getenv.ORACLE_HOME

付与

NULL


getenv.TNS_ADMIN

付与

NULL


preferences

付与

NULL


loadLibrary.*

制限

NULL

oracle.aurora.security. JServerPermission

LoadClassInPackage.* (LoadClassInPackage.java.*LoadClassInPackage.oracle.aurora.*およびLoadClassInPackage.oracle.jdbc.*を除く)

付与

NULL


表10-5は、最初にJAVAUSERPRIVロールに付与されるパーミッションの一覧です。

表10-5 JAVAUSERPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション

java.net.SocketPermission

*


接続、解決

java.io.FilePermission

<<ALL FILES>>

読取り

java.lang.RuntimePermission

stopThreadgetProtectionDomainaccessClassInPackage.*およびdefineClassInPackage.*

NULL


表10-6は、最初にJAVASYSPRIVロールに付与されるパーミッションの一覧です。

表10-6 JAVASYSPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション

java.io.SerializablePermission

*


適用できるアクションなし

java.io.FilePermission

<<ALL FILES>>

読取り、書込み、実行、削除

java.net.SocketPermission

*


アクセプト、接続、リスニング、解決

java.sql.SQLPermission

setLog

NULL

java.lang.RuntimePermission

createClassLoader

NULL


getClassLoader

NULL


setContextClassLoader

NULL


setFactory

NULL


setIO

NULL


setFileDescriptor

NULL


readFileDescriptor

NULL


writeFileDescriptor

NULL


表10-7は、最初にJAVADEBUGPRIVロールに付与されるパーミッションの一覧です。

表10-7 JAVADEBUGPRIVのパーミッション

パーミッション・タイプ パーミッション名 アクション

oracle.aurora.security.JServerPermission

Debug

NULL


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

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


注意:

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);

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

デバッグ・ロールJAVADEBUGPRIVは、デバッガを実行するパーミッションを付与するために作成されました。このロールに割り当てられるパーミッションの一覧は、表10-7を参照してください。デバッグ・エージェントをコールするパーミッションを取得するには、次のように、コール元に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);

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

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

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

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.tools.*パッケージにクラスをロードする許可をHRに付与する方法を示します。

    dbms_java.grant_permission('HR','SYS:oracle.aurora.security.JServerPermission','LoadClassInPackage.oracle.aurora.tools.*',null);
    

デフォルトのjava.securityリソースのカスタマイズ

セキュリティ・プロバイダを追加する場合や、デフォルトのjava.securityリソースにリストされているセキュリティ・プロバイダの順序を変更する場合は、代替リソースを作成してデータベースに追加できます。この変更は、リソースのロード後に開始されるすべての新しいOracle JVMセッションに影響を与えます。次の手順を実行して、デフォルトのjava.securityリソースを構成します。

  1. 次のファイルを作成します。

    $ORACLE_HOME/javavm/lib/security/java.security.alt

  2. 次のコマンドを使用して、ファイル$ORACLE_HOME/javavm/lib/security/java.securityの内容を、手順1で作成したファイルにコピーします。

    cp $ORACLE_HOME/javavm/lib/security/java.security $ORACLE_HOME/javavm/lib/security/java.security.alt
    
  3. $ORACLE_HOME/javavm/lib/security/java.security.altファイルを編集し、必要な変更を行います。


    注意:

    サービス・プロバイダまたは定義済デバイスの順序を指定する際に誤りがあると、いくつかの機能が使用できなくなる可能性があります。

  4. 次のコマンドを使用して、java.security.altファイルをロードします。


    注意:

    lib/security/java.security.altファイルをロードするには、SYSとしてログインできる必要があります。

    cd $ORACLE_HOME/javavm
    loadjava -u sys/<sys_pwd> -v -g public lib/security/java.security.alt
    

このセキュリティ設定は、データベースから開始される以降のOracle JVMセッションすべてに影響を与えます。ただし、セキュリティ設定の変更はロード・セッションには有効になりません。


注意:

セキュリティ・パラメータを構成するには、それに関する事前の知識が必要です。間違った設定を行うと、正常に操作できなくなることがあります。


関連項目:

このセキュリティ設定の詳細は、http://docs.oracle.com/javase/7/docs/technotes/guides/security/index.htmlを参照してください。

Create or Replace Java System

Create or Replace Java Systemをjava.security.altで実行して、異なるセットのセキュリティ・パラメータをOJVMに付与します。これを実行する前に、次のようにしてすべてのシステム・セッションを再起動します。

sqlplus / as sysdba
shutdown

sqlplus / as sysdba
startup

次のようにして、Create Java Systemを実行します。

sqlplus / as sysdba
create or replace java system

Linux.X64データベースでは、Create Java Systemは使用できません。この場合は、次のコマンドを使用します。

sqlplus / as sysdba
call rehotload();

セキュリティ設定のリストア

元のセキュリティ設定は、次のいずれかの方法でリストアできます。

  • 次のコマンドを使用します。

    cd $ORACLE_HOME/javavm
    dropjava -u sys/<sys_pwd> -v lib/security/java.security.alt
    
  • 次のコマンドを使用します。

    sqlplus sys/<sys_pwd> as sysdba
    SQL> drop java resource "lib/security/java.security.alt";
    

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

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

  • パスワード認証

  • 厳密認証

  • プロキシ認証

  • シングル・サインオン

Oracle DatabaseでのRuntime.exec機能のセキュアな使用


注意:

この項はDBAおよびセキュリティ管理者を対象としており、Oracle Databaseで実行されているJavaアプリケーションでJava SE機能のRuntime.execをセキュアに使用するためのガイドラインを示します。

java.lang.Runtime.execメソッドはJava SEライブラリにあり、リリース9以降のJava仮想マシン(Java VM)でサポートされており、新しいオペレーティング・システム(OS)プロセスにまたがって、指定されたコマンドおよび引数を新しいプロセスで実行します。SecurityManagerが存在する場合(Java VMがデータベースで実行されている場合は常に存在します)、新しいOSプロセスが開始される前に、関連するパス名に対するファイル実行許可のセキュリティ・チェックが実行されます。DBAまたはセキュリティ管理者は、適切なファイル読取り許可、書込み許可および実行許可を、サーバー側のOSコマンドの実行を認可されているデータベース・ユーザーに選択的に付与する役割を持ちます。さらに、次の各項で説明するように、dbms_java.set_runtime_exec_credentialsプロシージャを使用して、生成されたコマンドのOSユーザー・アイデンティティを制御することを強くお薦めします。

設計上、Runtime.execおよびjava.lang.ProcessBuilderクラスとjava.lang.Processクラスの関連機能は、新しく作成されたプロセスと関連付けられたユーザーのアイデンティティを制御しません。Java VMのデフォルト動作を含むほとんどのJava実装では、分岐プロセスは親プロセスのアイデンティティ(Oracle DatabaseのOracle OSユーザー)を使用して実行されます。セキュリティ上の理由で、Runtime.exec機能により分岐されたプロセスは、弱い権限を付与されたOSアイデンティティを使用して実行することをお薦めします。dbms_java.set_runtime_exec_credentialsプロシージャは、指定されたデータベース・ユーザー/スキーマを特定のOSアカウントにバインドするメカニズムを提供します。DBAは、できるかぎり小さい権限を持つOSアカウントにRuntime.execコールを発行して、データベース・ユーザーをバインドする必要があります。次のコールは、データベース・ユーザー/スキーマDBUSERをOSのosuserアカウントに関連付けます。

dbms_java.set_runtime_exec_credentials('DBUSER', 'osuser', 'ospass');

この結果、DBUSERにより発行されたRuntime.execコマンドを実行するために生成されるOSプロセスは、osuserのアイデンティティを使用して実行されます。set_runtime_exec_credentialsプロシージャを使用するには、SYSユーザーである必要があります。