对 Amazon RDS for Microsoft SQL Server 使用 Kerberos 身份验证
当用户连接到 MySQL 数据库实例时,您可以使用 Kerberos 身份验证来验证用户的身份。数据库实例与 AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD) 配合使用以启用 Kerberos 身份验证。当用户在加入信任域的 MySQL 数据库实例中进行身份验证时,将转发身份验证请求。转发的请求将转到您使用 AWS Directory Service 创建的域目录。
将所有凭证保存在同一目录中可以节省您的时间和精力。使用这种方法,您具有一个集中位置用于存储和管理多个数据库实例的凭证。使用目录还可以改善您的整体安全概要。
区域和版本可用性
功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关使用 Kerberos 身份验证的 Amazon RDS 的版本和区域可用性的更多信息,请参阅支持 Amazon RDS 中 Kerberos 身份验证功能的区域和数据库引擎。
为 MySQL 数据库实例设置 Kerberos 身份验证概述
要为 MySQL 数据库实例设置 Kerberos 身份验证,请完成以下一般步骤,稍后将详细介绍这些步骤:
-
使用 AWS Managed Microsoft AD 创建 AWS Managed Microsoft AD 目录。您可以使用 AWS Management Console、AWS CLI 或 AWS Directory Service 创建目录。有关执行此操作的详细信息,请参阅 AWS Directory Service 管理指南中的创建 AWS Managed Microsoft AD 目录。
-
创建使用托管式 IAM 策略
AmazonRDSDirectoryServiceAccess
的 AWS Identity and Access Management(IAM)角色。此角色允许 Amazon RDS 调用您的目录。为了让角色允许访问,AWS Security Token Service (AWS STS) 端点必须在您的 AWS 账户的 AWS 区域中激活。AWS STS 端点原定设置为在所有 AWS 区域中保持活跃,且您无需任何进一步动作即可使用它们。有关更多信息,请参阅《IAM 用户指南》中的在 AWS 区域中激活和停用 AWS STS。
-
使用 Microsoft Active Directory 工具在 AWS Managed Microsoft AD 目录中创建和配置用户。有关在 Active Directory 中创建用户的更多信息,请参阅 AWS 管理指南中的在 AWS Directory Service 托管式 Microsoft AD 中管理用户和组。
-
创建或修改 MySQL 数据库实例。如果您在创建请求中使用 CLI 或 RDS API,请使用
Domain
参数指定域标识符。使用在创建目录时生成的d-*
标识符和您创建的角色的名称。如果您将现有 MySQL 数据库实例修改为使用 Kerberos 身份验证,请为数据库实例设置域和 IAM 角色参数。在与域目录相同的 VPC 中查找数据库实例。
-
使用 Amazon RDS 主用户凭证连接到 MySQL 数据库实例。使用
CREATE USER
子句IDENTIFIED WITH 'auth_pam'
在 MySQL 中创建用户。您以此方式创建的用户可以使用 Kerberos 身份验证登录到 MySQL 数据库实例。
为 MySQL 数据库实例设置 Kerberos 身份验证
您可以使用 AWS Managed Microsoft AD 为 MySQL 数据库实例设置 Kerberos 身份验证。要设置 Kerberos 身份验证,请执行以下步骤。
步骤 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 Managed Microsoft AD 创建目录
-
登录 AWS Management Console,然后打开 AWS Directory Service 控制台,网址为:https://console.aws.amazon.com/directoryservicev2/
。 -
在导航窗格中,选择 Directories (目录),然后选择 Set up Directory (设置目录)。
-
选择 AWS Managed Microsoft AD。AWS Managed Microsoft AD 是当前唯一可以与 Amazon RDS 一起使用的选项。
-
输入以下信息:
- 目录 DNS 名称
-
目录的完全限定名称,例如
corp.example.com
。 - 目录 NetBIOS 名称
-
目录的短名称,如
CORP
。 - 目录描述
-
(可选)目录的描述。
- 管理员密码
-
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。
目录管理员密码不能包含单词“admin”。此密码区分大小写,且长度必须介于 8 – 64 个字符之间。至少,它还必须包含下列四种类别中三种类别的一个字符:
-
小写字母 (a–z)
-
大写字母 (A–Z)
-
数字 (0–9)
-
非字母数字字符 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)
-
- 确认密码
-
已重新键入管理员密码。
-
选择下一步。
-
在 Networking (网络) 部分中输入以下信息,然后选择 Next (下一步):
- VPC
-
目录的 VPC。在同一 VPC 中创建 MySQL 数据库实例。
- 子网
-
目录服务器的子网。两个子网必须位于不同的可用区。
-
查看目录信息并进行必要的更改。如果信息正确,请选择 Create directory (创建目录)。
目录创建需要几分钟时间。创建成功后,Status (状态) 值将更改为 Active (活动)。
要查看有关您的目录的信息,请在目录列表中选择目录名称。请记下 Directory ID (目录 ID) 值,因为您在创建或修改 MySQL 数据库实例时需要此值。
步骤 2:创建 Amazon RDS 使用的 IAM 角色
要使 Amazon RDS 为您调用 AWS Directory Service,需要使用托管 IAM 策略 AmazonRDSDirectoryServiceAccess
的 IAM 角色。该角色允许 Amazon RDS 调用 AWS Directory Service。
使用 AWS Management Console 创建数据库实例并且控制台用户具有 iam:CreateRole
权限时,控制台将自动创建此角色。在这种情况下,角色名为 rds-directoryservice-kerberos-access-role
。否则,您必须手动创建 IAM 角色。在创建该 IAM 角色时,请选择 Directory Service
,然后将 AWS 托管策略 AmazonRDSDirectoryServiceAccess
附加到该角色。
有关为服务创建 IAM 角色的更多信息,请参阅 IAM 用户指南中的创建向AWS服务委托权限的角色。
注意
用于 RDS for SQL Server 的 Windows 身份验证的 IAM 角色不能用于 RDS for MySQL。
或者,您可以创建具有所需权限的角色,而不是使用托管 IAM 策略 AmazonRDSDirectoryServiceAccess
。在这种情况下,IAM 角色必须具有以下 IAM 信任策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "directoryservice.rds.amazonaws.com", "rds.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
角色还必须具有以下 IAM 角色策略。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ds:DescribeDirectories", "ds:AuthorizeApplication", "ds:UnauthorizeApplication", "ds:GetAuthorizedApplicationDetails" ], "Effect": "Allow", "Resource": "*" } ] }
步骤 3:创建和配置用户
您可以使用“Active Directory 用户和计算机”工具创建用户。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具的一部分。用户表示有权访问您的目录的独立个人或实体。
要在 AWS Directory Service 目录中创建用户,您必须连接到基于 Microsoft Windows 的 Amazon EC2 实例。此实例必须是 AWS Directory Service 目录的成员,并以具有创建用户权限的用户身份登录。有关更多信息,请参阅AWS Managed Microsoft AD Directory Service 管理指南中的管理 AWS 中的用户和组。
步骤 4:创建或修改 MySQL 数据库实例
创建或修改 MySQL 数据库实例,以便与目录一起使用。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作:
-
使用控制台、create-db-instance CLI 命令或 CreateDBInstance RDS API 操作创建新的 MySQL 数据库实例。
有关说明,请参阅创建 Amazon RDS 数据库实例。
-
使用控制台、modify-db-instance CLI 命令或 ModifyDBInstance RDS API 操作修改现有 MySQL 数据库实例。
有关说明,请参阅修改 Amazon RDS 数据库实例。
-
使用控制台、restore-db-instance-from-db-snapshot CLI 命令或 RestoreDBInstanceFromDBSnapshot RDS API 操作,从数据库快照还原 MySQL 数据库实例。
有关说明,请参阅还原到数据库实例。
-
使用控制台、restore-db-instance-to-point-in-time CLI 命令或 RestoreDBInstanceToPointInTime RDS API 操作,将 MySQL 数据库实例还原到某个时间点。
有关说明,请参阅将 Amazon RDS 的数据库实例还原到指定时间。
只有 VPC 中的 MySQL 数据库实例才支持 Kerberos 身份验证。数据库实例可以与目录在同一 VPC 中或在不同 VPC 中。数据库实例必须使用允许在目录的 VPC 中传出的安全组,以便数据库实例可与目录通信。
在使用控制台创建、修改或还原数据库实例时,请选择数据库身份验证部分中的密码和 Kerberos 身份验证。选择 Browse Directory (浏览目录),然后选择目录或选择 Create a new directory (创建新目录)。
使用 AWS CLI 或 RDS API 时,将数据库实例与目录关联。数据库实例需要以下参数才能使用您创建的域目录:
-
对于
--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-namerole-name
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
mydbinstance
^ --domain d-ID
^ --domain-iam-role-namerole-name
重要
如果您修改数据库实例以启用 Kerberos 身份验证,请在进行更改之后重启数据库实例。
步骤 5:创建 Kerberos 身份验证 MySQL 登录名
使用 Amazon RDS 主用户凭证连接到 MySQL 数据库实例,就像连接到任何其他数据库实例一样。数据库实例加入到 AWS Managed Microsoft AD 域。这样,您可以从您域中的 Active Directory 用户预配置 MySQL 登录名和用户。数据库权限是通过授予这些登录名并从这些登录名撤消的标准 MySQL 权限来管理的。
您可以允许 Active Directory 用户使用 MySQL 进行身份验证。为此,首先使用 Amazon RDS 主用户凭证连接到 MySQL 数据库实例,就像连接到任何其他数据库实例一样。登录之后,通过运行以下命令,在 MySQL 中使用 PAM(可插入身份验证模块),创建在外部进行身份验证的用户。将
替换为用户名。testuser
CREATE USER '
testuser
'@'%' IDENTIFIED WITH 'auth_pam';
域中用户(人和应用程序)现在均可从联接域的客户端计算机使用 Kerberos 身份验证连接到数据库实例。
重要
我们强烈建议客户端在使用 PAM 身份验证时使用 SSL/TLS 连接。如果不使用 SSL/TLS 连接,在某些情况下密码可能会以明文形式发送。要为您的 AD 用户要求 SSL/TLS 加密的连接,请运行以下命令,并将
替换为用户名:testuser
ALTER USER '
testuser
'@'%' REQUIRE SSL;
有关更多信息,请参阅 Amazon RDS 上 MySQL 数据库实例的 SSL/TLS 支持。
在域中管理数据库实例
您可以使用 CLI 或 RDS API 来管理您的数据库实例及其与托管的 Active Directory 的关系。例如,您可以关联一个 Active Directory 以进行 Kerberos 身份验证,并取消关联一个 Active Directory 以禁用 Kerberos 身份验证。您也可以将由一个 Active Directory 在外部进行身份验证的数据库实例移到另一个 Active Directory。
例如,使用 Amazon RDS API,您可以执行下列操作:
-
要重新尝试为失败的成员启用 Kerberos 身份验证,请使用
ModifyDBInstance
API 操作并指定当前成员的目录 ID。 -
要为成员资格更新 IAM 角色名称,请使用
ModifyDBInstance
API 操作并指定当前成员资格的目录 ID 和新的 IAM 角色。 -
要在数据库实例上禁用 Kerberos 身份验证,请使用
ModifyDBInstance
API 操作并指定none
作为域参数。 -
要将数据库实例从一个域移至另一个域,请使用
ModifyDBInstance
API 操作并指定新域的域标识符作为域参数。 -
要列出每个数据库实例的成员资格,请使用
DescribeDBInstances
API 操作。
了解域成员资格
在创建或修改数据库实例后,它将成为域的成员。您可以通过运行 describe-db-instances CLI 命令来查看数据库实例的域成员身份状态。数据库实例的状态可以是以下状态之一:
-
kerberos-enabled
– 数据库实例已启用 Kerberos 身份验证。 -
enabling-kerberos
– AWS 正在此数据库实例上启用 Kerberos 身份验证。 -
pending-enable-kerberos
– 启用 Kerberos 身份验证正在此数据库实例上等待处理。 -
pending-maintenance-enable-kerberos
– AWS将尝试在下一个计划的维护时段在数据库实例上启用 Kerberos 身份验证。 -
pending-disable-kerberos
– 禁用 Kerberos 身份验证正在此数据库实例上等待处理。 -
pending-maintenance-disable-kerberos
– AWS将尝试在下一个计划的维护时段在数据库实例上禁用 Kerberos 身份验证。 -
enable-kerberos-failed
– 出现一个配置问题,导致AWS无法在数据库实例上启用 Kerberos 身份验证。在重新发出数据库实例修改命令之前检查并修复配置。 -
disabling-kerberos
– AWS 正在此数据库实例上禁用 Kerberos 身份验证。
启用 Kerberos 身份验证的请求可能因网络连接问题或不正确的 IAM 角色而失败。例如,假设您创建数据库实例或修改现有数据库实例,但启用 Kerberos 身份验证的尝试失败。如果发生这种情况,请重新发出修改命令或修改新创建的数据库实例以加入域。
使用 Kerberos 身份验证连接到 MySQL
要使用 Kerberos 身份验证连接到 MySQL,您必须使用 Kerberos 身份验证类型进行登录。
要创建可以使用 Kerberos 身份验证连接到的数据库用户,请在 IDENTIFIED
WITH
语句上使用 CREATE USER
子句。有关说明,请参阅步骤 5:创建 Kerberos 身份验证 MySQL 登录名。
为避免发生错误,请使用 MariaDB mysql
客户端。您可以在 https://downloads.mariadb.org/
在命令提示符下,连接到其中一个与 MySQL 数据库实例关联的终端节点。按照 连接到运行 MySQL 数据库引擎的数据库实例中的常规过程进行操作。当系统提示您输入密码时,请输入与该用户名关联的 Kerberos 密码。
还原 MySQL 数据库实例并将其添加到域中
您可还原数据库快照或为 MySQL 数据库实例完成时间点还原,然后将其添加到域中。数据库实例还原后,使用 步骤 4:创建或修改 MySQL 数据库实例 中介绍的过程修改此实例以将数据库实例添加到域中。
Kerberos 身份验证 MySQL 限制
以下限制适用于 MySQL 的 Kerberos 身份验证:
-
仅支持 AWS Managed Microsoft AD。但是,您可以将 RDS for MySQL 数据库实例加入到同一 AWS 区域中不同账户拥有的共享托管式 Microsoft AD 域。
-
启用该功能后,您必须重启数据库实例。
-
域名长度不能超过 61 个字符。
-
您无法同时启用 Kerberos 身份验证和 IAM 身份验证。为 MySQL 数据库实例选择一种或另一种身份验证方法。
-
启用该功能后,请勿修改数据库实例端口。
-
请勿将 Kerberos 身份验证与只读副本一起使用。
-
如果您为使用 Kerberos 身份验证的 MySQL 数据库实例启用了自动次要版本升级,则必须关闭 Kerberos 身份验证,然后在自动升级结束后将该功能重新打开。有关自动升级次要版本的更多信息,请参阅 RDS for MySQL 的自动次要版本升级。
-
要删除启用此功能的数据库实例,请先禁用该功能。为此,请对数据库实例使用
modify-db-instance
CLI 命令并为--domain
参数指定none
。如果您使用 CLI 或 RDS API 删除启用此功能的数据库实例,则预期会发生延迟。
-
RDS for MySQL 不支持跨本地或自托管 AD 与 AWS Managed Microsoft AD 之间的林信任进行 Kerberos 身份验证。