SQL Server on Linux およびコンテナーに対する Active Directory 認証のトラブルシューティング

適用対象:SQL Server - Linux

この記事は、SQL Server on Linux とコンテナーでの Active Directory Domain Services 認証に関する問題のトラブルシューティングに役立ちます。 Active Directory を正常に構成するための前提条件のチェックとヒント、一般的なエラーの一覧とトラブルシューティング手順が含まれています。

現在の構成を検証する

トラブルシューティングを始める前に、現在のユーザー、mssql.conf、サービス プリンシパル名 (SPN)、領域の設定を検証する必要があります。

  1. kinit を使って、Kerberos TGT (Ticket Granting Ticket) を取得または更新します。

    kinit privilegeduser@CONTOSO.COM
    
  2. 次のコマンドを実行し、このコマンドを実行しているユーザーに mssql.keytab へのアクセス権があることを確認します。

    /opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
    

    validate-ad-config コマンドについて詳しくは、/opt/mssql/bin/mssql-conf validate-ad-config --help コマンドを使ってヘルプ情報を表示してください。

DNS と逆引き DNS 参照

  1. ドメイン名と NetBIOS 名に対する DNS 参照では、同じ IP アドレスが返される必要があります。これは通常、ドメイン コントローラー (DC) の IP アドレスと一致します。 SQL Server ホスト コンピューターから次のコマンドを実行します。

    nslookup contoso
    nslookup contoso.com
    

    IP アドレスが一致しない場合は、「Linux ホスト上の SQL Server を Active Directory ドメインに参加させる」を参照して、DNS 参照と DC との通信を修正します。

  2. 前の結果に記載されている各 IP アドレスに対して、逆引き DNS (rDNS) 参照を実行します。 これには、IPv4 と IPv6 のアドレスが含まれます (該当する場合)。

    nslookup <IPs returned from the above commands>
    

    すべてで <hostname>.contoso.com が返されるはずです。 そうでない場合は、Active Directory で作成された PTR (ポインター) レコードを確認してください。

    ドメイン管理者と協力して rDNS を機能させることが必要になる場合があります。 返されたすべての IP アドレスに対して PTR エントリを追加できない場合は、ドメイン コントローラーのサブセットに SQL Server を制限することもできます。 この変更は、ホストで krb5.conf を使っている他のすべてのサービスに影響します。

    逆引き DNS の詳細については、「逆引き DNS とは何ですか?」を参照してください。

keytab ファイルとアクセス許可をチェックする

  1. keytab (キー テーブル) ファイルが作成済みであることと、適切なアクセス許可で正しいファイルを使用するように mssql-conf が構成されていることを確認します。 keytab は、mssql ユーザー アカウントからアクセスできる必要があります。 詳しくは、「チュートリアル: adutil を使用して SQL Server on Linux で Active Directory 認証を構成する」をご覧ください。

  2. keytab の内容の一覧を表示できることと、正しい SPN、ポート、暗号化の種類、ユーザー アカウントを追加したことを確認します。 SPN と keytab のエントリを作成するときにパスワードを正しく入力しないと、Active Directory 認証を使ってサインインしようとする際にエラーが発生します。

    klist -kte /var/opt/mssql/secrets/mssql.keytab
    

    機能する keytab の例を次に示します。 この例では 2 種類の暗号化を使用しますが、お使いの環境でサポートされている暗号化の種類に応じて、1 つだけ使用したり、複数使用したりできます。 この例では、sqluser@CONTOSO.COM は特権アカウント (mssql-conf での network.privilegedadaccount の設定と一致します) であり、SQL Server のホスト名は sqllinux.contoso.com で、既定のポート 1433 でリッスンしています。

    $ kinit privilegeduser@CONTOSO.COM
    Password for privilegeduser@CONTOSO.COM:
    
    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: privilegeduser@CONTOSO.COM
    Valid starting     Expires            Service principal
    01/26/22 20:42:02  01/27/22 06:42:02  krbtgt/CONTOSO.COM@CONTOSO.COM
        renew until 01/27/22 20:41:57
    
    $ klist -kte mssql.keytab
    Keytab name: FILE:mssql.keytab
    KVNO Timestamp         Principal
    ---- ----------------- --------------------------------------------------------
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes128-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes128-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes128-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes128-cts-hmac-sha1-96)
       2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes128-cts-hmac-sha1-96)
    

