将 Managed Microsoft AD 与 Cloud SQL 结合使用

本页面介绍了使用 Cloud SQL 执行以下操作的方法:

  • 与 Managed Service for Microsoft Active Directory(也称为代管式 Microsoft AD)集成。
  • 以 AD 用户身份连接到实例。

除 SQL 身份验证外,与代管式 Microsoft AD 集成的 Cloud SQL 实例还支持 Windows 身份验证

准备工作

  1. 在 Google Cloud Console 中,选择您的项目名称
  2. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能
  3. 安装并初始化 Cloud SDK
  4. 确保您的用户帐号具有 Cloud SQL Admin 角色。转到 IAM 页面
  5. 查看集成方面的前提条件

使用 Windows 身份验证创建实例

您可以在实例创建期间与代管式 Microsoft AD 集成,从而为实例启用 Windows 身份验证。如需进行集成,请为要加入的实例选择一个网域。如果加入网域失败,则实例创建将失败。

在准备使用 Windows 身份验证创建实例时,请先查看提示以及限制和替代方案

系统支持具有公共 IP 的实例,但前提是该实例也具有专用 IP;必须为该实例启用专用 IP。然后,您可以选择使用公共 IP 或专用 IP 连接到实例,只要这两个 IP 均可用即可。

以下选项可用于创建与代管式 Microsoft AD 集成的实例。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击创建实例
  3. 点击选择 SQL Server (Choose SQL Server)。
  4. 输入实例的名称。请勿在实例名称中包含敏感信息或个人身份信息,因为此名称对外可见。无需在实例名称中包含项目 ID。此 ID 将在适当的位置(例如在日志文件中)自动创建。
  5. 'sqlserver' 用户输入密码。
  6. 为您的实例设置区域。 请参阅与 Managed Microsoft AD 集成的最佳做法
  7. 配置选项部分,设置所需的选项(但请等到身份验证选项的下一步)。
  8. 点击身份验证。用于加入代管式 Active Directory 网域的下拉菜单会列出先前在您的项目中添加的所有代管式 Microsoft AD 网域
  9. 从用于加入代管式 Active Directory 网域的下拉菜单中选择一个网域。
  10. 完成配置选项的选择后,请点击创建。Cloud SQL 会自动为您创建一个按产品、按项目的服务帐号。如果该帐号没有适当的角色,系统会提示您授予 managedidentities.sqlintegrator 角色。

gcloud

以下命令会创建一个与代管式 Microsoft AD 集成,从而启用 Windows 身份验证的实例。如需了解用于创建实例的基本命令,请参阅创建实例

gcloud 命令中指定 --active-directory-domain=DOMAIN 的参数。例如,指定以下内容:--active-directory-domain=ad.mydomain.com

下面是 gcloud 命令的原型:

gcloud beta sql instances create INSTANCE_NAME \
--database-version=EDITION \
--root-password=PASSWORD \
--active-directory-domain=DOMAIN\
--cpu=CPU \
--memory=MEMORY  \
--network=NETWORK

REST

您可以使用 REST API 创建与代管式 Microsoft AD 集成的实例。为 domain 字段指定一个网域(例如 subdomain.mydomain.com),如以下请求原型所示:

{
   "databaseVersion":"database-version",
   "name":"instance-id",
   "region":"region",
   "rootPassword":"password",
   "settings":{
      "tier":"machine-type",
      "ipConfiguration":{
         "privateNetwork":"network"
      },
      "activeDirectoryConfig":{
         "domain":"domain"
      }
   }
}

使用 Windows 身份验证更新实例

您可以更新现有实例的网域,从而更改或添加网域。

如需了解如何更新实例的一般信息,请参阅修改实例

如果某实例目前已加入代管式 Active Directory 网域,则该实例最初将退出网域,然后再加入新网域。如果更新失败,则该实例可能无法再加入任何网域。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击修改
  4. 点击身份验证加入 Active Directory 网域下拉菜单会列出先前在您的项目中添加的代管式 Microsoft AD 网域
  5. 从用于加入代管式 Active Directory 网域的下拉菜单,为您的实例选择新的(替换)网域。
  6. 点击保存以应用更改。

