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

Применимо к:SQL Server — Linux

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

Проверка текущей конфигурации

Прежде чем приступить к устранению неполадок, необходимо проверить текущего пользователя, mssql.confимя субъекта-службы (SPN) и параметры области.

  1. Получение или продление TGT Kerberos (билет на предоставление билетов) с помощью 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. В результате поисков 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. Дополнительные сведения см. в статье "Использование adutil" для настройки проверки подлинности Active Directory с помощью SQL Server на Linux.

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

    klist -kte /var/opt/mssql/secrets/mssql.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

После создания пользователя, имени субъекта-службы и ключей и настройки mssql-conf можно увидеть правильность конфигурации Active Directory для 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/, перезапустите 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, но ошибки могут возникать во время инициализации службы Active Directory во время запуска 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журнала, а затем используйте следующую таблицу, чтобы найти ошибку и следуйте инструкциям и рекомендациям по устранению неполадок и устранению этой проблемы.

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

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

Возможная причина

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

Руководство

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

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

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

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

Возможная причина

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

Руководство

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

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

Возможная причина

Синтаксис Transact-SQL для создания имени входа Active Directory:

CREATE LOGIN [CONTOSO\user] FROM WINDOWS;

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

Руководство

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

Сообщения об ошибках: "Не удалось выполнить поиск rDNS для узла <имя_узла> из-за ошибки" или "Поиск rDNS не возвратил полное доменное имя"

Возможная причина

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

Руководство

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

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

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

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

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

Сообщение об ошибке: "Не удалось привязаться к серверу 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, и почему они рассматриваются в этой документации.

Сообщение об ошибке: "Запись таблицы ключей не найдена"

Возможная причина

Эта ошибка указывает на проблемы с доступом к файлу 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"

Сообщение об ошибке: "Не найдена запись keytab для <principal>"

Возможная причина

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

Руководство

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

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

Возможная причина

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

Руководство

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

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

kvno MSSQLSvc/<hostname>

Сообщение об ошибке: "Номер kvno <KVNO> сервера билетов запросов <principal> найден в keytab, но не с типом шифрования <тип_шифрования>"

Возможная причина

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

Руководство

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

Сообщение об ошибке: "Запрос субъекта-сервераа <> kvno <KVNO> enctype <type,> найденный в 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