krb5.conf で領域情報を検証する

  1. krb5.conf (/etc/krb5.conf にあります) で、既定の領域、領域情報、ドメインから領域へのマッピングの値を指定していることを確認します。 次の例は、サンプルの krb5.conf ファイルです。 詳細については、「SQL Server on Linux およびコンテナーに対する Active Directory 認証について」を参照してください。

    [libdefaults]
    default_realm = CONTOSO.COM
    
    [realms]
    CONTOSO.COM = {
        kdc = adVM.contoso.com
        admin_server = adVM.contoso.com
        default_domain= contoso.com
    }
    
    [domain_realm]
    .contoso.com = CONTOSO.COM
    contoso.com = CONTOSO.COM
    
  2. SQL Server がドメイン コントローラーのサブセットにアクセスするように制限することができます。これは、SQL Server でアクセスする必要があるドメイン コントローラーよりも多くが DNS 構成から返される場合に便利です。 SQL Server on Linux では、LDAP 参照の実行時に SQL Server がラウンドロビン方式でアクセスするドメイン コントローラーのリストを指定できます。

    2 つの手順を実行する必要があります。 まず、krb5.conf を変更して、必要な数のドメイン コントローラーを追加し、プレフィックス kdc = を付けます。

    [realms]
    CONTOSO.COM = {
      kdc = kdc1.contoso.com
      kdc = kdc2.contoso.com
      ..
      ..
    }
    

    krb5.conf は共通の Kerberos クライアント構成ファイルであるため、このファイルに加えた変更は、SQL Server だけでなく他のサービスにも影響を与えることに注意してください。 変更を行う前に、ドメイン管理者に問い合わせてください。

    その後、mssql-conf を使って network.enablekdcfromkrb5conf 設定を有効にしてから、SQL Server を再起動します。

    sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true
    sudo systemctl restart mssql-server
    

Kerberos のトラブルシューティング

以下の詳細を参照して、Active Directory 認証に関する問題のトラブルシューティングと特定のエラー メッセージの確認に役立ててください。

Kerberos のトレース

ユーザー、SPN、keytab を作成し、SQL Server on Linux に対する Active Directory の構成が正しいことを確認するように mssql-conf を構成した後は、次のコマンドを使って、特権アカウントで Kerberos TGT を取得または更新しようとする際に、Kerberos のトレース メッセージをコンソール (stdout) に表示できます。

root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser

問題がない場合は、次の例のような出力が表示されるはずです。 そうでない場合は、トレースによって、確認の必要な手順についてのコンテキストが提供されます。

3791545 1640722276.100275: Getting initial credentials for sqluser@CONTOSO.COM
3791545 1640722276.100276: Looked up etypes in keytab: aes256-cts, aes128-cts
3791545 1640722276.100278: Sending unauthenticated request
3791545 1640722276.100279: Sending request (202 bytes) to CONTOSO.COM
3791545 1640722276.100280: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100281: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100282: Received answer (185 bytes) from stream 10.0.0.4:88
3791545 1640722276.100283: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100284: Response was from master KDC
3791545 1640722276.100285: Received error from KDC: -1765328359/Additional pre-authentication required
3791545 1640722276.100288: Preauthenticating using KDC method data
3791545 1640722276.100289: Processing preauth types: PA-PK-AS-REQ (16), PA-PK-AS-REP_OLD (15), PA-ETYPE-INFO2 (19), PA-ENC-TIMESTAMP (2)
3791545 1640722276.100290: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100291: Retrieving sqluser@CONTOSO.COM from /var/opt/mssql/secrets/mssql.keytab (vno 0, enctype aes256-cts) with result: 0/Success
3791545 1640722276.100292: AS key obtained for encrypted timestamp: aes256-cts/E84B
3791545 1640722276.100294: Encrypted timestamp (for 1640722276.700930): plain 301AA011180F32303231313XXXXXXXXXXXXXXXXXXXXXXXXXXXXX, encrypted 333109B95898D1B4FC1837DAE3E4CBD33AF8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3791545 1640722276.100295: Preauth module encrypted_timestamp (2) (real) returned: 0/Success
3791545 1640722276.100296: Produced preauth for next request: PA-ENC-TIMESTAMP (2)
3791545 1640722276.100297: Sending request (282 bytes) to CONTOSO.COM
3791545 1640722276.100298: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100299: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100300: Received answer (1604 bytes) from stream 10.0.0.4:88
3791545 1640722276.100301: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100302: Response was from master KDC
3791545 1640722276.100303: Processing preauth types: PA-ETYPE-INFO2 (19)
3791545 1640722276.100304: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100305: Produced preauth for next request: (empty)
3791545 1640722276.100306: AS key determined by preauth: aes256-cts/E84B
3791545 1640722276.100307: Decrypted AS reply; session key is: aes256-cts/05C0
3791545 1640722276.100308: FAST negotiation: unavailable
3791545 1640722276.100309: Initializing KCM:0:37337 with default princ sqluser@CONTOSO.COM
3791545 1640722276.100310: Storing sqluser@CONTOSO.COM -> krbtgt/CONTOSO.COM@CONTOSO.COM in KCM:0:37337
3791545 1640722276.100311: Storing config in KCM:0:37337 for krbtgt/CONTOSO.COM@CONTOSO.COM: pa_type: 2
3791545 1640722276.100312: Storing sqluser@CONTOSO.COM -> krb5_ccache_conf_data/pa_type/krbtgt/CONTOSO.COM@CONTOSO.COM@X-CACHECONF: in KCM:0:37337

