22 シンJDBCクライアント・ネットワークの構成

Oracle Databaseのネイティブ暗号化および厳密認証を使用すると、シンJava Database Connectivity (JDBC)クライアントは、Oracleデータベースに安全に接続できます。

22.1 Java実装について

Oracle Databaseには、ネイティブ・ネットワーク暗号化と厳密認証のJava実装が用意されています。

Oracle Databaseのネイティブ・ネットワーク暗号化および厳密認証のJava実装では、Oracle Databaseのネイティブ・ネットワーク暗号化および厳密認証が構成されているOracle Databaseと通信するシンJDBCクライアントに対して、ネットワーク認証、暗号化および整合性の保護が提供されます。

22.2 Java Database Connectivityのサポート

業界標準のJavaインタフェースであるJDBCは、Javaプログラムからリレーショナル・データベースに接続するためのJava標準です。

JDBC標準はSun Microsystemsによって規定され、オラクル社では独自のJDBCドライバによってこの標準を実装および拡張しています。

Oracle JDBCドライバは、Oracleデータベースと通信するJava Database Connectivity (JDBC)アプリケーションを作成するために使用されます。Oracleでは、CベースのOracle Netクライアントの最上部に構築されたシックJDBCドライバ、およびシン(Pure Java) JDBCドライバの2つのタイプのJDBCドライバが実装されます。JDBCに対するOracleの拡張機能には、次の機能が含まれます。

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

  • LOBアクセスおよび操作

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

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

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

  • アプリケーション・パフォーマンスの向上

22.3 シンJDBCの機能

シンJDBCドライバは、厳密認証、データ暗号化、データ整合性チェックなど、セキュリティ機能を備えています。

Oracleには、シン・クライアントで使用するために、Oracle Databaseネイティブ・ネットワーク暗号化と、厳密認証、暗号化および整合性アルゴリズムの100パーセントJava実装が用意されています。

Oracle Databaseには、シンJDBCのための次の機能が備えられています。

  • 厳密認証

  • データの暗号化

  • データ整合性チェック

  • シンJDBCクライアントからOracleデータベースへの接続の保護

  • 開発者が安全な通信チャネルでデータを転送するアプレットを作成するための機能

  • Java Server Pages (JSP)を持つ中間層サーバーからOracleデータベースへの接続の保護

  • 現在のリリースのOracle Databaseから旧バージョンのOracle Databaseへの接続の保護

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

Oracle Databaseのネイティブ・ネットワーク暗号化および厳密認証のJava実装では、次の暗号化アルゴリズムのJavaバージョンが提供されます。

  • AES256: AES 256ビット・キー

  • AES192: AES 192ビット・キー

  • AES128: AES 128ビット・キー

ノート:

前述のアルゴリズムのリストで、CBCは暗号ブロック連鎖モードのことです。

シンJDBCによるAdvanced Encryption Standard (AES)のサポートは、Oracle Database 12cリリース1 (12.1)で導入されました。

さらに、この実装により、SHA1およびMD5を使用したシンJDBCのデータ整合性チェックが実行されます。シンJDBCによるSHA1のサポートは、Oracle Database 11g リリース1 (11.1)で導入されました。

ノート:

MD5は、このリリースでは非推奨です。より強力なアルゴリズムを使用するようにOracle Database環境を移行するには、My Oracle Supportノート2118136.2で説明されているパッチをダウンロードしてインストールします。

22.4 実装の概要

サーバー側で、アルゴリズムのネゴシエーションおよびキーの生成は、Oracle Database固有の暗号化とまったく同様に機能します。

この機能により、クライアントとサーバーの下位および上位互換性が維持されます。

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

22.5 Java暗号化コードの不明瞭化

Java暗号化コードの不明瞭化では、不明瞭化ソフトウェアを使用して、暗号化機能と複号化機能を含むJavaクラスおよびメソッドを保護します。