gcloud

以下是用于更新现有实例的命令的原型。该命令将添加或替换网域。将 --active-directory-domain=DOMAIN 传递给命令,如下所示:

gcloud beta sql instances patch INSTANCE_NAME \
--active-directory-domain=DOMAIN

REST

您可以使用 REST API 更新现有实例。在 domain 字段中指定网域,例如 subdomain.mydomain.com。以下是请求的原型:

{
   "settings":{
      "activeDirectoryConfig":{
         "domain":"domain"
      }
   }
}

从实例中移除 Windows 身份验证

您可以从现有实例中移除 Windows 身份验证,从而移除 Managed Microsoft AD 集成。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击修改
  4. 点击身份验证。用于加入代管式 Active Directory 网域的下拉菜单会列出先前在您的项目中添加的所有代管式 Microsoft AD 网域
  5. 从该下拉菜单中,为您的实例选择没有网域/稍后加入
  6. 阅读关于实例重启的消息,然后点击关闭
  7. 点击保存以应用更改。

gcloud

如需从网域中移除实例,从而移除 Windows 身份验证,请对网域使用空白值。也就是说,在您的命令中,对 --active-directory-domain 参数使用空白值,如下所示:

gcloud beta sql instances patch INSTANCE_NAME \
--active-directory-domain=

REST

使用 REST API,您可以从网域中移除实例。在 domain 字段中指定空白值,如下所示:

{
   "settings":{
      "activeDirectoryConfig":{
         "domain":""
      }
   }
}

以用户身份连接到实例

对于 Cloud SQL for SQL Server,默认用户sqlserver

将实例与 Managed Microsoft AD 集成后,您能以 sqlserver 用户身份连接到该实例,如下所示:

  1. 基于 Windows 用户或群组创建 SQL Server 登录,如下所示:

    CREATE LOGIN [domain\user_or_group] FROM WINDOWS
    
  2. 使用实例 DNS 名称通过 Windows 身份验证登录该实例。以下是要指定的实例 DNS 名称示例:

    • 如需通过专用 IP 进行连接,请使用以下实例 DNS 名称:

      private.myinstance.us-central1.myproject.cloudsql.mydomain.com
      

    • 如需通过公共 IP 进行连接,请使用以下实例 DNS 名称:

      public.myinstance.us-central1.myproject.cloudsql.mydomain.com
      

    • 如需通过 Cloud SQL Auth 代理进行连接(另请参阅下文):

      proxy.myinstance.us-central1.myproject.cloudsql.mydomain.com
      

    如果您使用实例 IP 地址,则必须将 Kerberos 客户端配置为支持 IP 主机名。在通过信任关系连接的网域中,不支持使用 IP 地址登录。

搭配使用 Cloud SQL Auth 代理与 Windows 身份验证

您可以将 Cloud SQL Auth 代理与 Managed Microsoft AD 集成结合使用。

在开始之前,请先查看:

Windows 身份验证步骤

如需了解启动 Cloud SQL Auth 代理的背景信息,请参阅启动 Cloud SQL Auth 代理

对于 Windows 身份验证,Cloud SQL Auth 代理必须在端口 1433 上运行。您可以将预定义的服务主体名称 (SPN) 条目映射到 Cloud SQL Auth 代理地址:

proxy.[instance].[location].[project].cloudsql.[domain]

在本地运行 Cloud SQL Auth 代理

如果您在本地运行 Cloud SQL Auth 代理,请使用主机文件将以下内容映射到 127.0.0.1

proxy.[instance].[location].[project].cloudsql.[domain]

例如,您可以将以下内容添加到主机文件(例如,c:\windows\system32\drivers\etc\hosts)中:

127.0.0.1 proxy.[instance].[location].[project].cloudsql.[domain]

在该示例中,您可以使用以下命令运行 Cloud SQL Auth 代理,并将其提供给 127.0.0.1:1433

cloud_sql_proxy_x64.exe -credential_file credential.json  -instances=project:name=tcp:1433

在本地运行 Cloud SQL Auth 代理

如需在本地运行 Cloud SQL Auth 代理,请按照在本地运行 Cloud SQL Auth 代理中的说明操作,但在主机文件中使用其他条目。

