适用于: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 中的环境与三个虚拟机配合使用。 一台名为adVM.contoso.com
的虚拟机(VM)是一台 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 '<password>'
你可以使用先前所示的可分辨名称 (
--distname
) 指定帐户的名称,也可以使用组织单位 (OU) 名称。 如果同时指定 OU 名称 (--ou
) 和可分辨名称,将优先使用前者。 可运行下面的命令来了解更多详细信息:adutil user create --help
注意
密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。
- 使用密码标志:
向先前创建的主体注册 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 Server 实例侦听默认端口 1433 时,SQL 连接才起作用。
-
使用 mssql-conf 创建 SQL Server 服务密钥表文件
可以安装 adutil 并将其与 mssql-conf 集成,以直接使用 mssql-conf 创建和配置密钥表。 此方法是创建 SQL Server 服务密钥表文件的首选方法。 否则,可以手动创建 SQL Server 服务密钥表文件。
先决条件
确保
mssql
用户拥有/var/opt/mssql/mssql.conf
该文件,而不是root
。 否则,必须使用 mssql-conf 来运行命令sudo
。在域控制器上
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 '<password>' -s MSSQLSvc
注意
密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。
可能的命令行选项包括:
-
-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 '<password>'
注意
密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。
-
-k
:要在其中创建mssql.keytab
文件的路径。 -
-p
:要添加到 keytab 的主体。
adutil keytab [ create | autocreate ]
不会覆盖以前的文件;如果文件已经存在,则它只会追加到其中。-
确保
mssql
用户拥有创建的 keytab,并且只有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 进行连接,请使用 Windows 凭据登录到 SQL Server 实例。
还可以使用 sqlcmd 实用工具 之类的工具通过 Windows 身份验证连接到 SQL Server 实例。
sqlcmd -E -S 'sql1.contoso.com'