ヘッダーをスキップ
Oracle Database Advanced Security管理者ガイド
11g リリース1(11.1)
E05729-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

5 JDBCシン・クライアントに対するネットワーク認証、暗号化および整合性の構成

この章では、Oracle Advanced SecurityのJava実装について説明します。このJava実装によって、Java Database Connectivity(JDBC)シン・クライアントはOracle Databaseに安全に接続できます。次の項目について説明します。

5.1 Java実装について

Oracle Advanced SecurityのJava実装は、Oracle Advanced Securityが組み込まれたOracle Databaseと通信するJDBCシン・クライアントに対して、ネットワーク認証、暗号化および整合性による保護機能を提供します。

この項では、次の項目について説明します。

5.1.1 Java Database Connectivityのサポート

業界標準のJavaインタフェースであるJava Database Connectivity(JDBC)は、Javaプログラムからリレーショナル・データベースに接続するためのJava標準です。Sun社ではJDBC標準を定義していますが、OracleではJDBC標準をその独自のJDBCドライバに実装または拡張しています。

Oracle JDBCドライバは、JDBCアプリケーションを作成し、Oracle Databaseと通信を行うために使用されます。Oracleには、2つのタイプのJDBCドライバが実装されています。C言語ベースのOracle Netクライアントの最上部に構築されているJDBC Thickドライバと、ダウンロード可能なアプレットをサポートするJDBC Thin(Pure Java)ドライバです。 JDBCに対するOracleの拡張には、次の機能が含まれています。

  • データ・アクセスおよび操作

  • LOBアクセスおよび操作

  • Oracleオブジェクト型マッピング

  • オブジェクト参照アクセスおよび操作

  • 配列アクセスおよび操作

  • アプリケーション・パフォーマンスの機能強化

5.1.2 JDBCシンの保護

JDBC Thinドライバはインターネットで使用されるダウンロード可能なアプレット用に設計する必要があるため、Oracleでは、シン・クライアントを使用するOracle Advanced Securityの認証、暗号化および整合性アルゴリズムがJavaで100%実現されるよう設計しました。Oracle Advanced Securityには、JDBC Thinドライバ用に次の機能が用意されています。

  • 厳密認証

  • データ暗号化

  • データの整合性チェック

  • JDBCシン・クライアントからOracle RDBMSへの接続を保護する

  • 安全な通信チャネルに対してデータを送信するアプレットを開発者が作成できるようにする

  • Java Server Pages(JSP)を持つ中間層のサーバーからOracle RDBMSへの接続を保護する

  • Oracle Database 11g リリース1(11.1)からOracle Advanced Securityがインストールされている旧リリースのOracle Databaseへの接続を保護する

Oracle JDBC Thinドライバでは、Oracle Advanced SecurityのSSL実装およびRADIUSやKerberosなどのサード・パーティ認証方式をサポートしています。 JDBC ThinによるRADIUS、KerberosおよびSSLなどの認証方式のサポートは、Oracle Database 11g リリース1(11.1)から新たに導入されました。

Oracle Advanced SecurityのJava実装では、次の暗号化アルゴリズムのJavaバージョンが提供されます。

  • AES256: AES 256ビット鍵

  • AES192: AES 192ビット鍵

  • AES128: AES 128ビット鍵

  • 3DES168: 3つの鍵を使用する3DES

  • 3DES112: 2つの鍵を使用する3DES

  • DES56C: DES 56ビット鍵のCBC

  • DES40C: DES 40ビット鍵のCBC

  • RC4_256: RC4 256ビット鍵

  • RC4_128: RC4 128ビット鍵

  • RC4_56: RC4 56ビット鍵

  • RC4_40: RC4 40ビット鍵


注意:


前述のアルゴリズム・リストのCBCは、暗号ブロック連鎖モードのことを指しています。

JDBC ThinによるAdvanced Encryption Standard(AES)のサポートは、Oracle Database 11g リリース1(11.1)から新たに導入されました。

また、Secure Hash Algorithm(SHA1)およびMessage Digest 5(MD5)を使用して、JDBC Thinの整合性がチェックされます。JDBC ThinによるSHA1のサポートは、Oracle Database 11g リリース1(11.1)から新たに導入されました。


関連項目:


JDBCシン・クライアントに対する認証、暗号化および整合性の構成の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

5.1.3 実装の概要

サーバー側では、アルゴリズムの折衝および鍵の生成は、Oracle Advanced Security固有の暗号化とまったく同様に機能します。これにより、クライアントとサーバーの下位および上位互換性が維持されています。