具体来说,例如,如果非本地主机为 MyOtherHost,您可以将以下内容添加到主机文件中:

127.0.0.1 MyOtherHost proxy.[instance].[location].[project].cloudsql.[domain]

排查客户端中的 NTLM 回退问题

如果您使用 Windows 身份验证和实例 IP 地址登录实例,则必须将 Kerberos 客户端配置为支持 IP 主机名。

NTLM 身份验证不受支持,但某些 Kerberos 客户端可能会尝试回退到该身份验证。如本部分所述,如果您尝试连接到 SQL Server Management Studio (SSMS),并且出现以下错误消息,则可能导致 NTLM 回退:

Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication. (Microsoft SQL Server, Error: 18452)

NTLM 是一组用于身份验证的 Microsoft 安全协议。另请参阅 NTLM 回退的原因

验证 Windows 客户端的 NTLM 回退

在 Windows 中,验证上述错误是否是由回退到 NTLM 引起的:

  1. 使用所需的本地凭据登录(不要使用“运行方式...”)。
  2. 打开命令提示符窗口。
  3. 运行 klist purge
  4. 在 SSMS 中,尝试通过 Windows 身份验证连接到 SQL Server。
  5. 运行 klist 并检查是否为 "MSSQLSvc/<address>:1433 @ domain" 颁发了票据。
  6. 如果没有此类票据,则错误可能是由 NTLM 回退引起的。
  7. 如果存在此类票证,请检查您的 SQL Server 驱动程序是否不强制执行 NTLM 身份验证。此外,还要检查通过组策略强制执行 NTLM 身份验证。

验证 Linux 客户端的 NTLM 回退

在 Ubuntu 16.04 中,如需验证上述错误是否由 NTLM 回退引起,请按照本部分中的步骤操作。具体步骤与其他 Linux 发行版的步骤类似。

设置 Kerberos 身份验证

  1. 设置 Kerberos 客户端:

    sudo apt-get install krb5-user
    
  2. 当系统提示您输入默认大区时,请使用大写字母输入本地域名。

  3. 运行以下命令以安装 SQL Server 命令行工具:

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
    sudo apt-get update
    sudo apt-get install mssql-tools unixodbc-dev
    

与 Windows 身份验证连接

  1. 运行 kinit 工具,如下所示:kinit <user_account>
  2. 如需通过 Windows 身份验证进行连接,请运行:/opt/mssql-tools/bin/sqlcmd -S <address>
  3. 运行 klist 命令并检查是否专门针对以下对象颁发了票据:"MSSQLSvc/<address>:1433 @ domain"
  4. 如果未颁发票据,则上述错误可能表示一个导致 NTLM 回退的问题。

NTLM 回退的原因

回退到 NTLM 是一种客户端配置错误,可能与以下条件关联:

  • 默认情况下,如果主机名是 IP 地址,Windows 不会尝试对主机进行 Kerberos 身份验证。如需从代管式网域启用 Kerberos 身份验证,请尝试此处所述的方法。当必须使用 FQDN 时,此方法不适用于本地凭据。
  • 基于外部信任的 Kerberos 身份验证不起作用。请按照此处的说明,改用林信任。
  • Kerberos 身份验证需要名称后缀路由才能查找其他林中的服务。请尝试使用此处所述的方法。
  • 如果没有为服务注册 SPN,则 Kerberos 身份验证不起作用。仅使用从 Google Cloud Console 获取的 FQDN 或 IP 地址与 Windows 身份验证连接。

本地 AD 用户:创建 Windows 登录

您可以使用本地 AD 用户创建 Windows 登录 Cloud SQL for SQL Server。

例如,您可以使用在 Google Cloud 项目的 Virtual Private Cloud (VPC) 中托管的 Windows 虚拟机上运行的 SQL Server Management Studio (SMSS) 进行连接。

对于此上下文中的 Windows 身份验证,Cloud SQL for SQL Server 仅支持 Kerberos 协议。对于基于 Kerberos 的 Windows 身份验证,客户端必须解析本地 AD 和代管式 Microsoft AD 的 DNS 名称。

配置单向或双向信任

