この章では、Java Database Connectivity (JDBC)シン・クライアントがOracle Databaseに安全に接続できるようにするOracle Advanced SecurityのJava実装について説明します。この章の内容は次のとおりです。
|
関連項目: JDBCの詳細および例は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 |
Oracle Advanced SecurityのJava実装では、Oracle Advanced Securityが有効になっているOracle Databaseと通信するシンJDBCクライアントに対して、ネットワーク認証、暗号化および整合性の保護が提供されます。
この項の内容は次のとおりです。
業界標準の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オブジェクト型マッピング
オブジェクト参照アクセスおよび操作
配列アクセスおよび操作
アプリケーション・パフォーマンスの向上
シン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開発者ガイドおよびリファレンス』を参照してください。 |
サーバー側で、アルゴリズムのネゴシエーションおよび鍵の生成は、Oracle Advanced Security固有の暗号化とまったく同様に機能します。これにより、クライアントとサーバーの下位および上位互換性が維持されます。
クライアント側では、アルゴリズムのネゴシエーションおよび鍵の生成は、OCIクライアントとまったく同じ方法で行われます。クライアントとサーバーは、従来のOracle Netクライアントと同様の方法で、暗号化アルゴリズムのネゴシエーション、乱数の生成、Diffie-Hellmanを使用したセッション鍵の交換を行い、Oracle Password Protocolを使用します。シンJDBCには、Oracle Netクライアントがpure Javaで完全に実装されています。
Javaの暗号化コードは不明瞭化されています。不明瞭化では、不明瞭化ソフトウェアを使用して、暗号化機能と複号化機能を含むJavaクラスおよびメソッドを保護します。
Javaバイト・コードの不明瞭化は、Javaプログラムの形式で作成された知的財産を保護するためによく使用されるプロセスです。これによって、コード内のJavaシンボルが変更されます。プロセスは、元のプログラム構造をそのまま保持し、意図した動作を隠すためにクラス、メソッドおよび変数の名前を変更する一方でプログラムを正常に実行します。不明瞭化されていないJavaコードは再コンパイルして読むことができますが、不明瞭化されたJavaコードは再コンパイルが難しく、米国政府の輸出規制を満たすことができます。
複数の構成パラメータを含むプロパティ・クラス・オブジェクトは、Oracle Advanced Securityインタフェースに渡されます。
Oracle Advanced Securityに関連する接続プロパティを含むすべてのJDBC接続プロパティは、oracle.jdbc.OracleConnectionインタフェースで定数として定義されます。次のリストに、それらの接続プロパティの一部を列挙します。
|
関連項目: 構成パラメータおよび構成例の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 |
このパラメータは、クライアントがサーバーとネゴシエートするセキュリティのレベルを定義します。表10-1に、このパラメータの属性を示します。
表10-1 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELの属性
| 属性 | 説明 |
|---|---|
|
パラメータ・タイプ |
文字列 |
|
パラメータ・クラス |
静的 |
|
設定できる値 |
|
|
デフォルト値 |
|
|
構文 |
|
|
例 |
|
このパラメータは、使用する暗号化アルゴリズムを定義します。表10-2に、このパラメータの属性を示します。
表10-2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESの属性
| 属性 | 説明 |
|---|---|
|
パラメータ・タイプ |
文字列 |
|
パラメータ・クラス |
静的 |
|
設定できる値 |
|
|
構文 |
|
|
例 |
|
このパラメータは、データ整合性のためにクライアントがサーバーとネゴシエートするセキュリティのレベルを定義します。表10-3に、このパラメータの属性を示します。
表10-3 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL属性
| 属性 | 説明 |
|---|---|
|
パラメータ・タイプ |
文字列 |
|
パラメータ・クラス |
静的 |
|
設定できる値 |
|
|
デフォルト値 |
|
|
構文 |
|
|
例 |
|
このパラメータは、使用するデータ整合性アルゴリズムを定義します。表10-4に、このパラメータの属性を示します。
表10-4 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESの属性
| 属性 | 説明 |
|---|---|
|
パラメータ・タイプ |
文字列 |
|
パラメータ・クラス |
静的 |
|
設定できる値 |
|
|
構文 |
|
|
例 |
|
このパラメータは、使用する認証サービスを決定します。表10-5に、このパラメータの属性を示します。
表10-5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESの属性
| 属性 | 説明 |
|---|---|
|
パラメータ・タイプ |
文字列 |
|
パラメータ・クラス |
静的 |
|
設定できる値 |
|
|
構文 |
|
|
例 |
|
このリリースで、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();
}
}