Симптом. Сбой входа в режим AD — недоверенный домен (кластеры больших данных)
Важно!
Поддержка надстройки "Кластеры больших данных" Microsoft SQL Server 2019 будет прекращена. Мы прекратим поддержку Кластеров больших данных SQL Server 2019 28 февраля 2025 г. Все существующие пользователи SQL Server 2019 с Software Assurance будут полностью поддерживаться на платформе, а программное обеспечение будет по-прежнему поддерживаться с помощью SQL Server накопительных обновлений до этого времени. Дополнительные сведения см. в записи блога объявлений и в статье о параметрах больших данных на платформе Microsoft SQL Server.
В Кластере больших данных SQL Server в режиме Active Directory попытки подключения могут завершиться сбоем и возвращают следующую ошибку:
Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.
Это может произойти, если вы настроили записи DNS как CNAME, указывающие на псевдоним обратного прокси-сервера, который распределяет трафик по узлам Kubernetes.
Первопричина
Когда конечные точки настроены с записями DNS с CNAME, указывающими на псевдоним обратного прокси-сервера, который распределяет трафик по узлам Kubernetes:
- Процесс проверки подлинности Kerberos выполняет поиск имени субъекта-службы (SPN), соответствующего записи CNAME, а не настоящее имя субъекта-службы, зарегистрированное BDC в Active Directory
- Сбой проверки подлинности
Подтверждение первопричины
После сбоя проверки подлинности проверьте кэш билетов Kerberos.
Чтобы проверить кэш билетов, используйте команду klist
.
Найдите билет с именем субъекта-службы, соответствующим конечной точке, к которой вы пытались подключиться.
Ожидаемый билет отсутствует.
В этом примере главная конечная точка, запись DNS bdc-sql
, представляет собой CNAME, настроенный на обратный прокси-сервер с именем ServerReverseProxy
Resolve-DnsName bdc-sql
В следующем разделе показаны результаты предыдущей команды.
Name Type TTL Section NameHost
---- ---- --- ------- --------
bdc-sql.mydomain.com CNAME 3600 Answer ReverseProxyServer.mydomain.com
Name : ReverseProxyServer.mydomain.com
QueryType : A
TTL : 3600
Section : Answer
IP4Address : 193.168.5.10
Примечание
Следующий раздел ссылается на tshark
. tshark
— это служебная программа командной строки, установленная в составе служебной программы трассировки сети Wireshark).
Чтобы просмотреть имя субъекта-службы, запрошенное из Active Directory, используйте tshark
. Следующая команда ограничивает захват трассировки сети только протоколом Kerberos и отображает только сообщения krb-error (30)
. Среди них должны быть сообщения о неудачных запросах имени участника-службы.
tshark -Y "kerberos && kerberos.msg_type == 30" -T fields -e kerberos.error_code -e kerberos.SNameString
В другой командной оболочке попробуйте подключиться к главному модулю pod:
klist purge
sqlcmd -S bdc-sql.mydomain.com,31433 -E
См. следующий пример выходных данных.
klist purge
Current LogonId is 0:0xf6b58
Deleting all tickets:
Ticket(s) purged!
sqlcmd -S bdc-sql.mydomain.com,31433 -E
sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.
Просмотрите выходные данные tshark
.
Capturing on 'Ethernet 3'
25 krbtgt,RLAZURE.COM
7 MSSQLSvc,ReverseProxyServer.mydomain.com:31433
2 packets captured
Обратите внимание, что клиент запрашивает несуществующий SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433
. В итоге попытка подключения завершается ошибкой 7. Ошибка 7 означает KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database
.
В правильной конфигурации клиент запрашивает имя субъекта-службы, зарегистрированное BDC. В этом примере правильным именем субъекта-службы было бы MSSQLSvc,bdc-sql.mydomain.com:31433
.
Примечание
Ошибка 25 означает KDC_ERR_PREAUTH_REQUIRED
— требуется дополнительная предварительная проверка подлинности. Ее можно спокойно проигнорировать. KDC_ERR_PREAUTH_REQUIRED
возвращается при первом запросе Kerberos AD. По умолчанию клиент Windows Kerberos не включает сведения о предварительной проверке подлинности в первом запросе.
Чтобы просмотреть список имен субъектов-служб, зарегистрированных BDC для главной конечной точки, выполните setspn -L mssql-master
.
См. следующий пример выходных данных:
Registered ServicePrincipalNames for CN=mssql-master,OU=bdc,DC=mydomain,DC=com:
MSSQLSvc/bdc-sqlread.mydomain.com:31436
MSSQLSvc/-sqlread:31436
MSSQLSvc/bdc-sqlread.mydomain.com
MSSQLSvc/bdc-sqlread
MSSQLSvc/bdc-sql.mydomain.com:31433
MSSQLSvc/bdc-sql:31433
MSSQLSvc/bdc-sql.mydomain.com
MSSQLSvc/bdc-sql
MSSQLSvc/master-p-svc.mydomain.com:1533
MSSQLSvc/master-p-svc:1533
MSSQLSvc/master-p-svc.mydomain.com:1433
MSSQLSvc/master-p-svc:1433
MSSQLSvc/master-p-svc.mydomain.com
MSSQLSvc/master-p-svc
MSSQLSvc/master-svc.mydomain.com:1533
MSSQLSvc/master-svc:1533
MSSQLSvc/master-svc.mydomain.com:1433
MSSQLSvc/master-svc:1433
MSSQLSvc/master-svc.mydomain.com
MSSQLSvc/master-svc
В результатах выше адрес обратного прокси-сервера не должен быть зарегистрирован.
Разрешить
В этом разделе показано два способа решения проблемы. После внесения соответствующих изменений запустите ipconfig -flushdns
и klist purge
в клиенте. Затем повторите попытку подключения.
Вариант 1
Удалите запись CNAME для каждой конечной точки BDC в DNS и замените ее на несколько записей A
, указывающих на каждый узел Kubernetes или каждый главный узел Kubernetes, если у вас есть несколько главных узлов.
Совет
Описанный ниже скрипт использует PowerShell. Дополнительные сведения см. в статье Установка PowerShell на Linux.
Вы можете использовать следующий скрипт PowerShell для обновления записей конечных точек DNS. Запустите скрипт с любого компьютера, подключенного к тому же домену:
#Specify the DNS server, example contoso.local
$Domain_DNS_name=mydomain.com'
#DNS records for bdc endpoints
$Controller_DNS_name = 'bdc-control'
$Managment_proxy_DNS_name= 'bdc-proxy'
$Master_Primary_DNS_name = 'bdc-sql'
$Master_Secondary_DNS_name = 'bdc-sqlread'
$Gateway_DNS_name = 'bdc-gateway'
$AppProxy_DNS_name = 'bdc-appproxy'
#Performing Endpoint DNS records Checks..
#Build array of endpoints
$BdcEndpointsDns = New-Object System.Collections.ArrayList
[void]$BdcEndpointsDns.Add($Controller_DNS_name)
[void]$BdcEndpointsDns.Add($Managment_proxy_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Primary_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Secondary_DNS_name)
[void]$BdcEndpointsDns.Add($Gateway_DNS_name)
[void]$BdcEndpointsDns.Add($AppProxy_DNS_name)
#Build arrary for results
$BdcEndpointsDns_Result = New-Object System.Collections.ArrayList
foreach ($DnsName in $BdcEndpointsDns) {
try {
$endpoint_DNS_record = Resolve-DnsName $DnsName -Type A -Server $Domain_DNS_IP_address -ErrorAction Stop
foreach ($ip in $endpoint_DNS_record.IPAddress) {
[void]$BdcEndpointsDns_Result.Add("OK - $DnsName is an A record with an IP $ip")
}
}
catch {
[void]$BdcEndpointsDns_Result.Add("MisConfiguration - $DnsName is not an A record or does not exists")
}
}
#show the results
$BdcEndpointsDns_Result
Вариант 2
Кроме того, можно обойти эту ошибку, изменив запись CNAME так, чтобы она указывала на IP-адрес обратного прокси-сервера, а не его имя.
Подтверждение разрешения
После внесения исправлений с использованием одного из указанных вариантов подтвердите исправление, подключившись к кластеру больших данных с помощью Active Directory.
Дальнейшие действия
Проверьте обратную запись DNS (запись типа PTR) для контроллера домена.
Кері байланыс
https://aka.ms/ContentUserFeedback.
Жақында қолжетімді болады: 2024 жыл бойы біз GitHub Issues жүйесін мазмұнға арналған кері байланыс механизмі ретінде біртіндеп қолданыстан шығарамыз және оны жаңа кері байланыс жүйесімен ауыстырамыз. Қосымша ақпаратты мұнда қараңыз:Жіберу және пікірді көру