教程:使用 adutil 为 Linux 上的 SQL Server 配置 Active Directory 身份验证

适用于: SQL Server - Linux

此教程介绍如何使用 adutil 为 Linux 上的 SQL Server 配置 Windows Active Directory 身份验证。 有关使用 ktpass 配置 Active Directory 身份验证的另一种方法,请参阅教程:对 Linux 上的 SQL Server 使用 Active Directory 身份验证

本教程包含以下任务:

  • 安装 adutil
  • 将 Linux 计算机加入 Active Directory 域
  • 使用 adutil 为 SQL Server 创建 Active Directory 用户并设置服务主体名称 (SPN)
  • 创建 SQL Server 服务 keytab(密钥表)文件
  • 配置 SQL Server 以使用 keytab 文件
  • 使用 Transact-SQL 创建基于 Active Directory 的 SQL Server 登录名
  • 通过 Active Directory 身份验证连接到 SQL Server

先决条件

在配置 Active Directory 身份验证之前,需要有:

  • 在网络中运行 Active Directory 域服务的 Windows 域控制器。
  • 安装在加入域的主机上的 adutil 工具。

域计算机准备

确保在 Active Directory 中为 Linux 主机 IP 地址添加了转发主机 (A) 条目。 在本教程中,sql1 主机的 IP 地址为 10.0.0.10。 在下面的示例中,我们在 Active Directory 中添加转发主机条目。 该条目可确保用户连接到 sql1.contoso.com 时可到达正确的主机。

添加主机记录的屏幕截图。

对于本教程,我们将在 Azure 中使用具有三个虚拟机 (VM) 的环境。 一个 VM 是名为 adVM.contoso.com 的 Windows Server 计算机,它作为域名为 contoso.com 的域控制器 (DC) 运行。 第二个 VM 是名为 winbox 的运行 Windows 10 的客户端计算机,它安装了 SQL Server Management Studio (SSMS)。 第三台计算机是名为 sql1 的 Ubuntu 18.04 LTS 计算机,它承载了 SQL Server。

将 Linux 主机加入 Active Directory 域

若要将 sql1 加入 Active Directory 域,请参阅将 Linux 主机上的 SQL Server 加入 Active Directory 域

安装 adutil

若要安装 adutil,请在前面步骤中加入域的主机上按照文章 adutil - Active Directory 实用工具简介中所述的步骤操作。

使用 adutil 为 SQL Server 创建 Active Directory 用户并设置服务主体名称 (SPN)

  1. 使用 kinit 命令获取或续订 Kerberos TGT(票证授予票证)。 必须为 kinit 命令使用特权帐户,并且主机应该已经是域的一部分。 此帐户需要具有连接到域以及在域中创建帐户和 SPN 的权限。

    在此示例脚本中,已经在域控制器上创建了名为 privilegeduser@CONTOSO.COM 的特权用户。

    kinit privilegeduser@CONTOSO.COM
    
  2. 使用 adutil,创建将由 SQL Server 用作特权 Active Directory 帐户的新用户。

    可以通过三种不同的方式指定密码。 如果使用这些方法中的多种方法,它们的优先顺序如下:

    • 使用密码标志:--password <password>
    • 在环境变量中:ADUTIL_ACCOUNT_PWD
    • 命令行提示符处的交互式输入

    环境变量或交互式输入方法比密码标志更安全。

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

    你可以使用先前所示的可分辨名称 (--distname) 指定帐户的名称,也可以使用组织单位 (OU) 名称。 如果同时指定 OU 名称 (--ou) 和可分辨名称,将优先使用前者。 可运行下面的命令来了解更多详细信息:

    adutil user create --help
    
  3. 向先前创建的主体注册 SPN。 必须使用计算机的完全限定的域名 (FQDN)。 在本教程中,我们将使用 SQL Server 的默认端口 1433。 你的端口号可能不同。

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 1433
    
    • addauto 将自动创建 SPN,前提是 kinit 帐户具有足够的权限。
    • -n:用于分配 SPN 的帐户的名称。
    • -s:用于生成 SPN 的服务名称。 在本例中,它用于 SQL Server 服务,这就是服务名称为 MSSQLSvc 的原因。
    • -H:用于生成 SPN 的主机名。 如果未指定,则使用本地主机的 FQDN。 在本例中,主机名为 sql1,FQDN 为 sql1.contoso.com
    • -p:用于生成 SPN 的端口。 如果未指定,则在没有端口的情况下生成 SPN。 SQL 连接仅在 SQL Server 侦听默认端口 1433 时才有效。

使用 mssql-conf 创建 SQL Server 服务密钥表文件

可以安装 adutil 并将其与 mssql-conf 集成,以直接使用 mssql-conf 创建和配置密钥表。 此方法是创建 SQL Server 服务密钥表文件的首选方法。 否则,可以手动创建 SQL Server 服务密钥表文件

先决条件

  1. 请确保 /var/opt/mssql/mssql.conf 文件由 mssql 而不是 root 拥有。 如果不是这样,必须使用 sudo 运行 mssql-conf 命令。

  2. 在域控制器上 network.privilegedadaccount 帐户(在这些示例中为 sqluser@CONTOSO.COM)的 Active Directory 设置中,在“帐户”选项卡下的“帐户选项”部分启用以下选项:

    • 此帐户支持 Kerberos AES 128 位加密
    • 此帐户支持 Kerberos AES 256 位加密

