本页面介绍了如何使用客户管理的 Microsoft Active Directory(也称为客户管理的 AD [CMAD]):
- 将 Cloud SQL for SQL Server 与 CMAD 集成。
- 以 Active Directory (AD) 用户身份连接到实例。
除 SQL 身份验证外,与 CMAD 集成的 Cloud SQL 实例还支持 Windows 身份验证。
准备工作
- 在 Google Cloud 控制台中,选择您的项目名称。
- 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能。
- 安装并初始化 gcloud CLI。
- 确保您的用户账号具有 Cloud SQL Admin 角色。 前往 Identity and Access Management (IAM) 页面。
- 查看集成方面的前提条件。
- 验证 Active Directory 复制是否正常运行。如果未正确实现,您可能会遇到 CMAD 集成问题。
使用 Windows 身份验证创建实例
您可以在实例创建期间与 CMAD 集成,从而为实例启用 Windows 身份验证。如需进行集成,请为要加入的实例选择一个网域。如果加入网域失败,则实例创建将失败。
在准备使用 Windows 身份验证创建实例时,请先查看提示以及限制和替代方案。
虽然您可以选择使用公共 IP,但 Cloud SQL 实例还必须能够访问专用 IP。
使用以下任一选项创建与 CMAD 集成的实例,从而启用 Windows 身份验证。如需了解用于创建实例的基本命令,请参阅创建实例。
gcloud
如需创建具有 CMAD 的实例,请运行以下命令:
gcloud sql instances create INSTANCE_NAME \ --database-version=DATABASE_VERSION \ --root-password=PASSWORD \ --active-directory-domain=DOMAIN \ --active-directory-mode=CUSTOMER_MANAGED_ACTIVE_DIRECTORY \ --active-directory-organizational-unit="OU=CLOUD_OU,DC=DC1,DC=DC2" \ --active-directory-secret-manager-key=projects/PROJECT_ID/secrets/SECRET_NAME \ --active-directory-dns-servers=IP1,IP2 \ --cpu=CPU \ --memory=MEMORY \ --network=NETWORK
替换以下内容:
- INSTANCE_NAME:您要创建的 Cloud SQL for SQL Server 实例的名称。
- DATABASE_VERSION:您要使用的数据库版本,例如
SQLSERVER_2019_STANDARD。 - DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例将驻留的项目 ID。
- SECRET_NAME:您要使用的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。 - CPU:您要为实例分配的 CPU 数量。
- MEMORY:是您要分配给实例的内存量。
- NETWORK:是您的实例将连接到的网络的名称,例如
projects/my-gcp-project-123/global/networks/my-production-vpc。
REST v1
如需创建具有 CMAD 的实例,请使用 POST 请求和 users:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
替换以下内容:
- DATABASE_VERSION:您要使用的数据库版本,例如
SQLSERVER_2019_STANDARD。 - INSTANCE_NAME:您要创建的 Cloud SQL for SQL Server 实例的名称。
- REGION:您希望实例所在的区域,例如
us-central1。 - PASSWORD:实例的密码。
- MACHINE_TYPE:您要用于实例的机器类型,例如
db-n1-standard-8。 - NETWORK:是您的实例将连接到的网络的名称,例如
projects/my-gcp-project-123/global/networks/my-production-vpc。 - DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例将驻留的项目 ID。
- SECRET_NAME:您要使用的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"databaseVersion":"DATABASE_VERSION",
"name":"INSTANCE_NAME",
"region":"REGION",
"rootPassword":"PASSWORD",
"settings":{
"tier":"MACHINE-TYPE",
"ipConfiguration":{
"privateNetwork":"NETWORK"
},
"activeDirectoryConfig":{
"domain":"DOMAIN"
"mode": "CUSTOMER_MANAGED_ACTIVE_DIRECTORY",
"organizational_unit":"OU=CLOUDOU,DC=DC1,DC=DC2"
"admin_credential_secret_name":"projects/PROJECT_ID/secrets/SECRET_NAME"
"dns_servers":"IP1,IP2"
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_NAME",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
如需创建具有 CMAD 的实例,请使用 POST 请求和 users:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
替换以下内容:
- DATABASE_VERSION:您要使用的数据库版本,例如
SQLSERVER_2019_STANDARD。 - INSTANCE_NAME:您要创建的 Cloud SQL for SQL Server 实例的名称。
- REGION:您希望实例所在的区域,例如
us-central1。 - PASSWORD:实例的密码。
- MACHINE_TYPE:您要用于实例的机器类型,例如
db-n1-standard-8。 - NETWORK:是您的实例将连接到的网络的名称,例如
projects/my-gcp-project-123/global/networks/my-production-vpc。 - DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例将驻留的项目 ID。
- SECRET_NAME:您要使用的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"databaseVersion":"DATABASE_VERSION",
"name":"INSTANCE_NAME",
"region":"REGION",
"rootPassword":"PASSWORD",
"settings":{
"tier":"MACHINE-TYPE",
"ipConfiguration":{
"privateNetwork":"NETWORK"
},
"activeDirectoryConfig":{
"domain":"DOMAIN"
"mode": "CUSTOMER_MANAGED_ACTIVE_DIRECTORY",
"organizational_unit":"OU=CLOUDOU,DC=DC1,DC=DC2"
"admin_credential_secret_name":"projects/PROJECT_ID/secrets/SECRET_NAME"
"dns_servers":"IP1,IP2"
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_NAME",
"selfLink": "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
使用 Windows 身份验证更新实例
您可以更新现有实例的网域,例如更改或添加网域。
如需了解如何更新实例的一般信息,请参阅修改实例。
如果某实例目前已加入 CMAD 网域,则该实例最初将退出网域,然后再加入新网域。如果更新失败,则该实例可能无法再加入任何网域。
gcloud
以下是用于更新现有实例的命令示例。该命令将添加或替换网域。将 --active-directory-domain=DOMAIN 传递给命令,如下所示:
gcloud sql instances patch INSTANCE_NAME \ --active-directory-domain=DOMAIN \ --active-directory-mode=CUSTOMER_MANAGED_ACTIVE_DIRECTORY \ --active-directory-organizational-unit="OU=CLOUDOU,DC=DOMAIN,DC=COM" \ --active-directory-secret-manager-key=projects/PROJECT_ID/secrets/SECRET_NAME \ --active-directory-dns-servers=IP1,IP2
替换以下内容:
- INSTANCE_NAME:要更新的 Cloud SQL for SQL Server 实例的名称。
- DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例所在的项目 ID。
- SECRET_NAME:是与实例关联的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
REST v1
如需更新 CMAD 实例,请使用 PATCH 请求和 users:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
- DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例所在的项目 ID。
- SECRET_NAME:是与实例关联的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings":{
"activeDirectoryConfig":{
"domain":"DOMAIN"
"mode": "CUSTOMER_MANAGED_ACTIVE_DIRECTORY",
"organizational_unit":"OU=CLOUDOU,DC=DC1,DC=DC2"
"admin_credential_secret_name":"projects/PROJECT_ID/secrets/SECRET_NAME"
"dns_servers":"IP1,IP2"
}
}
}如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"operationType": "UPDATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
如需更新 CMAD 实例,请使用 PATCH 请求和 users:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
- DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例所在的项目 ID。
- SECRET_NAME:是与实例关联的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings":{
"activeDirectoryConfig":{
"domain":"DOMAIN"
"mode": "CUSTOMER_MANAGED_ACTIVE_DIRECTORY",
"organizational_unit":"OU=CLOUDOU,DC=DC1,DC=DC2"
"admin_credential_secret_name":"projects/PROJECT_ID/secrets/SECRET_NAME"
"dns_servers":"IP1,IP2"
}
}
}如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"operationType": "UPDATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
在 Managed Service for Microsoft Active Directory 和 CMAD 之间迁移
如需将实例从与托管式 Microsoft AD 的集成迁移到与 CMAD 的集成,请使用以下 gcloud CLI 命令:
gcloud sql instances patch INSTANCE_NAME \ --active-directory-domain=DOMAIN \ --active-directory-mode=CUSTOMER_MANAGED_ACTIVE_DIRECTORY \ --active-directory-organizational-unit="OU=CLOUDOU,DC=DOMAIN,DC=COM" \ --active-directory-secret-manager-key=projects/PROJECT_ID/secrets/SECRET_NAME \ --active-directory-dns-servers=IP1,IP2
替换以下内容:
- INSTANCE_NAME:您要修改的 Cloud SQL for SQL Server 实例的名称。
- DOMAIN:您要使用的域名,例如
myaddomain.com。 - CUSTOMER_MANAGED_ACTIVE_DIRECTORY:表示网域的模式。如果网域由 Google 创建并归 Google 所有,请输入
MANAGED_ACTIVE_DIRECTORY。 如果网域是由用户创建并归用户所有,则输入CUSTOMER_MANAGED_ACTIVE_DIRECTORY。 - CLOUD_OU:是您要使用的组织部门的名称。
例如
CLOUDOU。您可以根据需要输入任意数量的组织部门。 - DC1:是用于组织部门专有名称的第一个网域组成部分。例如
DOMAIN。您可以根据需要输入任意数量的网域组成部分。 - DC2:是用于组织部门专有名称的第二个网域组成部分。例如
COM。--active-directory-organizational-unit标志的完整值可能如下所示:"OU=CLOUDOU,DC=DOMAIN,DC=COM"。您可以根据需要输入任意数量的网域组成部分。 - PROJECT_ID:是实例所在的项目 ID。
- SECRET_NAME:是与实例关联的密文。
- IP1:是您要使用的第一个 DNS 服务器的 IP 地址,例如
10.20.30.40。您可以根据需要输入任意数量的 IP 地址。 - IP2:是您要使用的第二个 DNS 服务器的 IP 地址,例如
20.30.40.50。您可以根据需要输入任意数量的 IP 地址。
以用户身份连接到实例
对于 Cloud SQL for SQL Server,默认用户为 sqlserver。
将实例与 CMAD 集成后,您能以 sqlserver 用户身份连接到该实例,如下所示:
- 基于 Windows 用户或群组创建 SQL Server 登录,如下所示:
CREATE LOGIN [domain\user_or_group] FROM WINDOWS
- 使用实例 DNS 名称通过 Windows 身份验证登录该实例。要指定的实例 DNS 名称示例包括:
- 显示了通过专用 IP 进行连接的示例:
private.myinstance.us-central1.myproject.cloudsql.mydomain.com
- 显示了通过公共 IP 进行连接的示例:
public.myinstance.us-central1.myproject.cloudsql.mydomain.com
- 显示了通过 Cloud SQL Auth 代理进行连接的示例:
proxy.myinstance.us-central1.myproject.cloudsql.mydomain.com
如需了解详情,请参阅搭配使用 Cloud SQL Auth 代理与 Windows 身份验证。
- 显示了通过专用 IP 进行连接的示例:
如果您使用实例 IP 地址,则必须配置 Kerberos 客户端以支持 IP 主机名。Cloud SQL 不支持使用通过信任关系连接的网域中的 IP 地址登录。
搭配使用 Cloud SQL Auth 代理与 Windows 身份验证
您可以将 Cloud SQL Auth 代理与 CMAD 集成结合使用。
在开始之前,请查看以下内容:
Windows 身份验证步骤
如需了解启动 Cloud SQL Auth 代理的背景信息,请参阅启动 Cloud SQL Auth 代理。
对于 Windows 身份验证,您必须在端口 1433 上运行 Cloud SQL Auth 代理。 如需将预定义的服务主账号名称 (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.exe --credentials-file credential.json project:name
不在本地运行 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 主机名。
Cloud SQL 不支持 NTLM 身份验证,但某些 Kerberos 客户端可能会尝试回退到该身份验证方法。如本部分所述,如果您尝试连接到 SQL Server Management Studio (SSMS),并且出现以下错误消息,则可能导致 NTLM 回退:
NTLM 是一组用于身份验证的 Microsoft 安全协议。如需了解详情,请参阅 NTLM 回退的原因。
验证 Windows 客户端的 NTLM 回退
在 Windows 终端中,如需验证 NTLM 回退是否引发了错误,请完成以下操作:
- 使用所需的本地凭证登录。请勿使用
"Run as..."命令。 - 打开命令提示符窗口。
- 运行
klist purge。 - 在 SSMS 中,尝试通过 Windows 身份验证连接到 SQL Server。
- 运行
klist并检查是否为返回的错误颁发了票据, - 如果没有此类票据,则该错误可能是 NTLM 回退导致的。
- 如果存在此类票证,请检查您的 SQL Server 驱动程序是否不强制执行 NTLM 身份验证。此外,还要检查是否通过组策略强制执行 NTLM 身份验证。
验证 Linux 客户端的 NTLM 回退
在 Ubuntu 16.04 中,如需验证 NTLM 回退是否引发了错误,请按照本部分中的步骤操作。具体步骤与其他 Linux 发行版的步骤类似。
设置 Kerberos 身份验证
- 设置 Kerberos 客户端:
sudo apt-get install krb5-user
- 当系统提示您输入默认大区时,请使用大写字母输入本地域名。
- 运行以下命令以安装 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 身份验证连接
- 运行 kinit 工具,如下所示:
kinit
- 如需使用 Windows 身份验证进行连接,请运行以下命令:
/opt/mssql-tools/bin/sqlcmd -S
- 运行 klist 命令并检查是否专门针对以下返回的消息颁发了票据:
MSSQLSvc/:1433 @ domain
- 如果未颁发票据,则上述错误可能表示一个导致 NTLM 回退的问题。
NTLM 回退的原因
回退到 NTLM 是一种客户端配置错误,可能与以下条件关联:
- 默认情况下,如果主机名是 IP 地址,Windows 不会尝试对主机进行 Kerberos 身份验证。如需为 IP 地址启用 Kerberos 身份验证,请尝试 Microsoft 文档中介绍的方法。
- 基于外部信任的 Kerberos 身份验证不起作用。 请改用林信任。
- Kerberos 身份验证需要名称后缀路由才能查找其他林中的服务。请尝试使用在两个网域之间设置信任关系中所述的方法。
- 如果没有为服务注册 SPN,则 Kerberos 身份验证不起作用。仅使用从 Google Cloud 控制台获取的 FQDN 或 IP 地址建立 Windows 身份验证连接。
为本地 AD 用户创建 Windows 登录
按照CREATE LOGIN 说明为本地用户创建 Windows 登录。例如,指定如下所示的命令:
CREATE LOGIN [DOMAIN_NAME\USER_NAME] FROM WINDOWS
将 CMAD 与 Cloud SQL 结合使用的提示
- 系统支持具有公共 IP 的实例,但前提是该实例也具有专用 IP。必须为实例启用专用 IP。然后,您可以选择使用公共 IP 或专用 IP 连接到实例,只要这两个 IP 均可用即可。
- 在创建实例(包括作为替换实例)之前,请查看以下内容:
- 如果 Windows 身份验证在通过信任关系进行连接的网域中失败,请验证 Windows 身份验证是否适合来自客户管理的网域的用户。如果符合,请完成以下步骤:
- 确认您使用的是 DNS 名称。使用信任关系连接的网域的 IP 地址不受支持。
- 确保您已完成设置两个网域之间的信任关系中的所有步骤,包括打开所有防火墙端口。
- 验证信任关系。
- 验证信任方向能否允许来自网域(通过信任关系连接)的用户进行身份验证。
- 按照为目录同步准备不可路由的网域中所述的步骤操作。
- 验证信任能否在不使用 Cloud SQL for SQL Server 的情况下正常工作:
- 创建 Windows 虚拟机。
- 将该虚拟机加入 CMAD 网域。
- 尝试以来自通过信任关系连接的网域的用户身份运行 NotePad 等应用。
- 重启客户端虚拟机并重新测试 Windows 身份验证。
- 您可以尝试创建 SQL Server 登录,但收到以下错误:
可能会发生这种情况是因为网域本地组不受支持;如果适用,请改为使用全局群组或通用群组。
- 如果 SQL Server 查询导致以下错误,请注意来自通过信任关系连接的网域的用户不支持 IP 地址:
以下操作可能有助于解决此问题:
- 如果您使用 IP 地址连接托管式网域中的用户,请按照 Microsoft 文档中的说明操作。
- 避免使用任何代理,并始终使用相同的 DNS 名称连接到 Cloud SQL for SQL Server,即您在 Google Cloud 控制台中看到的名称。
如果实例存在 Windows 身份验证问题(无论是否最近更新了此实例),请尝试退出网域,然后重新加入。为此,请使用更新过程退出该网域,然后重新加入。这样做不会移除数据库中任何现有通过 Windows 身份验证的用户或登录。但是,移除 Windows 身份验证会使实例重启。 - 在 Google Cloud 控制台中使用 AD 诊断工具排查客户管理的网域和 Cloud SQL for SQL Server 实例中的 AD 设置问题。跳过与托管式 Microsoft AD 相关的步骤。
问题排查
下表列出了常见的错误消息以及有助于解决这些错误的方法:
| 错误… | 可能的问题… | 请尝试以下操作… |
|---|---|---|
Per-product, per-project Service Account (P4 SA) not found for project. |
服务账号名称不正确。 | 在 “服务账号”页面上,确保您已为正确的用户项目创建服务账号。 |
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-cmad for tips. |
无法对 CMAD 网域执行所需的更新。 | 如果 Windows 身份验证存在问题,可以尝试退出 CMAD 网域,然后重新加入。 为此,请使用更新过程退出该网域,然后重新加入。这样做不会移除数据库中任何现有通过 Windows 身份验证的用户或登录。但是,移除 Windows 身份验证会使实例重启。 |
This instance would need new network architecture to support Active
Directory. See https://cloud.google.com/sql/docs/sqlserver/configure-cmad." |
此实例未使用新网络架构。 | 将实例升级到新的网络架构。 |
Admin credential secret name / Organizational unit / DNS Server
names is required or Invalid Admin credential secret name /
OrganizationalUnit / DNS Server names provided. |
管理员凭证、组织部门和 DNS 服务器是必需的参数。 | 请指定这些参数,然后重试请求。 |
Integration failed due to insufficient permissions. The Service
Agent for this project must be granted the secretmanager.secrets.getIamPolicy
and secretmanager.secrets.setIamPolicy permissions on the provided admin
credential key in Secret Manager. |
相应项目的服务代理缺少必要的权限。 | 创建具有 secretmanager.secrets.getIamPolicy 和 secretmanager.secrets.setIamPolicy 权限的自定义角色,并将其分配给此项目的服务代理。如需了解详情,请参阅 Secret Manager 角色和权限。 |