$ sudo klist
Ticket cache: KCM:0:37337
Default principal: sqluser@CONTOSO.COM
Valid starting Expires Service principal
12/28/2021 20:11:16 12/29/2021 06:11:16 krbtgt/CONTOSO.COM@CONTOSO.COM
renew until 01/04/2022 20:11:16

Kerberos とセキュリティベースの PAL ログ記録を有効にする

security.kerberossecurity.ldap ログ記録を有効にして、PAL (プラットフォーム抽象化レイヤー) の特定のエラー メッセージを確認できます。 次のような内容の logger.ini ファイルを /var/opt/mssql/ に作成し、SQL Server を再起動してから、失敗を再現します。 PAL の Active Directory エラーとデバッグ メッセージは /var/opt/mssql/log/security.log に記録されます。

[Output:security]
Type = File
Filename = /var/opt/mssql/log/security.log
[Logger]
Level = Silent
[Logger:security.kerberos]
Level = Debug
Outputs = security
[Logger:security.ldap]
Level = debug
Outputs = security

logger.ini から取得されるロガーの変更に対して SQL Server を再起動する必要はありませんが、Active Directory サービスの初期化中または SQL Server の起動中に、他では発見できない失敗が発生する可能性があります。 SQL Server を再起動することにより、すべてのエラー メッセージが確実にキャプチャされます。

セキュリティ ログによるドライブへの書き込みは、ユーザーが logger.ini で変更を削除するまで続けられます。 問題を特定して解決したら、ドライブの空き領域が不足するのを防ぐために、必ず security.kerberossecurity.ldap ログ記録を無効にしてください。

PAL ロガーでは、次の形式でログ ファイルが生成されます。

<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>

例として、ログのサンプル行を次に示します。

12/28/2021 13:56:31.609453055 Error [security.kerberos] <0003753757/0x00000324> Request ticket server MSSQLSvc/sql.contoso.com:1433@CONTOSO.COM kvno 3 enctype aes256-cts found in keytab but cannot decrypt ticket

PAL のログを有効にして問題を再現したら、ログ レベルが Error である最初のメッセージを探し、以下の表を使ってエラーを見つけ、ガイダンスと推奨事項に従って問題のトラブルシューティングと解決を行います。

一般的なエラー メッセージ

エラー メッセージ: "ログインできませんでした。 ログインが信頼できないドメインから行われたため、統合認証を使用できません。"

考えられる原因

Active Directory 認証を構成した後、Active Directory アカウントを使ってログインしようとすると、このエラーが発生します。

ガイダンス

これは一般的なエラー メッセージであり、具体的なエラー メッセージを特定するには、PAL ログ記録を有効にする必要があります。

次の一般的なエラーの一覧を参照して、各エラーの考えられる原因を特定してから、トラブルシューティングのガイダンスに従って問題を解決することができます。

エラー メッセージ
Windows NT ユーザーまたはグループ 'CONTOSO\user' が見つかりませんでした
エラーが発生したため、短いドメイン名を検索できませんでした
エラーが発生したため、ホスト <ホスト名> の rDNS 参照を実行できませんでした
rDNS 参照から FQDN が返されませんでした
LDAP サーバーにバインドできませんでした
キー テーブル エントリが見つかりませんでした
<プリンシパル> のキー テーブル エントリが見つかりませんでした
要求チケット サーバー <プリンシパル> が keytab に見つかりませんでした (チケット kvno )
要求チケット サーバー <プリンシパル> kvno が keytab で見つかりましたが、enctype <暗号化のタイプ> はありません
要求チケット サーバー <プリンシパル> kvno enctype <暗号化のタイプ> が keytab で見つかりましたが、チケットを復号化できません

