

# Oracle 本机网络加密
<a name="Appendix.Oracle.Options.NetworkEncryption"></a>

Amazon RDS 支持 Oracle 本机网络加密 (NNE)。利用 `NATIVE_NETWORK_ENCRYPTION` 选项，您可以在数据进出数据库实例时对数据进行加密。Amazon RDS 支持所有版本的 Oracle Database 的 NNE。

详细讨论 Oracle Native Network Encryption 超出了本指南的范围，但在您确定部署解决方案前，应该了解每个算法和密钥的优缺点。有关通过 Oracle 本机网络加密提供的算法和密钥的信息，请参阅 Oracle 文档中的[配置网络数据加密](http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/prod/security/network_encrypt/ntwrkencrypt.htm)。有关AWS安全性的更多信息，请参阅[AWS安全中心](https://aws.amazon.com/security)。

**注意**  
您可以使用本机网络加密或安全套接字层，但不能同时使用二者。有关更多信息，请参阅 [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)。

**Topics**
+ [NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.Options.md)
+ [添加 NATIVE\$1NETWORK\$1ENCRYPTION 选项](Oracle.Options.NNE.Add.md)
+ [在 sqlnet.ora 中设置 NNE 值](Oracle.Options.NNE.Using.md)
+ [修改 NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.ModifySettings.md)
+ [删除 NATIVE\$1NETWORK\$1ENCRYPTION 选项](Oracle.Options.NNE.Remove.md)

# NATIVE\$1NETWORK\$1ENCRYPTION 选项设置
<a name="Oracle.Options.NNE.Options"></a>

您可以在服务器和客户端上指定加密要求。例如，当数据库实例使用数据库链接连接到另一个数据库时，它可以充当客户端。您可能希望避免在服务器端强制加密。例如，您可能不希望强制所有客户端通信使用加密，因为服务器需要加密。在这种情况下，您可以使用 `SQLNET.*CLIENT` 选项强制在客户端加密。

Amazon RDS 支持 `NATIVE_NETWORK_ENCRYPTION` 选项的以下设置。

**注意**  
当您使用逗号分隔选项设置的值时，不要在逗号后面放置空格。


****  

| 选项设置 | 有效值 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
|  `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS`  |  `TRUE`, `FALSE`  |  `TRUE`  |  使用非安全密码的客户端尝试连接到数据库时服务器的行为。如果为 `TRUE`，即使客户没有使用 2021 年 7 月 PSU 修补也可以连接。 如果设置为 `FALSE`，客户端只有在使用 2021 年 7 月 PSU 修补后才能连接到数据库。将 `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS` 设置为 `FALSE` 之前，确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html)  | 
|  `SQLNET.ALLOW_WEAK_CRYPTO`  |  `TRUE`, `FALSE`  |  `TRUE`  |  使用非安全密码的客户端尝试连接到数据库时服务器的行为。以下密码被视为不安全： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 如果设置为 `TRUE`，则客户端可以在使用上述非安全密码时进行连接。 如果设置为 `FALSE`，则数据库会在客户端可以在使用上述非安全密码时阻止客户端进行连接。将 `SQLNET.ALLOW_WEAK_CRYPTO` 设置为 `FALSE` 之前，确保满足以下条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html)  | 
|  `SQLNET.CRYPTO_CHECKSUM_CLIENT`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  当客户端或充当客户端的服务器连接到数据库实例时的数据集成行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要数据库实例执行校验和。  | 
|  `SQLNET.CRYPTO_CHECKSUM_SERVER`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的数据集成行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要客户端执行校验和。  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  `SHA256`, `SHA384`, `SHA512`  |  校验和算法的列表。 您可以指定一个值，也可以指定逗号分隔的值列表。如果您使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER ` 必须有一个通用的密码。  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  |  校验和算法的列表。 您可以指定一个值，也可以指定逗号分隔的值列表。如果您使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 必须有一个通用的密码。  | 
|  `SQLNET.ENCRYPTION_CLIENT`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的客户端加密行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要给来自服务器的流量加密。  | 
|  `SQLNET.ENCRYPTION_SERVER`  |  `Accepted`, `Rejected`, `Requested`, `Required`   |  `Requested`  |  客户端或充当客户端的服务器连接到数据库实例时的服务器加密行为。当数据库实例使用数据库链接时，它充当客户端。 `Requested` 表示数据库实例不需要给来自客户端的流量加密。  | 
|  `SQLNET.ENCRYPTION_TYPES_CLIENT`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  客户端使用的加密算法的列表。客户端尝试通过按顺序尝试每种算法来对服务器输入进行解密，直到某种算法成功或到达列表末尾。 Amazon RDS 使用 Oracle 中的下列默认列表。RDS 从 `RC4_256` 开始，然后沿列表按顺序下移。您可以更改顺序或限制数据库实例将接受的算法。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 您可以指定一个值，也可以指定逗号分隔的值列表。如果使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.SQLNET.ENCRYPTION_TYPES_SERVER` 必须有一个通用的密码。  | 
|  `SQLNET.ENCRYPTION_TYPES_SERVER`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  `RC4_256`, `AES256`, `AES192`, `3DES168`, `RC4_128`, `AES128`, `3DES112`, `RC4_56`, `DES`, `RC4_40`, `DES40`  |  数据库实例使用的加密算法的列表。数据库实例使用每种算法，以便尝试对客户端输入解密，直到某种算法成功或到达列表末尾。 Amazon RDS 使用 Oracle 中的下列默认列表。您可以更改顺序或限制客户端将接受的算法。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.NNE.Options.html) 您可以指定一个值，也可以指定逗号分隔的值列表。如果使用逗号，请不要在逗号后插入空格；否则，您会收到 `InvalidParameterValue` 错误。 此参数和 `SQLNET.SQLNET.ENCRYPTION_TYPES_SERVER` 必须有一个通用的密码。  | 

