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

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

В этом руководстве рассматриваются следующие задачи:

  • Установка adutil
  • Присоединение узла Linux к домену Active Directory
  • Создание пользователя Active Directory для SQL Server и настройка свойства ServicePrincipalName (имени субъекта-службы) с помощью программы adutil
  • Создание файла keytab службы SQL Server
  • Создание файлов mssql.conf и krb5.conf, которые будут использоваться контейнером SQL Server
  • Подключение файлов конфигурации и развертывание контейнера SQL Server
  • Создание имен входа SQL Server на основе Active Directory с помощью Transact-SQL
  • Подключение к SQL Server с помощью проверки подлинности Active Directory

Предварительные условия

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

  • В сети должен быть контроллер домена Active Directory (Windows).
  • Установите средство adutil на хост-компьютере Linux, присоединенном к домену. Дополнительные сведения см. в разделе Установка adutil ниже.

Развертывание и подготовка контейнера

При настройке контейнера необходимо заранее знать порт, который будет использоваться контейнером на узле. Порт по умолчанию 1433 может быть сопоставлен по-иному на вашем узле контейнера. В этом учебнике порт 5433 на узле сопоставляется с портом 1433 контейнера. Дополнительные сведения см. в кратком руководстве Запуск образов контейнеров SQL Server в Docker.

При регистрации имен субъектов-служб можно использовать имя узла компьютера или имя контейнера, но необходимо настроить его так, как оно должно выглядеть при подключении к контейнеру извне.

В Active Directory должна быть добавлена запись узла переадресации (A) для IP-адреса узла Linux, сопоставленного с именем контейнера SQL Server. В этом учебнике IP-адрес хост-компьютера myubuntu — 10.0.0.10, а имя контейнера SQL Server — sql1. Мы добавим указанную ниже запись узла переадресации в Active Directory. Эта запись гарантирует, что при подключении пользователей к sql1.contoso.com они будут обращаться к нужному узлу.

добавление записи узла

В этом учебнике используется среда Azure с тремя виртуальными машинами. Первая виртуальная машина выступает в роли контроллера домена Windows с доменным именем contoso.com. Контроллер домена имеет имя adVM.contoso.com. Вторая машина — это компьютер Windows с именем winbox. На нем установлена ОС Windows 10 Desktop, и он используется в качестве клиента со средой SQL Server Management Studio (SSMS). Третья машина — это компьютер с Ubuntu 18.04 LTS. Он имеет имя myubuntu, и в нем размещаются контейнеры SQL Server. Все машины присоединены к домену contoso.com. Дополнительные сведения см. в статье Присоединение SQL Server на узле Linux к домену Active Directory.

Примечание

Присоединять компьютер, в котором размещаются контейнеры, к домену необязательно, как станет понятно далее в этой статье.

Установка adutil

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

Создание пользователя Active Directory, имен субъектов-служб и файла keytab службы SQL Server

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

  1. Создайте пользователя Active Directory для SQL Server и задайте имя субъекта-службы с помощью программы adutil.

  2. Создайте и настройте файл keytab службы SQL Server.

Скопируйте созданный файл mssql.keytab на хост-компьютер, на котором будет выполняться контейнер SQL Server, и настройте контейнер так, чтобы он использовал скопированный файл mssql.keytab. При необходимости можно также присоединить узел Linux, на котором будет выполняться контейнер SQL Server, к домену Active Directory и выполнить приведенные ниже действия на том же компьютере.

Создание пользователя Active Directory для SQL Server и настройка свойства ServicePrincipalName с помощью программы adutil

