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 -flushdns と klist 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 を使用してビッグ データ クラスターに接続して修正プログラムを確認します。