クライアント側では、アルゴリズムの折衝および鍵の生成は、CベースのOracle Advanced Securityの暗号化とまったく同じ方法で行われます。 クライアントとサーバーは、従来のOracle Netクライアントと同様の方法で、暗号化アルゴリズムの折衝と乱数の生成を行い、Diffie-Hellmanを使用してセッション鍵を交換し、Oracle Password Protocolを使用します。JDBC Thinには、Oracle Netクライアントがpure Javaで完全に実装されています。

5.1.4 不明瞭化

Javaの暗号化コードは、不明瞭化されています。つまり、暗号化および復号化機能を含んだJavaクラスおよびメソッドは、不明瞭化ソフトウェアを使用して保護されています。

Javaバイト・コードの不明瞭化は、Javaプログラムの形式で作成された知的所有物を保護するために企業がよく使用するプロセスです。このプロセスではコード内のJavaシンボルが混ぜ合せられます。 これにより、元のプログラムの構造は変えずに、その内容を隠すためにクラス、メソッドおよび変数の名前のみを変更して、プログラムが正しく実行されるようにしています。不明瞭化を行っていないJavaコードをデコンパイルして読み取ることは可能ですが、不明瞭化されたJavaコードは、米国政府の輸出規制を満たすためにデコンパイルが困難になっています。

5.2 構成パラメータ

いくつかの構成パラメータを含むプロパティ・クラス・オブジェクトは、Oracle Advanced Securityインタフェースに渡されます。

すべてのJDBC接続プロパティ(Oracle Advanced Securityに関連する接続プロパティを含む)は、oracle.jdbc.OracleConnectionインタフェースの定数として定義されます。次のリストでは、これらの接続プロパティの一部を列挙します。


関連項目:


構成パラメータおよび構成の例の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

5.2.1 クライアント暗号化レベル: CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL

このパラメータは、クライアントがサーバーと折衝するセキュリティのレベルを定義します。表5-1に、このパラメータの属性を示します。

表5-1 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELパラメータの属性

属性 説明

パラメータ・タイプ

String型

パラメータ・クラス

静的

指定できる値

REJECTEDACCEPTEDREQUESTEDREQUIRED

デフォルト値

ACCEPTED

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,level);

この場合、propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,"REQUIRED");

この場合、propPropertiesクラスのオブジェクトです。


5.2.2 クライアントの暗号化選択リスト: CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES

このパラメータは、使用する暗号化アルゴリズムを定義します。表5-2に、このパラメータの属性を示します。

表5-2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESパラメータの属性

属性 説明

パラメータ・タイプ

String型

パラメータ・クラス

静的

指定できる値

AES256(AES 256ビット鍵)、AES192(AES 192ビット鍵)、AES128(AES 128ビット鍵)、3DES168(3つの鍵を使用する3DES)、3DES112(2つの鍵を使用する3DES)、DES56C(DES 56ビット鍵のCBC)、DES40C(DES 40ビット鍵のCBC)、RC4_256(RC4 256ビット鍵)、RC4_128(RC4 128ビット鍵)、RC4_56(RC4 56ビット鍵)、RC4_40(RC4 40ビット鍵)

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,algorithm);

この場合、propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES, "( AES256, AES192 )");

この場合、propPropertiesクラスのオブジェクトです。


5.2.3 クライアント整合性レベル: CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL

このパラメータは、データ整合性のためにクライアントがサーバーと折衝するセキュリティのレベルを定義します。表5-3に、このパラメータの属性を示します。

表5-3 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVELパラメータの属性

属性 説明

パラメータ・タイプ

String型

パラメータ・クラス

静的

指定できる値

REJECTEDACCEPTEDREQUESTEDREQUIRED

デフォルト値

ACCEPTED

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,level);

この場合、propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,"REQUIRED");

この場合、propPropertiesクラスのオブジェクトです。


5.2.4 クライアントの整合性選択リスト: CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES

このパラメータは、使用するデータ整合性アルゴリズムを定義します。表5-4に、このパラメータの属性を示します。

表5-4 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESパラメータの属性

属性 説明

パラメータ・タイプ

String型

パラメータ・クラス

静的

指定できる値

MD5SHA1

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES, algorithm);

この場合、propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES,"( MD5, SHA1 )");

この場合、propPropertiesクラスのオブジェクトです。


5.2.5 クライアント認証サービス: CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES

このパラメータによって、使用する認証サービスが決定します。表5-5に、このパラメータの属性を示します。

表5-5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESパラメータの属性

属性 説明

パラメータ・タイプ

String型

パラメータ・クラス

静的

指定できる値

RADIUS、KERBEROS、SSL

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES,authentication);

この場合、propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES,"( RADIUS, KERBEROS, SSL)");

この場合、propPropertiesクラスのオブジェクトです。