首先,决定是使用单向还是双向信任关系

然后,按照在本地 AD 网域与代管式 Microsoft AD 网域之间建立信任的相关说明执行操作。

设置 Windows 虚拟机并创建 Windows 登录

在本地 AD 网域与代管式 Microsoft AD 网域之间建立信任之后,请完成以下步骤。为了举例说明,这些步骤使用在 Google Cloud 项目的 VPC 中托管的 Windows 虚拟机上运行的 SQL Server Management Studio (SSMS):

  1. 创建 Windows 虚拟机。
    • 使用代管式 Microsoft AD 支持的 Windows 版本创建虚拟机
    • 在托管您的 Managed Microsoft AD 网域的项目中创建虚拟机。如果有一个共享 VPC 是已获授权的网络,则还可以在其任何服务项目中创建虚拟机。
    • 在属于代管式 Microsoft AD 网域已获授权的网络并为 Cloud SQL 配置了专用服务访问通道的 VPC 网络上创建虚拟机。
  2. 将 Windows 虚拟机加入 Managed Microsoft AD 网域。
  3. 在 Windows 虚拟机上安装 SSMS
  4. 解析 VPC 网络中的本地网域。
    • 在运行 Windows 虚拟机的已获授权的网络中,按照解析针对非代管式 AD 对象的查询页面上的步骤启用本地 DNS 解析。该页面上的步骤是基于 Kerberos 的 Windows 身份验证适用于本地用户的前提条件。
  5. 为本地用户创建 Windows 登录。

    • 按照创建登录说明为本地用户创建 Windows 登录。例如,指定如下所示的命令:
    CREATE LOGIN [DOMAIN_NAME\USER_NAME] FROM WINDOWS
    
  6. 使用有关登录本地用户的应用特定说明,登录您的 Cloud SQL for SQL Server 实例。例如,如果您使用的是 SQL Server Management Studio,请参阅这些说明

如果在登录 SQL Server 实例期间出现问题,请执行以下验证:

  • 按照使用本地网域创建信任的相关说明验证本地网络和项目授权的 VPC 的防火墙配置。
  • 验证本地信任关系的名称后缀路由
  • 确认您可以从运行 SSMS 的 Windows 虚拟机执行以下 DNS 解析操作:
    • nslookup fqdn-for-managed-ad-domain
    • nslookup fqdn-for-on-premises-ad-domain
    • nslookup fqdn-for-cloud-sql-server-instance

