Устранение неполадок с проверкой подлинности Active Directory для SQL Server на Linux и в контейнерах

Применимо к: даSQL Server (все поддерживаемые версии) — Linux

Эта статья поможет вам устранить неполадки с проверкой подлинности Active Directory в SQL Server на Linux и в контейнерах. В статье представлены проверки соблюдения предварительных требований и рекомендации по успешной настройке Active Directory, а также список распространенных ошибок и шаги по устранению неполадок.

DNS и обратные просмотры DNS

  1. В результате поисков DNS по доменному имени и имени NetBIOS должен возвращаться один и тот же IP-адрес, который обычно соответствует IP-адресу для контроллера домена (DC). Выполните эти команды с хост-компьютера SQL Server.

    nslookup contoso
    nslookup contoso.com
    

    Если IP-адреса не совпадают, см. статью Присоединение SQL Server на узле Linux к домену Active Directory, чтобы устранить проблемы при операциях поиска DNS и обмене данными с контроллером домена.

  2. Выполните обратный просмотр DNS (rDNS) для каждого IP-адреса, указанного в предыдущих результатах. Это касается IPv4- и IPv6-адресов, если применимо.

    nslookup <IPs returned from the above commands>
    

    Все команды должны вернуть <hostname>.contoso.com. В противном случае проверьте записи типа PTR (указатель), созданные в Active Directory.

    Возможно, вам потребуется обратиться к администратору домена, чтобы обеспечить работу rDNS. Если невозможно добавить записи типа PTR для всех возвращенных IP-адресов, можно также ограничить SQL Server подмножеством контроллеров домена. Это изменение повлияет на любые другие службы, использующие krb5.conf на узле.

    Дополнительные сведения о обратных просмотрах DNS см. в разделе Что такое обратная зона DNS.

