Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server в Linux
Эта статья поможет устранить проблемы с проверкой подлинности служб домена Active Directory при работе с SQL Server на Linux и в контейнерах. В статье представлены проверки соблюдения предварительных требований и рекомендации по успешной настройке Active Directory, а также список распространенных ошибок и шаги по устранению неполадок.
Проверка текущей конфигурации
Перед началом устранения неполадок проверьте текущий пользователь mssql.conf, имя главного сервиса (SPN) и настройки сервера.
Получите или продлите билет Kerberos TGT (билет выдачи билетов) с помощью
kinitследующих методов:kinit privilegeduser@CONTOSO.COMВыполните следующую команду и убедитесь, что пользователь, использующий её, имеет доступ к
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-запросы
В результате поисков DNS по доменному имени и имени NetBIOS должен возвращаться один и тот же IP-адрес, который обычно соответствует IP-адресу для контроллера домена (DC). Выполните эти команды с хост-компьютера SQL Server.
nslookup contoso nslookup contoso.comЕсли IP-адреса не совпадают, см. статью Присоединение SQL Server на узле Linux к домену Active Directory, чтобы устранить проблемы при операциях поиска DNS и обмене данными с контроллером домена.
Выполните обратный 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 и разрешений
Проверьте, что вы создали файл keytab (key table) и настроили
mssql-confиспользовать правильный файл с соответствующими правами. Файл keytab должен быть доступен для учетной записи пользователяmssql. Дополнительные сведения см. в статье "Использование adutil" для настройки проверки подлинности Active Directory с помощью SQL Server на Linux.Убедитесь, что вы можете перечислить содержимое keytab, и что вы добавили правильные SPN, порт, тип шифрования и учетную запись пользователя. Если вы неправильно вводите пароли при создании SPN и вкладок клавиш, возникают ошибки при попытке войти с помощью аутентификации 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 /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
В
krb5.conf(расположенном по адресу/etc/krb5.conf), убедитесь, что вы указываете значения для области по умолчанию, информации о области и сопоставления домена с областью. Ознакомьтесь с следующим примеромkrb5.confфайла. Дополнительные сведения см. в статье "Общие сведения о проверке подлинности Active Directory для SQL Server на Linux и контейнеров".[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Можно настроить ограничение, чтобы SQL Server контактировал с подмножеством контроллеров домена, что полезно, если конфигурация DNS возвращает больше контроллеров домена, чем SQL Server нужно для взаимодействия. SQL Server на Linux позволяет задавать список контроллеров домена, к которым SQL Server взаимодействует по круговой системе при выполнении поиска по Lightweight Directory Access Protocol (LDAP).
Выполните эти два шага. Сначала измените
krb5.confданные, добавив нужные доменные контроллеры с префиксомkdc =.[realms] CONTOSO.COM = { kdc = kdc1.contoso.com kdc = kdc2.contoso.com .. .. }Файл является обычным клиентским конфигурационным файлом Kerberos, поэтому любые изменения,
krb5.confкоторые вы внесёте в этот файл, влияют на другие сервисы, помимо 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
После создания пользователя, SPN и клавиатуры, а также настройки mssql-conf— проверьте конфигурацию Active Directory.
Чтобы проверить конфигурацию SQL Server на Linux, используйте привилегированный аккаунт для получения или продления 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, основанное на безопасности
Для выявления конкретных сообщений об ошибках в PAL (Слое абстракции платформы) включите security.kerberos и security.ldap ведите лог. Создайте 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
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.
Guidance
Это универсальное сообщение об ошибке требует включения ведения журнала PAL для выявления конкретной ошибки.
Смотрите следующий список распространённых ошибок, чтобы определить возможную причину каждой ошибки, а затем следуйте рекомендациям по устранению неполадок для её устранения.
Сообщение об ошибке: пользователь или группа Windows NT "CONTOSO\user" не найден
Возможная причина
Эта ошибка может возникнуть при попытке создать логин Windows или во время обновления группы.
Guidance
Чтобы проверить проблему, следуйте инструкции «Вход не выполнен. Имя для входа принадлежит ненадежному домену и не может использоваться в рамках встроенной проверки подлинности. (Microsoft SQL Server, Ошибка: 18452)» и включить PAL логирование для выявления конкретной ошибки и соответствующего устранения неполадок.
Сообщение об ошибке: "Не удалось найти короткое доменное имя из-за ошибки"
Возможная причина
Синтаксис Transact-SQL для создания имени входа Active Directory:
CREATE LOGIN [CONTOSO\user]
FROM WINDOWS;
Имя NetBIOS (CONTOSO) требуется в команде, но FQDN домена (contoso.com) должен быть указан в бэкенде при выполнении LDAP-соединения. Чтобы выполнить это преобразование, выполняется запрос в DNS для CONTOSO с целью разрешения в IP-адрес доменного контроллера, к которому затем можно привязаться для LDAP-запросов.
Guidance
Сообщение об ошибке «Не удалось найти короткое доменное имя из-за ошибки» говорит о том, что nslookup For contoso не разрешается с IP-адресом контроллера домена. Проверьте DNS и обратный DNS-поиск , чтобы подтвердить nslookup это как для NetBIOS, так и для совпадения доменных имен.
Сообщения об ошибках: "Не удалось выполнить поиск rDNS для имени узла <из-за ошибки" или "полное доменное имя> не возвращено запросом rDNS".
Возможная причина
Эти сообщения об ошибках обычно указывают на то, что обратные DNS-записи (PTR-записи) не существуют для всех контроллеров домена.
Guidance
Проверьте запросы 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
Guidance
Отсутствие учетных данных
Другие сообщения об ошибках появляются первыми, если учетные данные не загружаются для LDAP-соединений. Включите PAL логирование и проверьте журнал ошибок на наличие сообщений об ошибках перед этим. Если других ошибок нет, скорее всего, проблема не связана с учетными данными. Если найдёте ошибку, исправьте её, прежде чем двигаться дальше. В большинстве случаев это одно из сообщений об ошибках, которые затрагивает статья.
Проблемы с rDNS
Проверьте запросы DNS и обратные DNS-запросы.
Когда библиотека OpenLDAP подключается к контроллеру домена, она предоставляет либо полностью квалифицированное доменное имя (FQDN), что в данном примере —
contoso.com, либо FQDN DC (kdc1.contoso.com). После установления соединения (но до возвращения успешного сигнала вызывающему) библиотека OpenLDAP проверяет IP сервера, к которому она подключилась. Затем он выполняет обратный DNS-поиск и проверяет, совпадает ли имя сервера, к которому он подключён (kdc1.contoso.com), запрашиваемому домену (contoso.com). Если идентификатор не соответствует, библиотека OpenLDAP не удается установить соединение в качестве функции безопасности. Это несоответствие — одна из причин, почему настройки rDNS важны для SQL Server на Linux, и они являются основной темой этой статьи.
Сообщение об ошибке: "Запись таблицы ключей не найдена"
Возможная причина
Эта ошибка указывает на проблемы с доступом к файлу keytab или отсутствующие записи в keytab.
Guidance
Убедитесь, что файл 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".
Сообщение об ошибке: "Не найдена запись в таблице ключей для <principal>"
Возможная причина
Когда вы пытаетесь получить учетные данные через <principal> вкладку клавиш, вы не находите подходящих записей.
Guidance
Чтобы вывести список всех записей в keytab, следуйте разделу «Проверьте файл keytab и разрешения» этой статьи. Убедитесь в наличии <principal>. В этом случае основной счет обычно является тем, network.privilegedadaccount на который вы регистрируете SPN. Если нет — добавьте его с командой adutil . Дополнительные сведения см. в статье "Использование adutil" для настройки проверки подлинности Active Directory с помощью SQL Server на Linux.
Сообщение об ошибке: "Не удалось найти сервер запроса билетов <principal> в keytab (kvno билета <KVNO>)"
Возможная причина
Эта ошибка указывает на то, что SQL Server не может найти запись в keytab для запрашиваемого тикета с указанным номером версии ключа (KVNO).
Guidance
Чтобы вывести список всех записей в keytab, следуйте разделу «Проверьте файл keytab и разрешения» этой статьи. Если вы не можете найти сообщение об ошибке, совпадающее с <principal> KVNO, обновите файл keytab, чтобы добавить эту запись, следуя действиям из этого раздела.
Можно также выполнить приведенную ниже команду, чтобы получить последний ключ KVNO из контроллера домена. Перед запуском этой команды получите или продлите Kerberos TGT с помощью этой kinit команды. Дополнительные сведения см. в статье «Использование adutil для создания пользователя Active Directory для SQL Server и задания имени службы (SPN)».
kvno MSSQLSvc/<hostname>
Сообщение об ошибке: "Запрос на сервер билетов <principal> с kvno <KVNO> найден в keytab, но не с <типом шифрования>"
Возможная причина
Эта ошибка означает, что вкладка ключей SQL Server не содержит запроса клиента типа шифрования.
Guidance
Для проверки перейдите к разделу «Проверить вкладку клавиш и разрешения » этой статьи, чтобы перечислить все записи в этой вкладке. Если вы не можете найти сообщение об ошибке, соответствующее принципуальному, KVNO и типу шифрования, обновите файл keytab, чтобы добавить эту запись, следуя шагам из этого раздела.
Сообщение об ошибке: "Сервер запросов билетов <principal>, kvno <KVNO>, тип шифрования <encryption type> найден в keytab, но не удается расшифровать билет"
Возможная причина
Это сообщение об ошибке указывает на то, что SQL Server не может использовать учетную запись из файла keytab для расшифровки входящего запроса аутентификации. Неправильный пароль часто вызывает эту ошибку.
Guidance
Заново создайте клавиатуру с правильным паролем. Если вы используете adutil, создайте keytab с правильным паролем и следуйте шагам из туториала: используйте adutil для настройки аутентификации Active Directory с помощью SQL Server на Linux.
Стандартные порты
В этой таблице показаны распространённые порты, которые SQL Server на Linux использует для настройки и администрирования аутентификации Active Directory.
| Служба Active Directory | Порт |
|---|---|
| DNS | 53 |
| LDAP | 389 |
| LDAPS | 636 |
| Kerberos | 88 |