エラー メッセージ: Windows NT ユーザーまたはグループ 'CONTOSO\user' が見つかりませんでした

考えられる原因

Windows ログインを作成しようとしたとき、またはグループの更新中に、このエラーが発生することがあります。

ガイダンス

この問題を検証するには、次に記載されているガイダンスに従ってください: "ログインできませんでした。 ログインが信頼できないドメインから行われたため、統合認証を使用できません。 (Microsoft SQL Server、エラー: 18452)" PAL ログ記録を有効化して具体的なエラーを特定し、それに応じてトラブルシューティングを行います。

エラー メッセージ: "エラーが発生したため、短いドメイン名を検索できませんでした"

考えられる原因

Active Directory ログインを作成するための Transact-SQL 構文は次のとおりです。

CREATE LOGIN [CONTOSO\user] FROM WINDOWS;

コマンドには NetBIOS 名 (CONTOSO) が必要ですが、バックエンドで LDAP 接続を実行する際には、ドメインの FQDN (contoso.com) が指定される必要があります。 この変換を行うために、CONTOSO に対して DNS 参照が実行され、ドメイン コントローラーの IP アドレスに解決されます。その後これを LDAP クエリ用にバインドすることができます。

ガイダンス

"エラーが発生したため、短いドメイン名を検索できませんでした" というエラー メッセージは、contoso に対する nslookup がドメイン コントローラーの IP アドレスに解決されないことを示唆しています。 「DNS と逆引き DNS 参照」を参照して、NetBIOS とドメイン名の両方に対する nslookup が一致することを確認する必要があります。

エラー メッセージ: "エラーが発生したため、ホスト <ホスト名> の rDNS 参照を実行できませんでした" または "rDNS 参照から FQDN が返されませんでした"

考えられる原因

ほとんどの場合、このエラー メッセージは、すべてのドメイン コントローラーに対して逆引き DNS レコード (PTR レコード) が存在していないことを示しています。

ガイダンス

DNS と逆引き DNS 参照」を参照してください。 rDNS エントリのないドメイン コントローラーが特定された場合、次の 2 つのオプションがあります。

  • すべてのドメイン コントローラーに rDNS エントリを追加する

    これは SQL Server の設定ではなく、ドメイン レベルで構成する必要があります。 ドメイン管理チームと協力して、ドメイン名に対して nslookup を実行したときに返されるすべてのドメイン コントローラーに対して必要な PTR レコードを作成することが必要な場合があります。

  • SQL Server をドメイン コントローラーのサブセットに制限する

    返されたすべてのドメイン コントローラーに対して PTR レコードを追加することができない場合は、SQL Server をドメイン コントローラーのサブセットに制限することができます。

エラー メッセージ: "LDAP サーバー ldap://CONTOSO.COM:3268 にバインドできませんでした: ローカル エラー"

考えられる原因

これは OpenLDAP からの一般的なエラーですが、通常は次の 2 つのうちのいずれかを意味します。

  • 資格情報なし
  • rDNS の問題

このようなエラー メッセージの例を次に示します。

12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error

ガイダンス

  • 資格情報なし

    LDAP 接続用の資格情報が読み込まれない場合は、他のエラー メッセージが最初にスローされます。 PAL のログを有効にし、エラー ログでこれより前のエラー メッセージを確認する必要があります。 他のエラーがない場合は、資格情報の問題ではないと考えられます。 見つかった場合は、表示されているエラー メッセージの修正を行います。 ほとんどの場合、それはこの記事で説明されているエラー メッセージのいずれかになります。

  • rDNS の問題

    DNS と逆引き DNS 参照」を参照してください。

    OpenLDAP ライブラリがドメイン コントローラーに接続するときに、ドメインの FQDN (contoso.com) か DC の FQDN (kdc1.contoso.com) のいずれかが指定されます。 接続が確立された後 (ただし、呼び出し元に成功を返す前に)、OpenLDAP ライブラリによって接続されているサーバーの IP がチェックされます。 次に、逆引き DNS 参照が実行され、(kdc1.contoso.com) に接続されているサーバーの名前が、接続が要求されたドメイン (contoso.com) と一致することがチェックされます。 これが一致しない場合、セキュリティ機能として、OpenLDAP ライブラリは接続に失敗します。 これが、rDNS 設定が SQL Server on Linux で非常に重要であり、このドキュメントで焦点を当てている理由の 1 つです。