Проверка файла keytab и разрешений

  1. Убедитесь, что файл keytab (таблица ключей) создан и что скрипт mssql-conf настроен на использование правильного файла с соответствующими разрешениями. Файл keytab должен быть доступен для учетной записи пользователя mssql. Дополнительные сведения см. в статье Настройка проверки подлинности Active Directory в SQL Server на Linux с помощью adutil.

  2. Убедитесь, что вы можете вывести содержимое файла keytab и что вы добавили правильные имена субъектов-служб (SPN), порт, тип шифрования и учетную запись пользователя. Если не ввести правильные пароли при создании имен субъектов-служб и записей keytab, при попытке выполнить вход с использованием проверки подлинности Active Directory возникнет ошибка.

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

    Ниже приведен пример рабочего файла keytab. В примере используются два типа шифрования. Однако вы можете использовать один или несколько типов шифрования в зависимости от того, какие типы шифрования поддерживаются в вашей среде. В приведенном ниже примере sqluser@CONTOSO.COM представляет собой привилегированную учетную запись (которая соответствует параметру network.privilegedadaccount в mssql-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 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 приведен ниже. Дополнительные сведения см. в статье Проверка подлинности Active Directory для SQL Server на Linux и в контейнерах.

    [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 подключалась к подмножеству контроллеров домена, что полезно, если конфигурация DNS возвращает больше контроллеров домена, чем SQL Server нужно для подключения. SQL Server на Linux позволяет указать список контроллеров домена, к которым SQL Server будет обращаться методом циклического перебора при выполнении поиска LDAP.

    Вам потребуется выполнить два действия. Сначала измените krb5.conf, добавив необходимое количество контроллеров домена с префиксом kdc =.

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

    Помните, что krb5.conf — это общий файл конфигурации клиента Kerberos, поэтому любые изменения, вносимые в этот файл, повлияют не только на SQL Server, но и на другие службы. Прежде чем вносить какие-либо изменения, обратитесь к администратору домена.

    После этого вы можете включить параметр network.enablekdcfromkrb5conf, используя mssql-conf, а затем перезапустить SQL Server.

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

Устранение неполадок с Kerberos

Ознакомьтесь с приведенными ниже сведениями, которые помогут вам при устранении неполадок с проверкой подлинности Active Directory и выявлении конкретных сообщений.

Трассировка Kerberos

Когда вы создадите пользователя, субъекты-служб и файлы keytab, а также настроите скрипт mssql-conf для проверки правильности конфигурации AD для SQL Server на Linux, можно отобразить сообщения трассировки Kerberos в консоли (stdout) при попытке получить или обновить билет предоставления билета (TGT) 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 на основе безопасности

Вы можете включить ведение журнала security.kerberos и security.ldap для обнаружения конкретных сообщений об ошибках в PAL (уровень абстракции платформы). Создайте файл logger.ini, содержащий приведенное ниже содержимое, в папке /var/opt/mssql/log, перезапустите SQL Server, а затем воспроизведите ошибку. Сообщения об отладке и ошибках Active Directory PAL будут регистрироваться в журнале /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, но при инициализации службы AD во время запуска SQL Server может произойти сбой, который в ином случае будет незамеченным. Перезапуск SQL Server гарантирует, что будут записываться все сообщения об ошибках.

Обратите внимание, что журнал безопасности будет записываться на диск до тех пор, пока вы не удалите изменения в logger.ini. Обязательно отключите ведение журнала security.kerberos и security.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, а затем используйте приведенную ниже таблицу для поиска ошибки и следуйте указаниям и рекомендациям по устранению неполадок и решению проблемы.

Распространенные сообщения об ошибках

Сообщение об ошибке: "Вход не выполнен. Имя для входа принадлежит ненадежному домену и не может использоваться в рамках встроенной проверки подлинности."

Возможные причины

Эта ошибка возникает при попытке входа с использованием учетной записи AD после настройки проверки подлинности AD.

Рекомендации по устранению неполадок

Это общее сообщение об ошибке. Чтобы найти конкретное сообщение об ошибке, нужно включить ведение журнала PAL.

Вы можете просмотреть этот список распространенных ошибок для определения возможной причины каждой ошибки, а затем выполнить указания по устранению неполадок, чтобы устранить проблему.

Сообщения об ошибках
Пользователь или группа Windows NT "CONTOSO\user" не найдены.
Не удалось найти краткое доменное имя из-за ошибки
Не удалось выполнить поиск rDNS для узла <hostname> из-за ошибки
FQDN not returned by rDNS lookup (FQDN не возвращено при поиске rDNS)
Failed to bind to LDAP server (Не удалось выполнить привязку к серверу LDAP)
Key table entry not found (Запись в таблице ключей не найдена)
No key table entry found for <principal> (Запись в таблице ключей для не найдена)
Request ticket server <principal> not found in keytab (ticket kvno <KVNO>) (Не удалось найти сервер билетов запросов в keytab (kvno билета ))
Request ticket server <principal> kvno <KVNO> found in keytab but not with enctype <encryption type>(Номер kvno сервера билетов запросов найден в keytab, но не с типом шифрования )
Request ticket server <principal> kvno <KVNO> enctype <encryption type> found in keytab but cannot decrypt ticket (Номер kvno сервера билетов запросов с типом шифрования найден в keytab, но невозможно расшифровать билет)

Сообщение об ошибке: "Пользователь или группа Windows NT "CONTOSO\user" не найдены"

Возможные причины

Эта ошибка может возникать при попытке создания учетных данных Windows или при обновлении группы.

Рекомендации по устранению неполадок

Чтобы проверить эту ошибку, следуйте приведенным указаниям для ошибки "Вход не выполнен. Имя для входа принадлежит ненадежному домену и не может использоваться в рамках встроенной проверки подлинности. (Microsoft SQL Server, ошибка: 18452)". Включите ведение журнала PAL, чтобы найти конкретную ошибку, и устраните соответствующие неполадки.

Сообщение об ошибке: "Не удалось найти краткое доменное имя из-за ошибки"

Возможные причины

Синтаксис Transact-SQL для создания учетных данных AD:

CREATE LOGIN [CONTOSO\user] FROM WINDOWS;

В команде нужно указать имя NetBIOS (CONTOSO), но в серверной части при выполнении подключения LDAP необходимо указать FQDN домена (contoso.com). Чтобы выполнить это преобразование, выполняется поиск CONTOSO в DNS для разрешения в IP-адрес контроллера домена, который затем можно привязать к запросам LDAP.

Рекомендации по устранению неполадок

В сообщении об ошибке "Не удалось найти краткое доменное имя из-за ошибки" предполагается, что команда nslookup для contoso не выполнила разрешение в IP-адрес контроллера домена. Ознакомьтесь с разделом DNS и обратные просмотры DNS, чтобы убедиться, что результат nslookup совпадает для NetBIOS и доменного имени.

Сообщения об ошибках: "Не удалось выполнить поиск rDNS для узла <hostname> из-за ошибки" или "FQDN not returned by rDNS lookup" (Полное доменное имя не возвращено при поиске rDNS)

Возможные причины

Чаще всего это сообщение об ошибке указывает на то, что обратные записи DNS (записи типа PTR) существуют не для всех контроллеров домена.

Рекомендации по устранению неполадок

Просмотрите раздел DNS и обратные просмотры DNS. После выявления контроллеров домена без записей rDNS можно воспользоваться одним из двух вариантов.

  • Добавление записей rDNS для всех контроллеров домена

    Этот вариант не доступен среди параметров SQL Server. Такую настройку необходимо выполнять на уровне домена. Возможно, чтобы создать записи типа PTR для всех контроллеров домена, возвращенных при выполнении команды nslookup для доменного имени, вам потребуется обратиться к команде администрирования домена.

  • Ограничение SQL Server подмножеством контроллеров домена

    Если записи типа PTR невозможно добавить для всех возвращенных контроллеров домена, можно ограничить SQL Server подмножеством контроллеров домена.

Сообщение об ошибке: "Failed to bind to LDAP server ldap://CONTOSO.COM:3268: Local Error" (Не удалось выполнить привязку к серверу LDAP ldap://CONTOSO.COM:3268: локальная ошибка)

Возможные причины

Это общая ошибка из OpenLDAP, но обычно она означает одно из двух:

  • отсутствие учетных данных;
  • проблемы с 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) или FQDN контроллера домена (kdc1.contoso.com). После установки подключения (но до возврата сообщения об успешном подключении вызывающей стороне) библиотека OpenLDAP проверяет IP-адрес сервера, к которому она подключена. Затем выполняется обратный поиск DNS и проверяется, соответствует ли имя сервера, к которому устанавливается подключение (kdc1.contoso.com), домену, для которого было запрошено подключение (contoso.com). Если имя не соответствует, произойдет сбой подключения библиотеки OpenLDAP в целях безопасности. Это частичное объяснение того, почему параметры rDNS так важны для SQL Server на Linux и почему они рассматриваются в этой документации.

Сообщение об ошибке: "Key table entry not found" (Запись в таблице ключей не найдена)

Возможные причины

Эта ошибка указывает на проблемы с доступом к файлу keytab или на отсутствие всех необходимых записей в keytab.

Рекомендации по устранению неполадок

Убедитесь, что файл keytab имеет правильный уровень доступа и разрешения. Расположение по умолчанию и имя для файла keytab — /var/opt/mssql/secrets/mssql.keytab. Чтобы просмотреть текущие разрешения для всех файлов в папке secrets, можно выполнить следующую команду:

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" или подобную ошибку.

Сообщение об ошибке: "No key table entry found for <principal>" (Запись в таблице ключей для не найдена)

Возможные причины

При попытке получить учетные данные <principal> из keytab соответствующие записи не были найдены.

Рекомендации по устранению неполадок

Сведения о том, как получить список всех записей в файле keytab, см. в разделе Проверка файла и разрешений keytab этого документа. Убедитесь в наличии <principal>. Как правило, в качестве учетной записи субъекта здесь используется privilagedadaccount, в которой регистрируются имена субъектов-служб. Если это не так, добавьте ее с помощью команды adutil. Дополнительные сведения см. в статье Настройка проверки подлинности Active Directory в SQL Server на Linux с помощью adutil.

Сообщение об ошибке: "Request ticket server <principal> not found in keytab (ticket kvno <KVNO>)" (Не удалось найти сервер билетов запросов в keytab (kvno билета ))

Возможные причины

Эта ошибка означает, что SQL Server не удалось найти запись keytab для запрошенного билета с указанным KVNO (номер версии ключа).

Рекомендации по устранению неполадок

Сведения о том, как получить список всех записей в файле keytab, см. в разделе Проверка файла и разрешений keytab этого документа. Если не удается найти сообщение об ошибке, соответствующее <principal> и KVNO, добавьте эту запись. Для этого обновите файл keytab с помощью инструкций, приведенных в этой статье.

Можно также выполнить приведенную ниже команду, чтобы получить последний ключ KVNO из контроллера домена. Перед выполнением этой команды необходимо получить или обновить билет предоставления билета (TGT) Kerberos с помощью команды kinit. Дополнительные сведения см. в разделе Создание пользователя AD для SQL Server и задание имени субъекта-службы (SPN) с помощью adutil.

kvno MSSQLSvc/<hostname>

Сообщение об ошибке: "Request ticket server <principal> kvno <KVNO> found in keytab but not with enctype <encryption type>" (Номер kvno сервера билетов запросов найден в keytab, но не с типом шифрования )

Возможные причины

Эта ошибка означает, что тип шифрования, запрошенный клиентом, отсутствовал в файле keytab SQL Server.

Рекомендации по устранению неполадок

Чтобы выполнить проверку, узнайте, как получить список всех записей в файле keytab, в разделе Проверка файла и разрешений keytab этого документа. Если не удается найти сообщение об ошибке, соответствующее субъекту, KVNO и типу шифрования, добавьте эту запись. Для этого обновите файл keytab с помощью инструкций, приведенных в этой статье.

Сообщение об ошибке: "Request ticket server <principal> kvno <KVNO> enctype <encryption type> found in keytab but cannot decrypt ticket" (Номер kvno сервера билетов запросов с типом шифрования найден в keytab, но невозможно расшифровать билет)

Возможные причины

Эта ошибка означает, что SQL Server не удалось использовать учетные данные из файла keytab для расшифровки входящего запроса на проверку подлинности. Ошибка часто возникает из-за неправильного пароля.

Рекомендации по устранению неполадок

Повторно создайте keytab, используя правильный пароль. Если вы используете adutil, выполните инструкции из раздела Настройка проверки подлинности Active Directory в SQL Server на Linux с помощью adutil, чтобы создать keytab с правильным паролем.

Стандартные порты

В этой таблице приведены стандартные порты, используемые SQL Server на Linux для настройки и администрирования проверки подлинности Active Directory.

Служба Active Directory Порт
DNS 53
LDAP 389
LDAPS 636
Kerberos 88

Дальнейшие действия