教程:使用 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)
使用
kinit
命令获取或续订 Kerberos TGT(票证授予票证)。 必须为kinit
命令使用特权帐户,并且主机应该已经是域的一部分。 此帐户需要具有连接到域以及在域中创建帐户和 SPN 的权限。在此示例脚本中,已经在域控制器上创建了名为
privilegeduser@CONTOSO.COM
的特权用户。kinit privilegeduser@CONTOSO.COM
使用 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
- 使用密码标志:
向先前创建的主体注册 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 服务密钥表文件。
先决条件
请确保
/var/opt/mssql/mssql.conf
文件由mssql
而不是root
拥有。 如果不是这样,必须使用sudo
运行 mssql-conf 命令。在域控制器上
network.privilegedadaccount
帐户(在这些示例中为sqluser@CONTOSO.COM
)的 Active Directory 设置中,在“帐户”选项卡下的“帐户选项”部分启用以下选项:- 此帐户支持 Kerberos AES 128 位加密
- 此帐户支持 Kerberos AES 256 位加密
创建密钥表文件
创建用户和 SPN 后,可以使用以下步骤创建密钥表。
切换到
mssql
用户:su mssql
使用
kinit
命令,以 Active Directory 用户身份登录:kinit privilegeduser@CONTOSO.COM
创建密钥表文件:
/opt/mssql/bin/mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser
系统提示重启 SQL Server 服务以采用新的 Active Directory 配置时,可在下一部分执行此操作。
确认已使用正确的条目创建密钥表:
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.kerberoskeytabfile 和 network.privilegedadaccount 值。 出现提示时,键入密码。/opt/mssql/bin/mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab /opt/mssql/bin/mssql-conf set network.privilegedadaccount sqluser
验证配置,确保 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 服务密钥表文件。
创建 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-96
和aes128-cts-hmac-sha1-96
。 但是,应避免在生产环境中使用arcfour-hmac
,因为它的加密较弱。如果要在没有提示的情况下选择加密类型,可以在上述命令中使用
-e
参数指定所选择的加密类型。 有关adutil keytab
选项的更多帮助,请运行以下命令:adutil keytab createauto --help
在密钥表中为主体名称和密码添加一个条目,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 ]
不会覆盖以前的文件;如果文件已经存在,则它只会追加到其中。确保创建的 keytab 由
mssql
用户拥有,并且只有mssql
用户具有该文件的读/写访问权限。 可以运行chown
和chmod
命令,如下所示: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
若要使用 SSMS 或 Azure Data Studio 进行连接,请使用 Windows 凭据登录到 SQL Server。
还可以使用 sqlcmd 等工具通过 Windows 身份验证连接到 SQL Server。
sqlcmd -E -S 'sql1.contoso.com'