エラー メッセージ: "キー テーブル エントリが見つかりませんでした"

考えられる原因

このエラーは、keytab ファイルに関するアクセスの問題、または keytab に必要なエントリがすべて含まれていないことを示しています。

ガイダンス

keytab ファイルが正しいアクセス レベルとアクセス許可を持っていることを確認します。 keytab ファイルの既定の場所と名前は /var/opt/mssql/secrets/mssql.keytab です。 シークレット フォルダー下にあるすべてのファイルの現在のアクセス許可を表示するには、次のコマンドを実行します。

sudo ls -lrt /var/opt/mssql/secrets

次のコマンドを使って、keytab ファイルのアクセス許可とアクセス レベルを設定できます。

sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab

keytab エントリの一覧の表示と、正しいアクセス許可の設定について詳しくは、前の「keytab ファイルとアクセス許可をチェックする」セクションをご覧ください。 そのセクションの条件のいずれかが満たされていない場合は、次のエラー、または同等のエラーが表示されます: "Key table entry not found"

エラー メッセージ: "<プリンシパル> のキー テーブル エントリが見つかりませんでした"

考えられる原因

keytab から <principal> の資格情報を取得しようとしたときに、該当するエントリが見つかりませんでした。

ガイダンス

このドキュメントの「keytab ファイルとアクセス許可をチェックする」セクションに従って、keytab 内のすべてのエントリを一覧表示します。 <principal> が存在していることを確認します。 この場合、プリンシパル アカウントは、通常、SPN が登録されている network.privilegedadaccount です。 そうでない場合は、adutil コマンドを使って追加してください。 詳しくは、「チュートリアル: adutil を使用して SQL Server on Linux で Active Directory 認証を構成する」をご覧ください。

エラー メッセージ: "要求チケット サーバー <プリンシパル> が keytab で見つかりませんでした (チケット kvno )"

考えられる原因

このエラーは、指定された KVNO (キー バージョン番号) で SQL Server によって要求されたチケットの keytab エントリが見つけられなかったことを示します。

ガイダンス

このドキュメントの「keytab ファイルとアクセス許可をチェックする」セクションに従って、keytab 内のすべてのエントリを一覧表示します。 <principal> と KVNO に一致するエラー メッセージが見つからない場合は、そのセクションで説明されている手順に従って keytab ファイルを更新することで、このエントリを追加してください。

次のコマンドを実行して、DC から最新の KVNO を取得することもできます。 このコマンドを実行する前に、kinit コマンドを使って、Kerberos TGT を取得または更新する必要があります。 詳しくは、「adutil を使用して SQL Server 用の Active Directory ユーザーを作成し、サービス プリンシパル名 (SPN) を設定する」をご覧ください。

kvno MSSQLSvc/<hostname>

エラー メッセージ: "要求チケット サーバー <プリンシパル> kvno が keytab で見つかりましたが、enctype <暗号化のタイプ> はありません

考えられる原因

このエラーは、クライアントによって要求されている暗号化の種類が、SQL Server の keytab に存在しなかったことを意味します。

ガイダンス

検証するには、このドキュメントの「keytab ファイルとアクセス許可をチェックする」セクションに従って、keytab 内のすべてのエントリを一覧表示します。 プリンシパル、KVNO、暗号化の種類に一致するエラー メッセージが見つからない場合は、そのセクションで説明されている手順に従って keytab ファイルを更新することで、このエントリを追加してください。

エラー メッセージ: "要求チケット サーバー <プリンシパル> kvno <KVNO> enctype <暗号化のタイプ> が keytab で見つかりましたが、チケットを復号化できません"

考えられる原因

このエラーは、SQL Server では、keytab ファイルの資格情報を使用して、受信した認証要求を暗号化解除できなかったことを示します。 多くの場合、このエラーは間違ったパスワードが原因で発生します。

ガイダンス

正しいパスワードを使って keytab を再作成します。 adutil を使う場合は、「adutil を使用して SQL Server on Linux で Active Directory 認証を構成する」の手順に従って、適切なパスワードで keytab を作成します。

共通ポート

次の表は、Active Directory 認証の構成と管理のために SQL Server on Linux によって使用される共通ポートを示しています。

Active Directory サービス Port
DNS 53
LDAP 389
LDAPS 636
Kerberos 88