为 Oracle 数据库实例设置 Kerberos - Amazon Relational Database Service

为 Oracle 数据库实例设置 Kerberos

使用 AWS Directory Service for Microsoft Active Directory(也称为 AWS Managed Microsoft AD)为 Oracle 数据库实例设置 Kerberos 身份验证。要设置 Kerberos 身份验证,请完成以下步骤:

注意

在设置过程中,RDS 会创建一个名为 managed_service_user@example.com 的 Oracle 数据库用户(其具有 CREATE SESSION 权限),其中的 example.com 即为域名。此用户对应于 Directory Service 在 Managed Active Directory 中创建的用户。RDS 会定期使用 Directory Service 提供的凭证登录 Oracle 数据库。之后,RDS 会立即销毁票证缓存。

步骤 1:使用 AWS Managed Microsoft AD 创建目录

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

创建 AWS Managed Microsoft AD 目录时,AWS Directory Service 代表您执行以下任务:

  • 在 VPC 中设置 Active Directory。

  • 使用用户名 Admin 和指定密码创建目录管理员账户。您可以使用此账户管理您的目录。

    注意

    请务必保存此密码。AWS 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 Management Console、AWS CLI 或 AWS Directory Service API 创建目录。确保打开目录安全组上的相关出站端口,以便目录可以与 Oracle 数据库实例进行通信。

使用 AWS Managed Microsoft AD 创建目录
  1. 登录 AWS Management Console,然后打开 AWS Directory Service 控制台,网址为:https://console.aws.amazon.com/directoryservicev2/

  2. 在导航窗格中,选择 Directories (目录),然后选择 Set up Directory (设置目录)

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

  4. 输入以下信息:

    目录 DNS 名称

    目录的完全限定名称,例如 corp.example.com

    目录 NetBIOS 名称

    目录的短名称,如 CORP

    目录描述

    (可选)目录的描述。

    管理员密码

    目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。

    目录管理员密码不能包含单词“admin”。此密码区分大小写,且长度必须介于 8 – 64 个字符之间。至少,它还必须包含下列四种类别中三种类别的一个字符:

    • 小写字母 (a–z)

    • 大写字母 (A–Z)

    • 数字 (0–9)

    • 非字母数字字符 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)

    确认密码

    已重新键入管理员密码。

  5. 选择下一步

  6. Networking (网络) 部分中输入以下信息,然后选择 Next (下一步)

    VPC

    目录的 VPC。在同一 VPC 中创建 Oracle 数据库实例。

    子网

    目录服务器的子网。两个子网必须位于不同的可用区。

  7. 查看目录信息并进行必要的更改。如果信息正确,请选择 Create directory (创建目录)

    创建过程中的目录详细信息页面

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

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

“目录详细信息”页面

步骤 2:创建信任

如果您计划仅使用 AWS Managed Microsoft AD,请转到步骤 3:配置 Amazon RDS 的 IAM 权限

要使用自行管理的 Active Directory 启用 Kerberos 身份验证,您必须在自行管理的 Active Directory 与在上一步中创建的 AWS Managed Microsoft AD 之间创建林信任关系。信任可以是单向的,其中 AWS Managed Microsoft AD 信任自行管理的 Active Directory。信任也可以是双向的,此时两个 Active Directory 相互信任。有关使用 AWS Directory Service 设置林信任的更多信息,请参阅 AWS Directory Service 管理指南 中的何时创建信任关系

步骤 3:配置 Amazon RDS 的 IAM 权限

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

注意

为了让角色允许访问,AWS Security Token Service(AWS STS)端点必须在您的 AWS 账户的正确 AWS 区域中激活。AWS STS 端点原定设置为在所有 AWS 区域中保持活跃,您无需执行任何进一步操作即可使用它们。有关更多信息,请参阅《IAM 用户指南》中的在 AWS 区域中激活和停用 AWS STS

创建 IAM 角色

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

有关为服务创建 IAM 角色的更多信息,请参阅 IAM 用户指南中的创建向AWS服务委托权限的角色

注意

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

手动创建 IAM 信任策略

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

要限制 Amazon RDS 为其他服务提供对资源的权限,我们建议在资源策略中使用 aws:SourceArnaws:SourceAccount 全局条件上下文键。防范混淆代理问题最有效的方法是使用 aws:SourceArn 全局条件上下文键和 Amazon RDS 资源的完整 ARN。有关更多信息,请参阅 防范跨服务混淆代理问题

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

