少し前まで、Oracle Advanced Securityの機能として提供されて、Enterprise Edition + ASOのライセンス料金が必要だった。
現在は、Standard Edition でも利用可能になっている。
ネットワーク暗号化(ネイティブ・ネットワークの暗号化およびSSL/TLS)と厳密認証サービス(Kerberos、PKIおよびRADIUS)は、Oracle Advanced Securityの一部ではなくなり、ライセンスが供与されているすべてのOracleデータベース・エディションに含まれるようになりました。
ここではJDBC Thin Driver での利用について記述する。
元ネタ:Oracle Database JDBC開発者ガイド
- JDBC Thinドライバによるデータ暗号化と整合性のサポート
ネットワーク暗号化
デフォールトでは、サーバー側もクライアント側もACCEPTED。
これでネゴシエーションすると、暗号化OFF となり、平文通信となる。
暗号通信にするには、クライアント側だけでも REQUESTED にすれば、デフォールト設定のサーバは acceptして、暗号通信を使う。
暗号通信を request するか、暗号アルゴリズムに何を使うかは、Javaプロパティ・オブジェクトを介して対応するパラメータを設定し、データベース接続するときに引数で渡せば使用できる。
元ネタのサンプルコードでは、Properties のキー名について、OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL
と定数名しか記述がない。ここでは現在のdriverでのキー値を示す(おそらく今後も変更はない)。
oracle.net.encryption_client=REQUESTED
oracle.net.encryption_types_client=( DES40C )
タイプの値は、丸カッコで囲み、リスト形式で指定できます。複数の値を指定した場合は、サーバーとクライアントの間のネゴシエーションにより、実際に使用される値が決定されます。
設定方法
3通り考えられる。
- JVM起動オプションの
-Doracle.net.encryption_client=REQUESTED
- プログラム初期動作中に
System.setProperty("key", "value")
- JDBCコネクション作成時
java.sql.Driver.connect(String url, Properties info)
コマンドラインツールなら、properties に記述があれば、初期動作中に設定するのがいいだろう。
Tomcatなら起動オプションにデフォールトを記述しておき、必要に応じて書き換えるのがいいだろう。
確認方法
サンプルコード
java.sql.Connection con = driver.connect(url, info);
OracleConnection oraConn = (OracleConnection)con;
System.out.println("Encryption algorithm is: " + oraConn.getEncryptionAlgorithmName());
上記を参考にして、コネクション作成後にDEBUGまたはINFOログを出す。
設定値の決定
encryption_types_clientを指定せずに requested で、デフォールト設定の12cサーバとのコネクションを作成すると、getEncryptionAlgorithmName() は AES256である。
この状況ならtypeについてはデフォールトに任せてもいいが、設定ファイルに明に書いてある方が、何が行われているかわかりやすく、Oracleの都合でデフォールトが変更になったときにもキー名を調べ直す必要がなく対応しやすい。
oracle.net.encryption_client=REQUESTED
oracle.net.encryption_types_client=(AES256, AES192, AES128)
他にも選択可能なアルゴリズムはあるが、候補リストに入れる意味はない。
- RC4_128以下は安全とはいえない
- 2015年2月、TLSのすべてのバージョンにおいてRC4の利用を禁止する RFC 7465 が公開された。
- RC4-256 もあるがこれを残しても誰も嬉しくない。
- DESは安全とはいえない
- 3DESは遅かったDESの3回適用なので、安全かもしれないが遅かろう
ネットワーク整合性
セキュアなメッセージ・ダイジェストを生成し、データの変更、パケットの削除、反射攻撃などの攻撃から保護する。
サーバ・クライアントのネゴシエーション、設定方法、確認方法ともネットワーク暗号化と同様である。
oracle.net.crypto_checksum_client=REQUESTED
oracle.net.crypto_checksum_types_client=(SHA256, SHA1, MD5)
java.sql.Connection con = driver.connect(url, info);
OracleConnection oraConn = (OracleConnection)con;
System.out.println("Encryption algorithm is: " + oraConn.getEncryptionAlgorithmName()
+ ", Message Digest algorithm is: " + oraConn.getDataIntegrityAlgorithmName());
crypto_checksum_types_clientを指定せずに requested でコネクションを作成すると、getDataIntegrityAlgorithmName() は SH1である。
デフォールト設定の12cサーバでは、SHA256にならない。
SHA256を使うには、サーバ側の sqlnet.oraファイルを編集する必要がある。サービス(プロセス)の再起動までは必要ない。
例:"C:\app\oracle\product\12.2.0\dbhome_1\network\admin\sqlnet.ora"に追記。
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1, MD5)