提示

  • 系统支持具有公共 IP 的实例,但前提是该实例也具有专用 IP;必须为该实例启用专用 IP。然后,您可以选择使用公共 IP 或专用 IP 连接到实例,只要这两个 IP 均可用即可。
  • 如果您收到以下错误之一,请确认您满足集成的所有前提条件
    • “未找到每个产品、每个项目的服务帐号”
    • “权限不足,无法与 Managed Service for Microsoft Active Directory 网域集成”
  • 如果您收到“找不到网域”错误,请验证区分大小写的域名是否正确。
  • 如果 Windows 身份验证在通过信任关系进行连接的网域中失败,请验证 Windows 身份验证是否适合来自代管式网域的用户。如果适合,请执行以下操作:
    1. 确认您使用的是 DNS 名称。使用信任关系连接的网域的 IP 地址不受支持。
    2. 确保您按照使用本地网域创建信任的所有步骤操作,包括打开所有防火墙端口。
    3. 验证信任关系。
    4. 验证信任方向能否允许来自网域(通过信任关系连接)在代管式网域中进行身份验证。
    5. 验证是否在通过信任关系连接的网域上设置了名称后缀路由。
    6. 验证信任能否在不使用 Cloud SQL for SQL Server 的情况下正常工作:
      1. 创建 Windows 虚拟机。
      2. 将该虚拟机加入代管式 Microsoft AD 网域。
      3. 尝试以来自通过信任关系连接的网域的用户身份运行 NotePad 等应用。
    7. 重启客户端虚拟机并重新测试 Windows 身份验证。
  • 您可以尝试创建 SQL Server 登录,但收到以下错误:“找不到 Windows NT 用户或群组 domain\name。请再次检查该名称”。可能会发生这种情况是因为网域本地组不受支持;如果适用,请改为使用全局群组或通用群组。
  • 用户通过信任关系连接的网域发出时,SQL Server 查询可能会导致以下错误:“无法获取有关 Windows NT 群组/用户的信息”。例如,如果您要通过信任关系连接的网域创建登录,就会发生此错误。如果您授予通过信任关系连接的网域的登录权限,也会发生此错误。在这些情况下,重试操作通常会成功。如果重试失败,请关闭连接并打开新连接。
  • 如果 SQL Server 查询导致“登录来自不受信任的网域”错误,则请注意来自通过信任关系连接的网域的用户不支持 IP 地址。此外,以下操作可解决此问题:
    • 如果您使用 IP 地址将用户从代管式网域连接,请按照这些说明操作。
    • 避免使用任何代理,并始终使用相同的 DNS 名称连接到 Cloud SQL for SQL Server,即您在 Google Cloud Console 中看到的名称。
    • 完全清除现有的 Kerberos 票据。如果您的客户端最近连接到 SQL Server 实例,并且该实例已停止和启动,则可能会出现上述错误。或者,如果已停用 Windows 身份验证,然后为 SQL Server 实例重新启用,则可能会发生此错误。如果客户端使用 Windows 凭据缓存,则锁定和解锁客户端工作站,或运行 klist purge
  • 尝试启用 Windows 身份验证可能会导致错误:“此实例需要较新的创建日期,才能支持 Managed Service for Microsoft Active Directory”。注意下列事项:
    • 在 Cloud SQL 中,如果 SQL Server 实例是在 2021 年 3 月 12 日当天或之前创建的,则该实例无法与代管式 Microsoft AD 集成。
  • 尝试创建 SQL Server 实例可能会导致错误:“此实例不支持 Managed Service for Microsoft Active Directory。”如果您收到此错误,则表示该项目可能不受支持;请尝试使用其他项目。
  • 如果实例存在 Windows 身份验证问题(无论是否最近更新了此实例),请尝试退出代管式 Active Directory 网域,然后重新加入。为此,请使用更新过程退出该网域,然后重新加入。这样做不会移除数据库中任何现有通过 Windows 身份验证的用户或登录。但是,移除 Windows 身份验证会使实例重启

问题排查

点击表中的链接可查看详细信息:

错误… 可能的问题… 请尝试以下操作…
Per-product, per-project service account not found. 服务帐号名称不正确。 “服务帐号”页面上,确保您已为正确的用户项目创建服务帐号。
Insufficient permission to integrate with Managed Service for Microsoft Active Directory domain. 服务帐号缺少 managedidentities.sqlintegrator 角色。 IAM 和管理页面中,为您的服务帐号添加 managedidentities.sqlintegrator 角色。
Domain not found 网域不存在或输入有误。 确保域名正确,并且存在于相同的用户项目中。区分大小写。
The domain is busy with another operation. Please retry. 另一个 Cloud SQL 实例正在同一 代管式 Active Directory 网域上执行操作。 重试该操作。 如果对连接到同一网域的 Cloud SQL 实例执行批量更新,请限制并行执行更新的次数。
The operation completed but an update to Active Directory failed. You may experience issues with Windows Authentication on this instance, please see https://cloud.google.com/sql/docs/sqlserver/configure-ad for tips 无法对代管式 Active Directory 网域执行所需的更新。 如果 Windows 身份验证存在问题,可以尝试退出代管式 Active Directory 网域,然后重新加入。为此,请使用更新过程退出该网域,然后重新加入。这样做不会移除数据库中任何现有通过 Windows 身份验证的用户或登录。但是,移除 Windows 身份验证会使实例重启
This instance would need a more recent creation date to support Managed Service for Microsoft Active Directory. 在 Cloud SQL 中,如果 SQL Server 实例是在 2021 年 3 月 12 日当天或之前创建的,则该实例无法与代管式 Microsoft AD 集成。 尝试对 2021 年 3 月 12 日之后创建的实例执行操作。

后续步骤

  • 确认您已完全阅读概览页面,其中包括限制和不支持的功能。该页面还包含指向其他文档的链接。