创建密钥表文件

创建用户和 SPN 后,可以使用以下步骤创建密钥表。

  1. 切换到 mssql 用户:

    su mssql
    
  2. 使用 kinit 命令,以 Active Directory 用户身份登录:

    kinit privilegeduser@CONTOSO.COM
    
  3. 创建密钥表文件:

    /opt/mssql/bin/mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser
    

    系统提示重启 SQL Server 服务以采用新的 Active Directory 配置时,可在下一部分执行此操作。

  4. 确认已使用正确的条目创建密钥表:

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

    此时应会看到如下例所示的输出:

    keytab name: FILE:/var/opt/mssql/secrets/mssql.keytab
    KVNO Timestamp           Principal
    ---- ------------------- ------------------------------------------------------
       4 12/30/2021 14:02:08 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       4 12/30/2021 14:02:08 MSSQLSvc/sql1@CONTOSO.COM (aes256-cts-hmac-sha1-96)
    

    如果 /var/opt/mssql/mssql.conf 文件不由 mssql 拥有,则必须根据前面的步骤配置 mssql-conf 以设置 network.kerberoskeytabfilenetwork.privilegedadaccount 值。 出现提示时,键入密码。

    /opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    /opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser
    
  5. 验证配置,确保 Active Directory 身份验证正常工作,不会出现任何问题。

    /opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
    

    应会看到与如下示例类似的输出:

    Detected Configuration:
    Default Realm: CONTOSO.COM
    Keytab: /var/opt/mssql/secrets/mssql.keytab
    Reverse DNS Result: sql1.contoso.com
    SQL Server Port: 1433
    Detected SPNs (SPN, KVNO):
    (MSSQLSvc/sql1.CONTOSO.COM:1433, 4)
    (MSSQLSvc/sql1.CONTOSO.COM, 4)
    (MSSQLSvc/sql1:1433, 4)
    (MSSQLSvc/sql1, 4)
    Privileged Account (Name, KVNO):
    (sqluser, 4)
    

手动创建 SQL Server 服务密钥表文件

如果安装了 adutil 并将其与 mssql-conf 集成,可以跳到使用 mssql-conf 创建 SQL Server 服务密钥表文件

  1. 创建 keytab 文件,使其包含分别对应于之前创建的 4 个 SPN 的条目,以及一个对应于用户的条目。

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

    可能的命令行选项包括:

    • -k:在其中创建 mssql.keytab 文件的路径。 在之前的示例中,目录 /var/opt/mssql/secrets/ 应该已经存在于主机上。
    • -p:用于生成 SPN 的端口。 如果未指定,则在没有端口的情况下生成 SPN。
    • -H:用于生成 SPN 的主机名。 如果未指定,则使用本地主机的 FQDN。 在本例中,主机名为 sql1,FQDN 为 sql1.contoso.com
    • -s:用于生成 SPN 的服务名称。 对于此示例,SQL Server 服务名称为 MSSQLSvc
    • --password:之前创建的特权 Active Directory 用户帐户的密码。
    • -e--enctype:keytab 条目的加密类型。 使用以逗号分隔的值列表。 如果未指定,将显示交互式提示。

    只要主机和域支持加密类型,你便可以选择多个加密类型。 在此示例中,可以选择 aes256-cts-hmac-sha1-96aes128-cts-hmac-sha1-96。 但是,应避免在生产环境中使用 arcfour-hmac,因为它的加密较弱。

    如果要在没有提示的情况下选择加密类型,可以在上述命令中使用 -e 参数指定所选择的加密类型。 有关 adutil keytab 选项的更多帮助,请运行以下命令:

    adutil keytab createauto --help
    
  2. 在密钥表中为主体名称和密码添加一个条目,SQL Server 将使用该条目连接到 Active Directory:

    adutil keytab create -k /var/opt/mssql/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
    
    • -k:要在其中创建 mssql.keytab 文件的路径。
    • -p:要添加到 keytab 的主体。

    adutil keytab [ create | autocreate ] 不会覆盖以前的文件;如果文件已经存在,则它只会追加到其中。

  3. 确保创建的 keytab 由 mssql 用户拥有,并且只有 mssql 用户具有该文件的读/写访问权限。 可以运行 chownchmod 命令,如下所示:

    chown mssql /var/opt/mssql/secrets/mssql.keytab
    chmod 440 /var/opt/mssql/secrets/mssql.keytab
    

配置 SQL Server 以使用 keytab

运行以下命令,将 SQL Server 配置为使用上一步中创建的密钥表,并将特权 Active Directory 帐户设置为先前创建的用户。 在本示例中,用户名为 sqluser

/opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
/opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser

重新启动 SQL Server

运行以下命令以重启 SQL Server 服务:

sudo systemctl restart mssql-server

在 Transact-SQL 中创建基于 Active Directory 的 SQL Server 登录名

连接到 SQL Server,运行以下命令以创建登录名,并确认它存在。

CREATE LOGIN [contoso\privilegeduser] FROM WINDOWS;
SELECT name FROM sys.server_principals;

通过 Active Directory 身份验证连接到 SQL Server

若要使用 SSMSAzure Data Studio 进行连接,请使用 Windows 凭据登录到 SQL Server。

还可以使用 sqlcmd 等工具通过 Windows 身份验证连接到 SQL Server。

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