プライマリ・コンテンツに移動
Oracle® Database Advanced Security管理者ガイド
11gリリース2 (11.2)
B56286-10
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

この章では、Java Database Connectivity (JDBC)シン・クライアントがOracle Databaseに安全に接続できるようにするOracle Advanced SecurityのJava実装について説明します。この章の内容は次のとおりです。

10.1 Java実装について

Oracle Advanced SecurityのJava実装では、Oracle Advanced Securityが有効になっているOracle Databaseと通信するシンJDBCクライアントに対して、ネットワーク認証、暗号化および整合性の保護が提供されます。

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

10.1.1 Java Database Connectivityのサポート

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

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

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

  • LOBアクセスおよび操作

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

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

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

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

10.1.2 シンJDBCの保護

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

  • 厳密認証

  • データ暗号化

  • データ整合性チェック

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

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

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

  • Oracle Database 11g リリース2 (11.2)からOracle Advanced Securityがインストールされている旧バージョンのOracleデータベースへの接続の保護

Oracle JDBC Thin driverは、Oracle Advanced SecurityのSSL実装およびRADIUSやKerberosなどのサード・パーティの認証方式をサポートしています。シンJDBCによる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


注意:

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

シンJDBCによるAdvanced Encryption Standard (AES)のサポートは、Oracle Database 11g リリース2 (11.2)で新たに導入されました。

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


関連項目:

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

10.1.3 実装の概要

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

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

10.1.4 不明瞭化

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

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

10.2 構成パラメータ

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

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


関連項目:

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

10.2.1 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELパラメータ

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

表10-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クラスのオブジェクトです。


10.2.2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESパラメータ

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

表10-2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

AES256AES192AES1283DES1683DES112

構文

prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,algorithm);

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

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

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


10.2.3 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVELパラメータ

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

表10-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クラスのオブジェクトです。


10.2.4 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESパラメータ

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

表10-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クラスのオブジェクトです。


10.2.5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESパラメータ

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

表10-5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESの属性

属性 説明

パラメータ・タイプ

文字列

パラメータ・クラス

静的

設定できる値

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クラスのオブジェクトです。


10.2.6 AnoServices定数

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

// ---- SUPPORTED ENCRYPTION ALG -----
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_SHA1 = "SHA1";
// ---- SUPPORTED AUTHENTICATION ADAPTORS ----
public static final String AUTHENTICATION_RADIUS = "RADIUS";
public static final String AUTHENTICATION_KERBEROS = "KERBEROS";

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

例10-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();
  }
  
}