

# 为 Oracle 数据库实例设置 Kerberos
<a name="oracle-kerberos-setting-up"></a>

使用 AWS Directory Service for Microsoft Active Directory（也称为 AWS Managed Microsoft AD）为 Oracle 数据库实例设置 Kerberos 身份验证。要设置 Kerberos 身份验证，请完成以下步骤：
+ [步骤 1：使用 AWS Managed Microsoft AD 创建目录](#oracle-kerberos.setting-up.create-directory)
+ [步骤 2：创建信任](#oracle-kerberos.setting-up.create-forest-trust)
+ [步骤 3：配置 Amazon RDS 的 IAM 权限](#oracle-kerberos.setting-up.CreateIAMRole)
+ [步骤 4：创建和配置用户](#oracle-kerberos.setting-up.create-users)
+ [步骤 5：在目录和数据库实例之间启用跨 VPC 流量](#oracle-kerberos.setting-up.vpc-peering)
+ [步骤 6：创建或修改 Oracle 数据库实例](#oracle-kerberos.setting-up.create-modify)
+ [步骤 7：创建 Kerberos 身份验证 Oracle 登录名](#oracle-kerberos.setting-up.create-logins)
+ [步骤 8：配置 Oracle 客户端](#oracle-kerberos.setting-up.configure-oracle-client)

**注意**  
在设置过程中，RDS 会创建一个名为 *managed\$1service\$1user*@*example.com* 且具有 `CREATE SESSION` 权限的 Oracle 数据库用户，其中的 *example.com* 为您的域名。此用户对应于 Directory Service 在 Managed Active Directory 中创建的用户。RDS 会定期使用 Directory Service 提供的凭证登录 Oracle 数据库。之后，RDS 会立即销毁票证缓存。

## 步骤 1：使用 AWS Managed Microsoft AD 创建目录
<a name="oracle-kerberos.setting-up.create-directory"></a>

Directory Service 将在 AWS 云中创建一个完全托管的 Active Directory。创建 AWS Managed Microsoft AD 目录时，Directory Service 将代表您创建两个域控制器和域名系统 (DNS) 服务器。目录服务器在 VPC 中的不同子网中创建。这种冗余有助于确保始终可以访问目录，即使发生了故障。

创建 AWS Managed Microsoft AD 目录时，Directory Service 代表您执行以下任务：
+ 在 VPC 中设置 Active Directory。
+ 使用用户名 Admin 和指定密码创建目录管理员账户。您可以使用此账户管理您的目录。
**注意**  
请务必保存此密码。Directory Service 不会存储它。您可以重置它，但无法检索它。
+ 为目录控制器创建安全组。

在启动 AWS Managed Microsoft AD 时，AWS 创建一个组织单位 (OU)，其中包含目录的所有对象。此 OU 具有您在创建目录时键入的 NetBIOS 名称且位于域根目录中。此域根目录由 AWS 拥有和管理。

使用您的 AWS Managed Microsoft AD 目录创建的 Admin 账户对您的 OU 的最常见管理活动具有以下权限：
+ 创建、更新或删除用户 
+ 将资源添加到域（如文件或打印服务器），然后为 OU 中的用户分配这些资源的权限 
+ 创建额外的 OU 和容器 
+ 委托授权 
+ 从 Active Directory 回收站还原删除的对象 
+ 在 Active Directory Web 服务上运行 AD 和 DNS Windows PowerShell 模块 

Admin 账户还具有执行下列域范围活动的权限：
+ 管理 DNS 配置（添加、删除或更新记录、区域和转发器） 
+ 查看 DNS 事件日志 
+ 查看安全事件日志 

您可以使用 AWS 管理控制台、AWS CLI 或 Directory Service API 创建目录。确保打开目录安全组上的相关出站端口，以便目录可以与 Oracle 数据库实例进行通信。

**使用 AWS Managed Microsoft AD 创建目录**

1. 登录 AWS 管理控制台，然后打开 Directory Service 控制台，网址为：[https://console.aws.amazon.com/directoryservicev2/](https://console.aws.amazon.com/directoryservicev2/)。

1. 在导航窗格中，选择 **Directories (目录)**，然后选择 **Set up Directory (设置目录)**。

1. 选择 **AWS Managed Microsoft AD**。AWS Managed Microsoft AD 是当前唯一可以与 Amazon RDS 一起使用的选项。

1.  输入以下信息：  
**目录 DNS 名称**  
目录的完全限定名称，例如 **corp.example.com**。  
**目录 NetBIOS 名称**  
目录的短名称，如 **CORP**。  
**目录描述**  
（可选）目录的描述。  
**管理员密码**  
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。  
目录管理员密码不能包含单词“admin”。此密码区分大小写，且长度必须介于 8 – 64 个字符之间。至少，它还必须包含下列四种类别中三种类别的一个字符：  
   + 小写字母 (a–z) 
   + 大写字母 (A–Z) 
   + 数字 (0–9) 
   + 非字母数字字符 (\$1\$1@\$1\$1%^&\$1\$1-\$1=`\$1\$1()\$1\$1[]:;"'<>,.?/)   
**确认密码**  
已重新键入管理员密码。

1. 选择 **Next (下一步)**。

1.  在 **Networking (网络)** 部分中输入以下信息，然后选择 **Next (下一步)**：  
**VPC**  
目录的 VPC。在同一 VPC 中创建 Oracle 数据库实例。  
**子网**  
目录服务器的子网。两个子网必须位于不同的可用区。

1.  查看目录信息并进行必要的更改。如果信息正确，请选择 **Create directory (创建目录)**。  
![\[创建过程中的目录详细信息页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth2.png)

目录创建需要几分钟时间。创建成功后，**Status (状态)** 值将更改为 **Active (活动)**。

要查看有关您的目录的信息，请在目录列表中选择目录名称。请记下 **Directory ID (目录 ID)** 值，因为您在创建或修改 Oracle 数据库实例时需要此值。

![\[“目录详细信息”页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/WinAuth3.png)


## 步骤 2：创建信任
<a name="oracle-kerberos.setting-up.create-forest-trust"></a>

如果您计划仅使用 AWS Managed Microsoft AD，请转到[步骤 3：配置 Amazon RDS 的 IAM 权限](#oracle-kerberos.setting-up.CreateIAMRole)。

要使用自行管理的 Active Directory 启用 Kerberos 身份验证，您必须在自行管理的 Active Directory 与在上一步中创建的 AWS Managed Microsoft AD 之间创建林信任关系。信任可以是单向的，其中 AWS Managed Microsoft AD 信任自行管理的 Active Directory。信任也可以是双向的，此时两个 Active Directory 相互信任。有关使用 Directory Service 设置林信任的更多信息，请参阅 *Directory Service 管理指南* 中的[何时创建信任关系](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)。

## 步骤 3：配置 Amazon RDS 的 IAM 权限
<a name="oracle-kerberos.setting-up.CreateIAMRole"></a>

要为您调用 Directory Service，Amazon RDS 需要一个使用托管式 IAM policy `AmazonRDSDirectoryServiceAccess` 的 IAM 角色。该角色允许 Amazon RDS 调用 Directory Service。

**注意**  
为了让角色允许访问，AWS Security Token Service（AWS STS）端点必须在您的 AWS 账户的正确 AWS 区域中激活。AWS STS 端点原定设置为在所有 AWS 区域中保持活跃，您无需执行任何进一步操作即可使用它们。有关更多信息，请参阅**《IAM 用户指南》中的[在 AWS 区域中激活和停用 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate)。

### 创建 IAM 角色
<a name="oracle-kerberos.setting-up.CreateIAMRole.create-role"></a>

当您使用 AWS 管理控制台创建数据库实例并且控制台用户具有 `iam:CreateRole` 权限时，控制台将自动创建 `rds-directoryservice-kerberos-access-role`。否则，您必须手动创建 IAM 角色。当手动创建 IAM 角色时，请选择 `Directory Service`，然后将 AWS 托管式策略 `AmazonRDSDirectoryServiceAccess` 附加到该角色。

有关为服务创建 IAM 角色的更多信息，请参阅 *IAM 用户指南*中的[创建向AWS服务委托权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**注意**  
用于 RDS for Microsoft SQL Server 的 Windows 身份验证 IAM 角色不能用于 RDS for Oracle。

### 手动创建 IAM 信任策略
<a name="oracle-kerberos.setting-up.CreateIAMRole.trust-policy"></a>

或者，您可以创建具有所需权限的资源策略，而不是使用托管式 IAM policy `AmazonRDSDirectoryServiceAccess`。同时指定 `directoryservice.rds.amazonaws.com` 和 `rds.amazonaws.com` 作为主体。

要限制 Amazon RDS 为其他服务提供对资源的权限，我们建议在资源策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键。防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和 Amazon RDS 资源的完整 ARN。有关更多信息，请参阅 [防范跨服务混淆代理问题](cross-service-confused-deputy-prevention.md)。

以下示例演示如何使用 Amazon RDS 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "directoryservice.rds.amazonaws.com",
          "rds.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:rds:us-east-1:123456789012:db:mydbinstance"
        },
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        }
      }
    }
  ]
}
```

------

对于选择加入区域，您还必须以 `directoryservice.rds.region_name.amazonaws.com` 形式包含该区域的服务主体。例如，在非洲（开普敦）区域中，使用以下信任策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "directoryservice.rds.amazonaws.com",
          "directoryservice.rds.af-south-1.amazonaws.com",
          "rds.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:rds:af-south-1:123456789012:db:mydbinstance"
        },
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        }
      }
    }
  ]
}
```

------

角色还必须具有以下 IAM policy。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "ds:DescribeDirectories",
        "ds:AuthorizeApplication",
        "ds:UnauthorizeApplication",
        "ds:GetAuthorizedApplicationDetails"
      ],
    "Effect": "Allow",
    "Resource": "*"
    }
  ]
}
```

------

## 步骤 4：创建和配置用户
<a name="oracle-kerberos.setting-up.create-users"></a>

 您可使用 Active Directory 用户和计算机工具（Active Directory 域服务和 Active Directory 轻型目录服务工具之一）创建用户。在这种情况下，*用户*表示有权访问您的目录的独立个人或实体。

要在 Directory Service 目录中创建用户和组，您必须连接到属于 Directory Service 目录成员的 Windows Amazon EC2 实例。同时，您必须以具有创建用户权限的用户身份登录。有关在 Microsoft Active Directory 中创建用户的更多信息，请参阅 *AWS Managed Microsoft AD 管理指南*中的[管理 Directory Service 中的用户和组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)。

## 步骤 5：在目录和数据库实例之间启用跨 VPC 流量
<a name="oracle-kerberos.setting-up.vpc-peering"></a>

如果您打算将目录和数据库实例放在同一 VPC 中，请跳过该步骤，然后转到[步骤 6：创建或修改 Oracle 数据库实例](#oracle-kerberos.setting-up.create-modify)。

如果您计划在不同AWS账户或 VPC 中查找目录和数据库实例，请使用 VPC 对等连接或[AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 配置跨 VPC 流量。以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 *Amazon Virtual Private Cloud 对等连接指南*中的[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/Welcome.html)操作。

**使用 VPC 对等连接启用跨 VPC 流量**

1. 设置适合的 VPC 路由规则，以便确保网络流量可以双向流动。

1. 确保数据库实例的安全组可以从目录的安全组接收入站流量。有关更多信息，请参阅 *AWS Managed Microsoft AD 管理指南* 中的 [Directory Service 最佳实践](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_best_practices.html)。

1. 确保没有任何网络访问控制列表 (ACL) 规则会阻止流量。

如果该目录由不同的 AWS 账户拥有，则您必须共享该目录。

**在 AWS 账户之间共享目录**

1. 按照 *AWS 管理指南*中的[教程：共享 AWS Managed Microsoft AD 目录以实现无缝 EC2 域加入](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html)中的说明，开始与将要在其中创建数据库实例的 Directory Service 账户共享目录。

1. 使用数据库实例的账户登录到 Directory Service 控制台，并确保在处理之前域具有 `SHARED` 状态。

1. 使用数据库实例的账户登录 Directory Service 控制台时，请记录**目录 ID** 值。您可以使用此目录 ID 将数据库实例加入域。

## 步骤 6：创建或修改 Oracle 数据库实例
<a name="oracle-kerberos.setting-up.create-modify"></a>

创建或修改 Oracle 数据库实例，以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作：
+ 使用控制台、[ create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 Oracle 数据库实例。

  有关说明，请参阅[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 使用控制台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有 Oracle 数据库实例。

  有关说明，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+ 使用控制台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作从数据库快照还原 Oracle 数据库实例。

  有关说明，请参阅[还原到数据库实例](USER_RestoreFromSnapshot.md)。
+ 使用控制台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作将 Oracle 数据库实例还原到某个时间点。

  有关说明，请参阅[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

只有 VPC 中的 Oracle 数据库实例才支持 Kerberos 身份验证。数据库实例可以与目录在同一 VPC 中或在不同 VPC 中。创建或修改数据库实例时，请执行以下操作：
+ 请提供创建目录时生成的域标识符（`d-*` 标识符）。
+ 还要提供您创建的 IAM 角色的名称。
+ 确保数据库实例安全组可以从目录安全组接收入站流量并将出站流量发送到目录。

在使用控制台创建数据库实例时，请选择 **Database authentication (数据库身份验证)** 部分中的 **Password and Kerberos authentication (密码和 Kerberos 身份验证)**。选择 **Browse Directory (浏览目录)**，然后选择目录或选择 **Create a new directory (创建新目录)**。

![\[创建数据库实例时的 Kerberos 身份验证设置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/kerberos-authentication.png)


在使用控制台修改或还原数据库实例时，请在 **Kerberos authentication (Kerberos 身份验证)** 部分中选择目录，或选择 **Create a new directory (创建新目录)**。

![\[修改或还原数据库实例时的 Kerberos 身份验证设置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/kerberos-auth-modify-restore.png)


使用 AWS CLI 时，数据库实例需要以下参数才能使用您创建的目录：
+ 对于 `--domain` 参数，请使用创建目录时生成的域标识符（“d-\$1”标识符）。
+ 对于 `--domain-iam-role-name` 参数，请使用您使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 创建的角色。

例如，以下 CLI 命令会修改数据库实例以使用目录。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --domain d-ID \
    --domain-iam-role-name role-name
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier mydbinstance ^
    --domain d-ID ^
    --domain-iam-role-name role-name
```

**重要**  
如果您修改数据库实例以启用 Kerberos 身份验证，请在进行更改之后重启数据库实例。

**注意**  
*MANAGED\$1SERVICE\$1USER* 是一个服务账户，名称由 RDS 的 Directory Service 随机生成。在 Kerberos 身份验证设置期间，RDS for Oracle 会使用同一名称创建用户并为其分配 `CREATE SESSION` 权限。在外部将 Oracle 数据库用户标识为 *MANAGED\$1SERVICE\$1USER@EXAMPLE.COM*，其中 *EXAMPLE.COM* 是您的域名。RDS 会定期使用 Directory Service 提供的凭证登录 Oracle 数据库。之后，RDS 会立即销毁票证缓存。

## 步骤 7：创建 Kerberos 身份验证 Oracle 登录名
<a name="oracle-kerberos.setting-up.create-logins"></a>

使用 Amazon RDS 主用户凭证连接到 Oracle 数据库实例，就像连接到任何其他数据库实例一样。数据库实例加入到 AWS Managed Microsoft AD 域。这样，您可以根据从域中的 Microsoft Active Directory 用户预置 Oracle 登录名和用户。要管理数据库权限，可以授予和撤消这些登录的标准 Oracle 权限。

**要允许 Microsoft Active Directory 用户向 Oracle 验证身份**

1. 请使用 Amazon RDS 主用户凭证连接到 Oracle 数据库实例。

1. 在 Oracle 数据库中创建在外部验证身份的用户。

   在以下示例中，使用您的用户名和域名替换 `KRBUSER@CORP.EXAMPLE.COM`。

   ```
   CREATE USER "KRBUSER@CORP.EXAMPLE.COM" IDENTIFIED EXTERNALLY; 
   GRANT CREATE SESSION TO "KRBUSER@CORP.EXAMPLE.COM";
   ```

   域中用户（人和应用程序）现在均可使用 Kerberos 身份验证从加入域的客户端计算机连接到 Oracle 数据库实例。

## 步骤 8：配置 Oracle 客户端
<a name="oracle-kerberos.setting-up.configure-oracle-client"></a>

要配置 Oracle 客户端，请满足以下要求：
+ 创建一个名为 krb5.conf (Linux) 或 krb5.ini (Windows) 的配置文件，以指向域。将 Oracle 客户端配置为使用此配置文件。
+ 验证流量是否可以在 DNS 端口 53 上通过 TCP/UDP、在 Kerberos 端口（用于托管 Directory Service 的 88 和 464）上通过 TCP 以及在 LDAP 端口 389 上通过 TCP 在客户端主机和 Directory Service 之间进行流动。
+ 验证流量是否可以通过数据库端口在客户端主机和数据库实例之间流动。

以下是 AWS Managed Microsoft AD 的示例内容。

```
[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM = {
  kdc = example.com
  admin_server = example.com
 }
[domain_realm]
 .example.com = CORP.EXAMPLE.COM
 example.com = CORP.EXAMPLE.COM
```

以下是本地 Microsoft AD 的示例内容。在 krb5.conf 或 krb5.ini 文件中，将 *on-prem-ad-server-name* 替换为本地 AD 服务器的名称。

```
[libdefaults]
 default_realm = ONPREM.COM
[realms]
 AWSAD.COM = {
  kdc = awsad.com
  admin_server = awsad.com
 }
 ONPREM.COM = {
  kdc = on-prem-ad-server-name
  admin_server = on-prem-ad-server-name
 }
[domain_realm]
 .awsad.com = AWSAD.COM
 awsad.com= AWSAD.COM
 .onprem.com = ONPREM.COM
 onprem.com= ONPREM.COM
```

**注意**  
配置 krb5.ini 或 krb5.conf 文件后，我们建议您重启服务器。

以下是 SQL\$1Plus 配置的示例 sqlnet.ora 内容：

```
SQLNET.AUTHENTICATION_SERVICES=(KERBEROS5PRE,KERBEROS5)
SQLNET.KERBEROS5_CONF=path_to_krb5.conf_file
```

有关 SQL Developer 配置示例，请参阅 Oracle 支持网站中的[文档 1609359.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1609359.1)。