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