次の方法で共有


現象: AD モードのログインが失敗する - 信頼されていないドメイン (ビッグ データ クラスター)

Important

Microsoft SQL Server 2019 ビッグ データ クラスターは廃止されました。 SQL Server 2019 ビッグ データ クラスターのサポートは、2025 年 2 月 28 日の時点で終了しました。 詳細については、Microsoft SQL Server プラットフォーム の発表ブログ投稿ビッグ データ オプションを参照してください。

Active Directory モードの SQL Server ビッグ データ クラスターでは、接続試行が失敗し、接続試行によって次のエラーが返される場合があります。

Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.

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

Root cause

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

  • Kerberos 認証プロセスでは、CNAME のエントリと一致するサービス プリンシパル名 (SPN) が検索されます。は、BDC によって Active Directory に登録された真の SPN ではありません
  • Authentication fails

根本原因を確認する

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

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

接続先のエンドポイントと一致する SPN を含むチケットを探します。

期待されていたチケットがありません。

この例では、マスターエンドポイントの〈c0〉DNSレコードが〈c1〉という名前のリバースプロキシに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 を意味します。追加の事前認証が必要です。 無視しても問題ありません。 KDC_ERR_PREAUTH_REQUIRED は、最初の Kerberos AD 要求で返されます。 既定では、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

上記の結果では、リバース プロキシ アドレスを登録しないでください。

Resolve

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

Option 1

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

Tip

以下で説明するスクリプトでは、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 array 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

Option 2

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

Confirm Resolution

上記のいずれかのオプションで修正プログラムを解決した後、Active Directory を使用してビッグ データ クラスターに接続して修正プログラムを確認します。

Next steps

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