{ "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 形式包含该区域的服务主体。例如,在非洲(开普敦)区域中,使用以下信任策略:

{ "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。

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

步骤 4:创建和配置用户

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

要在 AWS Directory Service 目录中创建用户和组,您必须连接到属于 AWS Directory Service 目录成员的 Windows Amazon EC2 实例。同时,您必须以具有创建用户权限的用户身份登录。有关在 Microsoft Active Directory 中创建用户的更多信息,请参阅 AWS Managed Microsoft AD 管理指南中的管理 AWS Directory Service 中的用户和组

步骤 5:在目录和数据库实例之间启用跨 VPC 流量

如果您打算将目录和数据库实例放在同一 VPC 中,请跳过该步骤,然后转到步骤 6:创建或修改 Oracle 数据库实例

如果您计划在不同AWS账户或 VPC 中查找目录和数据库实例,请使用 VPC 对等连接或AWS Transit Gateway 配置跨 VPC 流量。以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 Amazon Virtual Private Cloud 对等连接指南中的什么是 VPC 对等连接?操作。

使用 VPC 对等连接启用跨 VPC 流量
  1. 设置适合的 VPC 路由规则,以便确保网络流量可以双向流动。

  2. 确保数据库实例的安全组可以从目录的安全组接收入站流量。有关更多信息,请参阅 AWS Managed Microsoft AD 管理指南 中的 AWS Directory Service 最佳实践

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

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

在 AWS 账户之间共享目录
  1. 按照 AWS 管理指南中的教程:共享 AWS Managed Microsoft AD 目录以实现无缝 EC2 域加入中的说明,开始与将要在其中创建数据库实例的 AWS Directory Service 账户共享目录。

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

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

步骤 6:创建或修改 Oracle 数据库实例

创建或修改 Oracle 数据库实例,以便与您的目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作:

只有 VPC 中的 Oracle 数据库实例才支持 Kerberos 身份验证。数据库实例可以与目录在同一 VPC 中或在不同 VPC 中。创建或修改数据库实例时,请执行以下操作:

  • 请提供创建目录时生成的域标识符(d-* 标识符)。

  • 还要提供您创建的 IAM 角色的名称。

  • 确保数据库实例安全组可以从目录安全组接收入站流量并将出站流量发送到目录。

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

创建数据库实例时的 Kerberos 身份验证设置

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

修改或还原数据库实例时的 Kerberos 身份验证设置

使用 AWS CLI 时,数据库实例需要以下参数才能使用您创建的目录:

  • 对于 --domain 参数,请使用创建目录时生成的域标识符(“d-*”标识符)。

  • 对于 --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_SERVICE_USER 是一个服务账户,名称由 RDS 的 Directory Service 随机生成。在 Kerberos 身份验证设置期间,RDS for Oracle 会使用同一名称创建用户并为其分配 CREATE SESSION 权限。在外部将 Oracle 数据库用户标识为 MANAGED_SERVICE_USER@EXAMPLE.COM,其中 EXAMPLE.COM 是您的域名。RDS 会定期使用 Directory Service 提供的凭证登录 Oracle 数据库。之后,RDS 会立即销毁票证缓存。

步骤 7:创建 Kerberos 身份验证 Oracle 登录名

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

要允许 Microsoft Active Directory 用户向 Oracle 验证身份
  1. 请使用 Amazon RDS 主用户凭证连接到 Oracle 数据库实例。

  2. 在 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 客户端

要配置 Oracle 客户端,请满足以下要求:

  • 创建一个名为 krb5.conf (Linux) 或 krb5.ini (Windows) 的配置文件,以指向域。将 Oracle 客户端配置为使用此配置文件。

  • 验证流量是否可以在 DNS 端口 53 上通过 TCP/UDP、在 Kerberos 端口(用于托管 AWS Directory Service 的 88 和 464)上通过 TCP 以及在 LDAP 端口 389 上通过 TCP 在客户端主机和 AWS 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*Plus 配置的示例 sqlnet.ora 内容:

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

有关 SQL Developer 配置示例,请参阅 Oracle 支持网站中的文档 1609359.1