Javaバイト・コードの不明瞭化は、Javaプログラムの形式で作成された知的財産を保護するためによく使用されるプロセスです。これによって、コード内のJavaシンボルが変更されます。プロセスは、元のプログラム構造をそのまま保持し、意図した動作を隠すためにクラス、メソッドおよび変数の名前を変更する一方でプログラムが正常に稼働するようにする。不明瞭化されていないJavaコードは再コンパイルして読むことができますが、不明瞭化されたJavaコードは再コンパイルが難しく、米国政府の輸出規制を満たすことができます。

22.6 シンJDBCネットワーク実装の構成パラメータ

クライアントのシンJDBCネットワーク実装では、暗号化や整合性、認証サービスを制御するパラメータを提供します。

22.6.1 シンJDBCネットワーク実装の構成パラメータについて

JDBCネットワーク実装の構成パラメータでは、クライアントとサーバー間接続で使用するセキュリティのレベルなど、ネットワーク設定を制御します。

いくつかの構成パラメータを含むプロパティ・クラス・オブジェクトは、Oracle Databaseのネイティブ・ネットワーク暗号化および厳密認証インタフェースに渡されます。

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

22.6.2 クライアント暗号化レベルのパラメータ

CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELパラメータは、クライアントがサーバーとのネゴシエートに使用するセキュリティのレベルを定義します。

表22-1に、このパラメータの属性を示します。

表22-1 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

REJECTEDACCEPTEDREQUESTEDREQUIRED

デフォルト値

ACCEPTED

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,level);

propPropertiesクラスのオブジェクトです。

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

propPropertiesクラスのオブジェクトです。

22.6.3 クライアント暗号化選択リストのパラメータ

CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESパラメータは、使用する暗号化アルゴリズムを定義します。

表22-2に、このパラメータの属性を示します。

表22-2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

AES256 (AES 256ビット・キー)、AES192 (AES 192ビット・キー)、AES128 (AES 128ビット・キー)

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,algorithm);

propPropertiesクラスのオブジェクトです。

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

propPropertiesクラスのオブジェクトです。

22.6.4 クライアント整合性レベルのパラメータ

CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVELパラメータは、データ整合性のためにサーバーとネゴシエートする際のセキュリティのレベルを定義します。

表22-3に、このパラメータの属性を示します。

表22-3 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVELの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

REJECTEDACCEPTEDREQUESTEDREQUIRED

デフォルト値

ACCEPTED

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,level);

propPropertiesクラスのオブジェクトです。

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

propPropertiesクラスのオブジェクトです。

22.6.5 クライアント整合性選択リストのパラメータ

CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESパラメータは、使用するデータ整合性アルゴリズムを定義します。

Table 22-4に、このパラメータの属性を示します。

表22-4 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

SHA1

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES, algorithm);

propPropertiesクラスのオブジェクトです。

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

propPropertiesクラスのオブジェクトです。

22.6.6 クライアント認証サービスのパラメータ

CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESパラメータは、使用する認証サービスを決定します。

Table 22-5に、このパラメータの属性を示します。

表22-5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

RADIUS, KERBEROS5, BEQ, TCPS

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES,authentication);

propPropertiesクラスのオブジェクトです。

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICES,"( RADIUS, KERBEROS5,TCPS)")

propPropertiesクラスのオブジェクトです。

22.6.7 AnoServices定数

oracle.net.ano.AnoServicesインタフェースには、JDBCシン・ドライバによってサポートされる暗号化、認証およびチェックサムのアルゴリズムの名前が含まれます。

次の定数が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_KERBEROS5 = "KERBEROS5";
public static final String AUTHENTICATION_TCPS = "TCPS";

ノート:

DES40、3DES112、3DES168、MD5、RC4_40、RC4_56、RC4_128およびRC4-256アルゴリズムは、このリリースでは非推奨です。より強力なアルゴリズムを使用するようにOracle Database環境を移行するには、My Oracle Supportノート2118136.2で説明されているパッチをダウンロードしてインストールします。

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

例22-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.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.example.com)(PORT=5561))"  +"(CONNECT_DATA=(SERVICE_NAME=itydemo.regress.rdbms.dev.us.example.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();
  }
  
}