5.2.6 AnoServices定数

このリリースでは、JDBC Thinドライバがサポートする暗号化、認証およびチェックサムのすべてのアルゴリズムの名前を含めるように、oracle.net.ano.AnoServicesインタフェースが更新されています。次の定数が、oracle.net.ano.AnoServicesインタフェースに追加されています。

// ---- SUPPORTED ENCRYPTION ALG -----
public static final String ENCRYPTION_RC4_40 = "RC4_40";
public static final String ENCRYPTION_RC4_56 = "RC4_56";
public static final String ENCRYPTION_RC4_128 = "RC4_128";
public static final String ENCRYPTION_RC4_256 = "RC4_256";
public static final String ENCRYPTION_DES40C = "DES40C";
public static final String ENCRYPTION_DES56C = "DES56C";
public static final String ENCRYPTION_3DES112 = "3DES112";
public static final String ENCRYPTION_3DES168 = "3DES168";
public static final String ENCRYPTION_AES128 = "AES128";
public static final String ENCRYPTION_AES192 = "AES192";
public static final String ENCRYPTION_AES256 = "AES256";
// ---- SUPPORTED INTEGRITY ALG ----
public static final String CHECKSUM_MD5 = "MD5";
public static final String CHECKSUM_SHA1 = "SHA1";
// ---- SUPPORTED AUTHENTICATION ADAPTORS ----
public static final String AUTHENTICATION_RADIUS = "RADIUS";
public static final String AUTHENTICATION_KERBEROS = "KERBEROS";

これらの定数を使用して、暗号化、整合性および認証の各パラメータを設定できます。例5-1に、その一例を示します。

例5-1 JDBCクライアント・コード内でのAnoServices定数の使用

import java.sql.*;
import java.util.Properties;import oracle.jdbc.*;
import oracle.net.ano.AnoServices;
/**
 * JDBC thin driver demo: new security features in 11gR1.
 *
 * This program attempts to connect to the database using the JDBC thin
 * driver and requires the connection to be encrypted with either AES256 or AES192
 * and the data integrity to be verified with SHA1.
 *
 * In order to activate encryption and checksumming in the database you need to
 * modify the sqlnet.ora file. For example:
 *
 *   SQLNET.CRYPTO_SEED =
 *   "2z0hslkdharUJCFtkwbjOLbgwsj7vkqt3bGoUylihnvkhgkdsbdskkKGhdkl4p78hcpZr4"
 *   SQLNET.ENCRYPTION_TYPES_SERVER = (AES256,AES192,AES128)
 *   SQLNET.ENCRYPTION_SERVER = accepted
 *   SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER= (SHA1)
 *   SQLNET.CRYPTO_CHECKSUM_SERVER = accepted
 *
 * This output of this program is:
 *   Connection created! Encryption algorithm is: AES256, data integrity algorithm
 *   is: SHA1
 *
 */
public class DemoAESAndSHA1
{
  static final String USERNAME= "hr";
  static final String PASSWORD= "hr";
  static final String URL =
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=somehost.us.oracle.com)(PORT=5561))"  +"(CONNECT_DATA=(SERVICE_NAME=itydemo.regress.rdbms.dev.us.oracle.com)))";

  public static final void main(String[] argv)
  {
    DemoAESAndSHA1 demo = new DemoAESAndSHA1();
    try
    {
      demo.run();
    }catch(SQLException ex)
    {
      ex.printStackTrace();
    }
  }
  void run() throws SQLException
  {
    OracleDriver dr = new OracleDriver();
    Properties prop = new Properties();
    // We require the connection to be encrypted with either AES256 or AES192.
    // If the database doesn't accept such a security level, then the connection
    // attempt will fail.
    prop.setProperty(

OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,AnoServices.ANO_REQUIRED);
    prop.setProperty(
      OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,      "( " + AnoServices.ENCRYPTION_AES256 + "," +AnoServices.ENCRYPTION_AES192 + ")");
    // We also require the use of the SHA1 algorithm for data integrity checking.
    prop.setProperty(

OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,AnoServices.ANO_REQUIRED);
    prop.setProperty(
      OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES,      "( " + AnoServices.CHECKSUM_SHA1 + " )");

    prop.setProperty("user",DemoAESAndSHA1.USERNAME);
    prop.setProperty("password",DemoAESAndSHA1.PASSWORD);
    OracleConnection oraConn =
 (OracleConnection)dr.connect(DemoAESAndSHA1.URL,prop);

    System.out.println("Connection created! Encryption algorithm is: "+oraConn.getEncryptionAlgorithmName()    +", data integrity algorithm is: "+oraConn.getDataIntegrityAlgorithmName());

    oraConn.close();
  }

}