Руководство: Настройка проверки подлинности Active Directory в SQL Server в контейнерах Linux

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

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

Note

Текущие рекомендации по настройке сети см. в документации по операционной системе (ОС).

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

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

Prerequisites

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

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

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

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

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

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

Скриншот добавления записи узла.

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

Note

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

Установите adutil

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

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

Если вы не хотите, чтобы узел контейнера был частью домена, и вы не выполнили действия по присоединению компьютера к домену, выполните следующие действия на другой машине 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 и установите имя службы с помощью adutil

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

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

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

    kinit privilegeduser@CONTOSO.COM
    
  2. Используя adutil, создайте нового пользователя, который будет использоваться в качестве привилегированной учетной записи Active Directory SQL Server. Замените <password> допустимым паролем.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password '<password>'
    

    Пароли могут быть указаны любым из трех способов:

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

    Порядок ввода паролей следует последовательности опций, перечисленных выше. Рекомендуемые варианты — вводить пароль с помощью переменной среды или интерактивного входа, так как они безопаснее, чем флаг пароля.

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

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

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto автоматически создаст SPNs, если для учетной записи kinit присутствуют достаточные привилегии.
    • -n: имя учетной записи, которой будут назначены служебные принципалы.
    • -s: имя службы, используемое для создания имен SPN. В этом случае это служба SQL Server, поэтому имя службы — MSSQLSvc.
    • -H: имя узла, используемое для генерации SPN. Если не указано, будет использоваться полностью квалифицированное доменное имя локального хоста (FQDN). Укажите полное доменное имя для имени контейнера. В этом случае имя контейнера — sql1, а полное доменное имя — sql1.contoso.com.
    • -p: порт для генерации имен субъектов обслуживания (SPN). Если это не указано, SPN создаются без порта. Подключения будут работать только в этом случае, если SQL Server прослушивает порт 1433по умолчанию.

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

Создайте файл keytab, содержащий записи для каждого из четырех имен SPN, созданных ранее, а также одну запись для пользователя. Файл keytab будет подключен к контейнеру, поэтому его можно создать в любом месте на узле. Вы можете безопасно изменить этот путь при условии, что получившийся файл keytab правильно смонтирован при развертывании контейнера с помощью Docker или Podman.

Чтобы создать keytab для всех имен главных служб (SPN), можно использовать параметр createauto. Замените <password> допустимым паролем.

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

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

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

adutil keytab createauto --help

Caution

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

Чтобы создать файл keytab для пользователя, команда следующая. Замените <password> допустимым паролем.

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password '<password>'
  • -k: Путь, где вы хотите, чтобы был создан файл mssql.keytab. В предыдущем примере каталог /container/sql1/secrets уже должен существовать на узле.
  • -p: принципал, добавляемый в keytab.

adutil Keytab create и createauto команды не перезаписывают существующий файл. Они добавляют в него записи.

Убедитесь, что созданная вкладка ключей имеет правильные права при развертывании контейнера.

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

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

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

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

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: привилегированный пользователь Active Directory, используемый для проверки подлинности Active Directory.
    • kerberoskeytabfile: путь в контейнере, в котором mssql.keytab будет находиться файл.
  2. krb5.conf Создайте файл, как показано в следующем примере. В этих файлах важен регистр символов.

    [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
    
  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, созданные ранее:

Important

Переменная среды SA_PASSWORD является устаревшей. Вместо этого используйте MSSQL_SA_PASSWORD.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-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

Caution

Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

Когда вы запускаете контейнер на узле с модулем безопасности Linux (LSM), например SELinux, монтируйте тома с помощью параметра Z. Эта опция советует Docker маркировать контент приватной нераспространённой меткой. Дополнительные сведения см. в разделе «Настройка метки SELinux».

Наш пример содержит следующие команды. Замените <password> допустимым паролем.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/:Z \
-v /container/sql1/krb5.conf:/etc/krb5.conf:Z \
--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 Server. Используя следующие команды, создайте логин и убедитесь, что он существует.

Note

Вы можете подключиться к экземпляру SQL Server с помощью любого знакомого клиентского средства SQL Server, например sqlcmd, SQL Server Management Studio (SSMS) или расширения MSSQL для Visual Studio Code.

CREATE LOGIN [contoso\amvin]
    FROM WINDOWS;

SELECT name
FROM sys.server_principals;

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

Вы можете подключиться к экземпляру SQL Server с помощью любого знакомого клиентского средства SQL Server, например sqlcmd, SQL Server Management Studio (SSMS) или расширения MSSQL для Visual Studio Code.

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

В следующей команде показано, как подключиться к контейнеру с помощью sqlcmd.

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

Resources