LoginSignup
1
6

More than 5 years have passed since last update.

Oracle Databaseのネットワークセキュリティ設定

Posted at

少し前まで、Oracle Advanced Securityの機能として提供されて、Enterprise Edition + ASOのライセンス料金が必要だった。
現在は、Standard Edition でも利用可能になっている。

Oracle Databaseライセンス情報

ネットワーク暗号化(ネイティブ・ネットワークの暗号化および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)
1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6