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

適用対象:Linux 上の SQL Server

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

現在の構成を検証する

トラブルシューティングを始める前に、現在のユーザー、 mssql.conf、サービスプリンシパル名(SPN)、およびレルム設定を必ず検証してください。

  1. Kerberos TGT(切符発行切符)を取得または更新するには、以下の kinit:

    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. キータブ(キーテーブル)ファイルを作成し、適切な権限で正しいファイルを使うように mssql-conf 設定しているかを確認してください。 keytab は、mssql ユーザー アカウントからアクセスできる必要があります。 詳しくは、「チュートリアル: adutil を使用して SQL Server on Linux で Active Directory 認証を構成する」をご覧ください。

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

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

    機能する keytab の例を次に示します。 この例では 2 種類の暗号化を使用しますが、お使いの環境でサポートされている暗号化の種類に応じて、1 つだけ使用したり、複数使用したりできます。 この例では、sqluser@CONTOSO.COM は特権アカウントであり(network.privilegedadaccountmssql-conf 設定と一致します)、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 /var/opt/mssql/secrets/mssql.keytab
    
    Keytab name: FILE:/var/opt/mssql/secrets/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
    default_keytab_name = /var/opt/mssql/secrets/mssql.keytab
    default_ccache_name = ""
    
    [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つのステップを完成させてください。 まず、必要なドメインコントローラーをkdc =krb5.conf付けて修正してください。

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

    krb5.confファイルは一般的なKerberosクライアント設定ファイルなので、このファイルに加えた変更はSQL Server以外のサービスにも影響します。 変更を行う前に、ドメイン管理者に相談してください。

    mssql-confnetwork.enablekdcfromkrb5conf設定を有効にしてから再起動SQL Server:

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

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

以下の詳細は、Active Directoryの認証問題のトラブルシューティングや特定のエラーメッセージの特定に役立ちます。

Kerberos をトレース

ユーザー、SPN、キータブを作成し、mssql-confを設定したら、Active Directory設定を確認してください。

Linux上のSQL Server on Linuxの設定を確認するには、特権アカウントを使ってKerberos TGTを取得したり更新したりしてください。 コンソール(stdout)でKerberosのトレースメッセージを表示するコマンドを実行します:

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 ログ記録を有効にする

PAL(プラットフォーム抽象層)で特定のエラーメッセージを特定するために、 security.kerberos ログと security.ldap ログを有効にしてください。 /var/opt/mssql/の内容を含むlogger.iniファイルを作成し、初期化エラーを捕捉するために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

SQL Server再起動せずにlogger.iniのロガー変更を拾いますが、サービス初期化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アカウントでサインインしようとすると発生します。

Guidance

この一般的なエラー メッセージは、特定のエラーを識別するために、PAL ログ記録を有効にするように求めます。

以下のよくあるエラーのリストをご参照ください。各エラーの原因を特定し、トラブルシューティングのガイダンスに従って問題を解決してください。

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

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

考えられる原因

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

Guidance

問題を確認するには、「ログインに失敗しました。」というガイダンスに従いましょう。 ログインは信頼されていないドメインからのものであり、統合認証では使用できません。 (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 クエリ用にバインドすることができます。

Guidance

「Could not search up short domain name due to error」というエラーメッセージは、contosonslookupがドメインコントローラーのIPアドレスに解決されていないことを示唆しています。 DNSとリバースDNSの検索を確認し、NetBIOSとドメイン名の両方のnslookupが一致しているか確認してください。

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

考えられる原因

これらのエラーメッセージは通常、すべてのドメインコントローラーでリバースDNSレコード(PTRレコード)が存在しないことを示しています。

Guidance

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

Guidance

  • 資格情報なし

    LDAP接続で認証情報が読み込まれない場合、他のエラーメッセージが最初に表示されます。 PALログを有効にし て、この前のエラーログにエラーメッセージがあるか確認してください。 他のエラーがない場合は、資格情報の問題ではないと考えられます。 エラーを見つけたら、次に進む前に修正してください。 ほとんどの場合、この記事が扱うエラーメッセージの一つです。

  • rDNS の問題

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

    OpenLDAPライブラリがドメインコントローラーに接続すると、完全限定ドメイン名(FQDN、この例では contoso.com)か、DCのFQDN(kdc1.contoso.com)のいずれかを提供します。 接続が確立された後(ただし成功をコールに返す前に)、OpenLDAPライブラリは接続先のサーバーのIPを確認します。 その後、リバースDNS検索を行い、接続したサーバー名(kdc1.contoso.com)が要求されたドメイン(contoso.com)と一致しているかを確認します。 これが一致しない場合、セキュリティ機能として、OpenLDAP ライブラリは接続に失敗します。 この不一致が、SQL Server on LinuxでrDNS設定が重要な理由の一つであり、この記事の焦点です。

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

考えられる原因

このエラーはキータブファイルのアクセス障害やキータブ内のエントリの欠如を示しています。

Guidance

keytab ファイルが正しいアクセス レベルとアクセス許可を持っていることを確認します。 キータブファイルのデフォルトの位置と名前は /var/opt/mssql/secrets/mssql.keytabです。 secretsフォルダ内のすべてのファイルの現在の権限を確認するには、以下のコマンドを実行してください:

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

以下のコマンドを使って、キータブファイルの権限とアクセスレベルを設定します:

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"

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

考えられる原因

キータブから <principal> の認証情報を取得しようとすると、該当するエントリーが見つかりません。

Guidance

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

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

考えられる原因

このエラーは、SQL Serverが指定されたキーバージョン番号(KVNO)でリクエストされたチケットのキータブエントリを見つけられないことを示しています。

Guidance

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

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

kvno MSSQLSvc/<hostname>

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

考えられる原因

このエラーは、SQL Serverのキータブにクライアントが要求する暗号化タイプを含んでいないことを意味します。

Guidance

検証を行うには、この記事の 「チェックキータブファイルおよび権限 」セクションに従って、キータブ内のすべてのエントリーをリストアップしてください。 プリンシパル、KVNO、暗号化タイプに合致するエラーメッセージが見つからない場合は、そのセクションの手順に従ってキータブファイルを更新してこのエントリを追加してください。

エラー メッセージ: "要求チケット サーバー <principal> kvno <KVNO> enctype <encryption type> が keytab で見つかりましたが、チケットを復号できません"

考えられる原因

このエラーメッセージは、SQL Serverがキータブファイルの認証情報を使用して受信認証要求を復号できないことを示しています。 誤ったパスワードがこのエラーを引き起こすことがよくあります。

Guidance

正しいパスワードでキータブを再作成してください。 adutilを使う場合は、正しいパスワードでキータブを作成し、チュートリアルの手順に従ってください:adutilを使ってSQL Server on LinuxでActive Directory認証を設定してください。

共通ポート

この表は、SQL Server on LinuxがActive Directory認証の設定および管理に使用する一般的なポートを示しています。

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