# 添加 NATIVE\$1NETWORK\$1ENCRYPTION 选项
<a name="Oracle.Options.NNE.Add"></a>

将 `NATIVE_NETWORK_ENCRYPTION` 选项添加到数据库实例的一般过程如下：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 将 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

当选项组处于活动状态时，NNE 就处于活动状态。

**使用 AWS 管理控制台将 NATIVE\$1NETWORK\$1ENCRYPTION 选项添加到数据库实例**

1. 对于 **Engine**，请选择要使用的 Oracle 版本。NNE 在所有版本中都受支持。

1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 将 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。
**注意**  
添加 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，NNE 就处于活动状态。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。添加 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项后，您无需重新启动数据库实例。只要选项组处于活动状态，NNE 就处于活动状态。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

# 在 sqlnet.ora 中设置 NNE 值
<a name="Oracle.Options.NNE.Using"></a>

借助于 Oracle Native Network Encryption，您还可以在服务器端和客户端设置网络加密。客户端是用来连接到数据库实例的计算机。您可以在 slqnet.ora 中指定以下客户端设置：
+ `SQLNET.ALLOW_WEAK_CRYPTO`
+ `SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS`
+ `SQLNET.CRYPTO_CHECKSUM_CLIENT`
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`
+ `SQLNET.ENCRYPTION_CLIENT`
+ `SQLNET.ENCRYPTION_TYPES_CLIENT`

有关信息，请参阅 Oracle 文档中的[配置 Oracle 服务器和客户端的网络数据加密和完整性](http://docs.oracle.com/cd/E11882_01/network.112/e40393/asoconfg.htm)。

有时，数据库实例会拒绝来自应用程序的连接请求。例如，当客户端和服务器上的加密算法不匹配时，可能会发生拒绝。要测试 Oracle Native Network Encryption，请给客户端上的 sqlnet.ora 文件添加下列行：

```
DIAG_ADR_ENABLED=off
TRACE_DIRECTORY_CLIENT=/tmp
TRACE_FILE_CLIENT=nettrace
TRACE_LEVEL_CLIENT=16
```

当尝试连接时，先前的行会在称为 `/tmp/nettrace*` 的客户端上生成跟踪文件。该跟踪文件中包含关于连接的信息。有关使用 Oracle 本机网络加密时的相关连接问题的详细信息，请参阅 Oracle Database 文档中的[关于协商加密和完整性](http://docs.oracle.com/cd/E11882_01/network.112/e40393/asoconfg.htm#autoId12)。

# 修改 NATIVE\$1NETWORK\$1ENCRYPTION 选项设置
<a name="Oracle.Options.NNE.ModifySettings"></a>

启用 `NATIVE_NETWORK_ENCRYPTION` 选项后，您可以修改其设置。目前，您只能使用 AWS CLI 或 RDS API 修改 `NATIVE_NETWORK_ENCRYPTION` 选项设置。您无法使用控制台。以下示例修改该选项中的两个设置。

```
aws rds add-option-to-option-group \
    --option-group-name my-option-group \
    --options "OptionName=NATIVE_NETWORK_ENCRYPTION,OptionSettings=[{Name=SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER,Value=SHA256},{Name=SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER,Value=SHA256}]" \
    --apply-immediately
