RDS for Oracleのネイティブネットワーク暗号化（NNE）を試してみた

# はじめに

Oracle Databaseへの接続におけるネットワークレイヤでの暗号化手法は、[Secure Socket Layer(SSL)](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.SSL.html)と[Native Network Encryption(NNE)](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.NetworkEncryption.html)の二種類がサポートされています。
元々はOracle Enterprise EditionのAdvanced Securityオプションが必要でしたが、AWS RDSではどちらの機能(SSL, NNE)も どのエディション(SE2, EE)でも無償で利用することが可能です。

どのような場合にどちらの機能を利用すると良いのか、[AWS Blog: Validate Native Network Encryption on Amazon RDS for Oracle](https://aws.amazon.com/jp/blogs/database/validate-native-network-encryption-on-amazon-rds-for-oracle/)を確認しつつ19cの環境でNNEを試してみた結果を記載します。

# NNEとSSL

Blogを参考に改めてまとめると、以下のようになります。
今回は設定が簡易なNNEについて確認します。

|| NNE | SSL |
|:-:|:-:|:-:|
|サーバ設定 |オプション・パラメータ設定のみ |オプション・パラメータ設定に加えてWallet／証明書の設定 |
|クライアント設定 |sqlnet設定のみ<br>(標準の暗号化なら設定不要) |Wallet／証明書の設定、接続名の設定<br>個別に設定が可能なので柔軟な設定も可能 |
|ネットワーク設定| 変更不要 | SSLの待ち受けポートが追加になるため<br>セキュリティグループ等の設定 |
|暗号化アルゴリズム| AES、RC4、3DES等複数のサポート | AESのみのサポート |

# RDS for Oracleへの接続

まずはRDS for OracleのNNE暗号化設定を行います。
流れとしては次のような形になり、非常に容易に設定することが可能です。
1. RDSのオプショングループにNNEを入れ、オプショングループの設定を行う
1. NNEを入れたオプショングループをRDSに適用する

実際にオプショングループを設定してみます。
オプショングループ名「oracle-19c-se2-cdb」というグループにNNE(NATIVE_NETWORK_ENCRYPTION)オプションを適用します。
ENCRYPTION_SERVERパラメータはREQUESTEDとなっています。
[Oracleのマニュアル](https://docs.oracle.com/cd/F19136_01/netrf/parameters-for-the-sqlnet.ora.html#GUID-AADC66D0-7574-4AD4-8408-5CD7D2AABA2A) を確認すると、ENCRYPTION_SERVERパラメータがREQUESTEDの場合には「相手側がセキュリティ・サービスを許可している場合は、セキュリティ・サービスを使用可能にする」というソフトな設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/4581b863-f93d-34eb-f449-9d95433040ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/76d746ae-4f80-f7bb-5d79-7d08daab5218.png)


## NNE暗号化での接続
NNE暗号化設定を有効化したRDSにSQLPlusで接続してみます。
暗号化が有効になっていることが確認できます。
```SQL
SQL> select network_service_banner from v$session_connect_info where sid in
     (select distinct sid from v$mystat);

NETWORK_SERVICE_BANNER
----------------------------------------------------------------------------------------------------
TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Encryption service for Linux: Version 19.0.1.0.0 - Production
RC4_256 Encryption service adapter for Linux: Version 19.0.1.0.0 - Production
Crypto-checksumming service for Linux: Version 19.0.1.0.0 - Production
SHA512 Crypto-checksumming service adapter for Linux: Version 19.0.1.0.0 - Production
```

トレースからも暗号化が有効になっていることが確認できます。
```SQL
(140095796185664) [26-APR-2023 11:34:33:428] na_tns:    Authentication is not active
(140095796185664) [26-APR-2023 11:34:33:428] na_tns:    Encryption is active, using RC4_256
(140095796185664) [26-APR-2023 11:34:33:428] na_tns:    Crypto-checksumming is active, using SHA512
```
## NNE暗号化なしでの接続
比較のため、NNE暗号化なしで RDS for Oracleに接続してみます。
NNE暗号化が有効になっていないことが確認できます。
```SQL
SQL> select network_service_banner from v$session_connect_info where sid in
　　 (select distinct sid from v$mystat);

NETWORK_SERVICE_BANNER
------------------------------------------------------------------------------
TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Encryption service for Linux: Version 19.0.1.0.0 - Production
Crypto-checksumming service for Linux: Version 19.0.1.0.0 - Production
```

トレースからも暗号化が有効でないことが確認できます。
```SQL
(139900779448896) [26-APR-2023 11:38:16:184] na_tns:    Authentication is not active
(139900779448896) [26-APR-2023 11:38:16:184] na_tns:    Encryption is not active
(139900779448896) [26-APR-2023 11:38:16:184] na_tns:    Crypto-checksumming is not active
```

# まとめ
RDS for Oracleのネイティブネットワーク暗号化(NNE)の設定を試し、実際に暗号化が行われていることが確認できました。
NNEの設定自体は容易に設定できるため、セキュリティ要件として問題ないならSSLではなくNNEを選択することで暗号化環境を容易に確保することが可能となります。
SSLほど柔軟ではありませんが、NNEでもCLIENT側での暗号化を個別に設定することで、特定のCLIENTのみからの通信を暗号化することも可能となりますので、End-to-Endの暗号化が必要な場合にはまずはNNE暗号化を検討してみていただければと考えてます。



#### おまけ

RDS for Oracleにおいては、[SSL](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.SSL.html) と [NNE](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.NetworkEncryption.html) は同時に利用することができません。(ユーザガイドのそれぞれに記載があります)
一方、Oracleのナレッジ(Support Of SSL And Oracle Native Network Encryption (NNE) On The Same Instance For Enabling FIPS140 (ドキュメントID 2833084.1))によると、（サポート情報なので詳細は記載しませんが）あるバージョンから利用できるようになっているようです。

また、暗号化と性能影響は表裏一体となり、アプリケーションへの影響はそれぞれで確認していただく必要がありますが、次のようなナレッジもありますので、暗号化を利用する際には性能は必ず確認しましょう。
Slow Connection Using 12c Client When Network Encryption Is Enabled (ドキュメントID 2247689.1)