Чтобы включить проверку подлинности Active Directory для контейнеров SQL Server на Linux, необходимо выполнить описанные ниже шаги 1–3 на компьютере Linux, входящем в домен Active Directory.

  1. Получите или продлите билет предоставления билета (TGT) Kerberos с помощью команды kinit. Для выполнения команды kinit используйте привилегированную учетную запись. Учетная запись должна иметь разрешение на подключение к домену, а также возможность создавать учетные записи и имена субъектов-служб в домене.

    В этом примере скрипта в контроллере домена уже был создан привилегированный пользователь privilegeduser@CONTOSO.COM.

    kinit privilegeduser@DOMAIN.COM
    
  2. С помощью программы adutil создайте пользователя, который будет выступать в роли привилегированной учетной записи Active Directory для SQL Server.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

    Примечание

    Пароли можно задавать тремя способами:

    • флаг пароля: --password <password>;
    • переменные среды: ADUTIL_ACCOUNT_PWD;
    • интерактивный ввод.

    Эти способы перечислены в порядке их приоритета. Рекомендуется указывать пароли с помощью переменных среды или интерактивного ввода, так как эти способы более безопасны по сравнению с флагом password.

    В качестве имени учетной записи можно указать различающееся имя (-distname), как показано выше, или имя подразделения. Если указаны оба имени, имя подразделения (--ou) имеет приоритет над различающимся именем. Чтобы получить дополнительные сведения, можно выполнить следующую команду:

    adutil user create --help
    
  3. Зарегистрируйте имена субъектов-служб для созданного ранее пользователя. При необходимости можно использовать имя хост-компьютера вместо имени контейнера. Это зависит от того, как подключение должно представляться извне. В этом учебнике вместо порта 1433 используется порт 5433. Это сопоставление портов для контейнера. В вашем случае номер порта может быть другим.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    

    Примечание

    • addauto автоматически создаст имена субъектов-служб при наличии достаточных прав у учетной записи kinit.
    • -n. Имя учетной записи, которой будут назначены имена субъектов-служб.
    • -s. Имя службы, используемое для создания имен субъектов-служб. В этом случае они предназначены для службы SQL Server, поэтому имя службы — MSSQLSvc.
    • -H. Имя узла, используемое для создания имен субъектов-служб. Если не указать, будет использоваться полное доменное имя локального узла. Укажите также полное доменное имя для имени контейнера. В этом случае имя контейнера — sql1, а полное доменное имя — sql1.contoso.com.
    • -p. Порт, используемый для создания имен субъектов-служб. Если не указать, имена субъектов-служб будут создаваться без порта. Подключения SQL будут работать в этом случае, только если SQL Server прослушивает порт по умолчанию 1433.

Создание файла keytab службы SQL Server

Создайте файл keytab, содержащий записи для каждого из четырех созданных ранее имен субъектов-служб и одну запись для пользователя. Файл keytab будет подключен к контейнеру, поэтому его можно создать в любом месте на узле. Путь можно спокойно изменять при условии, что итоговый файл keytab будет правильно подключен при использовании docker/podman для развертывания контейнера.

Чтобы создать файл keytab для всех имен субъектов-служб, можно использовать параметр createauto:

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc

Примечание

  • -k. Путь, по которому необходимо создать файл mssql.keytab. В приведенном выше примере каталог /container/sql1/secrets уже должен существовать на узле.
  • -p. Порт, используемый для создания имен субъектов-служб. Если не указать, имена субъектов-служб будут создаваться без порта.
  • -H. Имя узла, используемое для создания имен субъектов-служб. Если не указать, будет использоваться полное доменное имя локального узла. Укажите также полное доменное имя для имени контейнера. В этом случае имя контейнера — sql1, а полное доменное имя — sql1.contoso.com.
  • -s. Имя службы, используемое для создания имен субъектов-служб. В этом случае они предназначены для службы SQL Server, поэтому имя службы — MSSQLSvc.
  • --password. Пароль созданной ранее привилегированной учетной записи пользователя Active Directory.
  • -e или --enctype: Типы шифрования для записи в файле keytab. Используйте разделенный запятыми список значений. Если этот параметр не указан, будет выводиться интерактивный запрос.

Если есть возможность выбрать типы шифрования, то можно выбрать несколько. В этом примере выбраны aes256-cts-hmac-sha1-96 и arcfour-hmac. Выбранный тип шифрования должен поддерживаться узлом и доменом.

Чтобы выбрать тип шифрования в неинтерактивном режиме, можно указать его с помощью аргумента -e в приведенной выше команде. Чтобы получить дополнительные сведения о командах adutil, выполните приведенную ниже команду.

adutil keytab createauto --help

Примечание

arcfour-hmac — это слабое шифрование, поэтому его не рекомендуется использовать в рабочей среде.

Чтобы создать запись keytab для пользователя, выполните следующую команду:

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'