```

要了解如何使用 CLI 修改选项设置，请参阅[AWS CLI](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption.CLI)。有关各项设置的更多信息，请参阅[NATIVE\$1NETWORK\$1ENCRYPTION 选项设置](Oracle.Options.NNE.Options.md)。

**Topics**
+ [修改 CRYPTO\$1CHECKSUM\$1\$1 值](#Oracle.Options.NNE.ModifySettings.checksum)
+ [修改 ALLOW\$1WEAK\$1CRYPTO\$1 设置](#Oracle.Options.NNE.ModifySettings.encryption)

## 修改 CRYPTO\$1CHECKSUM\$1\$1 值
<a name="Oracle.Options.NNE.ModifySettings.checksum"></a>

如果修改 **NATIVE\$1NETWORK\$1ENCRYPTION** 选项设置，请确保以下选项设置具有至少一个通用密码：
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`
+ `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`

以下示例显示修改 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER` 的方案。该配置有效，因为 `CRYPTO_CHECKSUM_TYPES_CLIENT` 和 `CRYPTO_CHECKSUM_TYPES_SERVER` 都使用 `SHA256`。


| 选项设置 | 修改前的值 | 修改后的值 | 
| --- | --- | --- | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`  |  无更改  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  |  `SHA256`, `SHA384`, `SHA512`, `SHA1`, `MD5`  | SHA1,MD5,SHA256 | 

例如，假设需要将 `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER` 从默认设置改为 `SHA1,MD5`。在这种情况下，请确保将 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 设置为 `SHA1` 或者 `MD5`。这些算法不包含 `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT` 的默认值中。

## 修改 ALLOW\$1WEAK\$1CRYPTO\$1 设置
<a name="Oracle.Options.NNE.ModifySettings.encryption"></a>

要将 `SQLNET.ALLOW_WEAK_CRYPTO*` 选项从默认值设置为 `FALSE`，请确保满足以下条件：
+ `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 有一种匹配的安全加密方法。如果方法并非 `DES`、`3DES` 或 `RC4`（所有密钥长度），则该方法被视为安全。
+ `SQLNET.CHECKSUM_TYPES_SERVER` 和 `SQLNET.CHECKSUM_TYPES_CLIENT` 有一种匹配的安全校验和方法。如果方法并非 `MD5`，则该方法被视为安全。
+ 该客户端使用 2021 年 7 月的 PSU 进行了修补。如果客户端没有进行修补，则客户端将失去连接并收到 `ORA-12269` 错误。

下面的示例显示了示例 NNE 设置。假设您想要将 `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 设置为 FALSE，从而阻止不安全的连接。校验和选项设置满足先决条件，因为它们都具有 `SHA256`。但是，`SQLNET.ENCRYPTION_TYPES_CLIENT` 和 `SQLNET.ENCRYPTION_TYPES_SERVER` 使用 `DES`、`3DES` 和 `RC4` 加密方法，这些方法不安全。因此，要将 `SQLNET.ALLOW_WEAK_CRYPTO*` 选项设置为 `FALSE`，请首先将 `SQLNET.ENCRYPTION_TYPES_SERVER` 和 `SQLNET.ENCRYPTION_TYPES_CLIENT` 设置为安全加密方法，例如 `AES256`。


| 选项设置 | 值 | 
| --- | --- | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT`  |  `SHA256`, `SHA384`, `SHA512`  | 
|  `SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER`  | SHA1,MD5,SHA256 | 
|  `SQLNET.ENCRYPTION_TYPES_CLIENT`  |  `RC4_256`, `3DES168`, `DES40`  | 
|  `SQLNET.ENCRYPTION_TYPES_SERVER`  |  `RC4_256`, `3DES168`, `DES40`  | 

# 删除 NATIVE\$1NETWORK\$1ENCRYPTION 选项
<a name="Oracle.Options.NNE.Remove"></a>

您可以从数据库实例中删除 NNE。

要从数据库实例中删除 `NATIVE_NETWORK_ENCRYPTION` 选项，请执行下列操作之一：
+ 要从多个数据库实例中删除该选项，请从其所属的选项组中删除 `NATIVE_NETWORK_ENCRYPTION` 选项。此更改会影响使用该选项组的所有数据库实例。删除 `NATIVE_NETWORK_ENCRYPTION` 选项后，您无需重新启动数据库实例。有关更多信息，请参阅 [从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)。
+ 要从单个数据库实例中删除此选项，请修改该数据库实例，并指定另一个不包含 `NATIVE_NETWORK_ENCRYPTION` 选项的选项组。您可以指定默认 (空) 选项组，或指定其他自定义选项组。删除 `NATIVE_NETWORK_ENCRYPTION` 选项后，您无需重新启动数据库实例。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。