症状:AD モード ログインに失敗しました - 信頼されていないドメイン (ビッグ データ クラスター)

重要

Microsoft SQL Server 2019 ビッグ データ クラスターのアドオンは廃止されます。 SQL Server 2019 ビッグ データ クラスターのサポートは、2025 年 2 月 28 日に終了します。 ソフトウェア アシュアランス付きの SQL Server 2019 を使用する既存の全ユーザーはプラットフォームで完全にサポートされ、ソフトウェアはその時点まで 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.

これは、トラフィックを Kubernetes ノードに分散するリバース プロキシのエイリアス名を指す CNAME として、DNS エントリを構成した場合に発生する可能性があります。

根本原因

エンドポイントが DNS エントリで構成されており、その CNAME が Kubernetes ノードにトラフィックを分散するリバース プロキシのエイリアス名を指す場合:

  • Kerberos 認証プロセスでは、CNAME のエントリと一致するサービス プリンシパル名 (SPN) を探します。これは、アクティブ ディレクトリの BDC に登録されている実際の SPN ではありません
  • 認証に失敗します

根本原因を確認する

認証に失敗した後、Kerberos チケットのキャッシュを確認します。

チケットのキャッシュを確認するには、klist コマンドを使用します。

接続しようとしたエンドポイントに一致する SPN を持つチケットを探します。

そこに予期されるチケットはありません。

この例では、マスター エンドポイントの、bdc-sql DNS レコードは、CNAME が ServerReverseProxy という名前のリバース プロキシに設定されている CNAME です

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

Note

以降のセクションでは、tshark を参照します。 tshark は、Wireshark (ネットワーク トレース ユーティリティ) の一部としてインストールされたコマンド ライン ユーティリティです。

Active Directory から要求された SPN を表示するには、tshark を使用します。 次のコマンドでは、ネットワーク トレースのキャプチャを Kerberos プロトコル通信に制限し、krb-error (30) メッセージのみを表示します。 これらのメッセージには、失敗した SPN 要求メッセージが含まれているはずです。

tshark -Y "kerberos && kerberos.msg_type == 30" -T fields -e kerberos.error_code -e kerberos.SNameString

別のコマンド シェルから、マスター ポッドに接続してみます。

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 によって登録されている SPN が要求されます。 この例では、正しい SPN は MSSQLSvc,bdc-sql.mydomain.com:31433 となります。

Note

エラー 25 は、KDC_ERR_PREAUTH_REQUIRED (追加の事前認証が必要) を意味します。 これは無視してかまいません。 最初の Kerberos AD 要求に対して、KDC_ERR_PREAUTH_REQUIRED が返されます。 既定では、Windows Kerberos クライアントのこの最初の要求には事前認証情報が含まれません。

マスター エンドポイント用に BDC によって登録された SPN の一覧を表示するには、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

上記の結果では、リバース プロキシ アドレスを登録することはできません。

解決

このセクションでは、この問題を解決する 2 つの方法を示します。 適切な変更を行った後、クライアントで ipconfig -flushdnsklist purge を実行します。 その後、もう一度接続してみます。

方法 1

DNS 内の各 BDC エンドポイントの CNAME レコードを削除して、複数のマスターがある場合は各 Kubernetes ノードまたは各 Kubernetes マスターを指す複数の A レコードに置き換えます。

ヒント

以下で説明するスクリプトでは、PowerShell を使用します。 詳細については、「Linux への PowerShell のインストール」を参照してください。

次の 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

リバース プロキシの名前ではなく、リバース プロキシの IP アドレスを指すように CNAME を変更することで、問題を回避することもできます。

解決策を確認する

上記のオプションのいずれかを使用する解決策が決まったら、Active Directory でビッグ データ クラスターに接続し、その解決策を確認します。

次のステップ

ドメイン コントローラーの逆引き DNS エントリ (PTR レコード) を検証します