Примечание

  • -k. Путь, по которому необходимо создать файл mssql.keytab. В приведенном выше примере каталог /container/sql1/secrets уже должен существовать на узле.
  • -p. Субъект, добавляемый в файл keytab.

При создании файла keytab с помощью adutil, в том числе в автоматическом режиме, предыдущие файлы не перезаписываются. Новые записи просто добавляются в существующий файл.

У создаваемого файла keytab должны быть соответствующие разрешения при развертывании контейнера.

chmod 440 /container/sql1/secrets/mssql.keytab

Примечание

На данном этапе можно скопировать файл mssql.keytab с текущего узла Linux на узел Linux, где будет развернут контейнер SQL Server, и выполнить остальные действия на этом узле. Если описанные выше действия были выполнены на узле Linux, где будут развернуты контейнеры SQL, выполните следующие действия на том же узле.

Создание файлов конфигурации, которые будут использоваться контейнером SQL Server

  1. Создайте файл mssql.conf с параметрами Active Directory. Его можно создать в любом месте на узле, но нужно правильно подключить при выполнении команды docker run. В этом примере файл mssql.conf был помещен в каталог /container/sql1, то есть каталог контейнера. Содержимое файла mssql.conf показано ниже:

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    

    Примечание

    • privilagedadaccount. Привилегированный пользователь AD, используемый для проверки подлинности AD.
    • kerberoskeytabfile. Путь в контейнере, где будет находиться файл mssql.keytab.
  2. Создайте файл krb5.conf. Ниже приведен пример. В этих файлах регистр учитывается.

    [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
    
  3. Скопируйте все файлы, mssql.conf, krb5.conf, mssql.keytab в расположение, которое будет подключено к контейнеру SQL Server. В этом примере такие файлы размещаются на узле в следующих расположениях: mssql.conf и krb5.conf в /container/sql1/. mssql.keytab размещается в расположении /container/sql1/secrets/.

  4. Убедитесь, что пользователь, выполняющий команду docker или podman, имеет достаточные права для этих папок. При запуске контейнера пользователю потребуется доступ к созданному пути к папке. В этом примере мы предоставили следующие права к пути к папке:

    sudo chmod 755 /container/sql1/
    

Подключение файлов конфигурации и развертывание контейнера SQL Server

Запустите контейнер SQL Server и подключите соответствующие файлы конфигурации Active Directory, которые были созданы ранее, как показано ниже.

sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=\<YourStrong@Passw0rd\>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

Примечание

При запуске контейнера в LSM (модуль безопасности Linux), например на узлах с системой SELinux, необходимо подключить тома с использованием параметра Z, который предписывает docker применить к содержимому метку закрытых данных без общего доступа. Дополнительные сведения см. в разделе о настройке метки selinux.

Наш пример включает следующие команды:

sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest

Примечание

  • Файлы mssql.conf и krb5.conf находятся на узле по пути /container/sql1.
  • Созданный файл mssql.keytab находится на узле по пути /container/sql1/secrets.
  • Так как хост-компьютер находится в Azure, данные Active Directory должны быть добавлены в команду docker run в том же порядке. В нашем примере контроллер домена adVM находится в домене contoso.com с IP-адресом 10.0.0.4. В контроллере домена выполняются службы DNS и KDC.

Создание имен входа SQL Server на основе Active Directory с помощью Transact-SQL

Подключитесь к контейнеру SQL и выполните приведенные ниже команды, чтобы создать имя входа, а затем проверьте, приводится ли оно в списке. Эту команду можно выполнить на клиентском компьютере (Windows или Linux) с SSMS, Azure Data Studio (ADS) или любым другим интерфейсом командной строки (CLI).

create login [contoso\amvin] From Windows
SELECT name FROM sys.server_principals;

Подключение к SQL Server с помощью проверки подлинности Active Directory

Чтобы подключиться с помощью SSMS или ADS, войдите в SQL Server с учетными данными Windows, используя имя SQL Server (имя контейнера или имя узла) и номер порта. В нашем примере имя сервера — sql1.contoso.com, 5433.

Для подключения к SQL Server в контейнере можно также использовать такое средство, как sqlcmd.

sqlcmd -E -S 'sql1.contoso.com, 5433'

Ресурсы

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