本页面介绍了��何使用客户管理的 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 角色和权限。 |