轮换 Linux 上的 SQL Server 的密钥表

适用于:SQL Server - Linux

根据组织的最佳安全做法,可能需要定期轮换作为 mssql.conf 中的 network.privilegedadaccount 提供的 Windows Active Directory 帐户的密码,或者轮换拥有 SQL Server 服务的服务主体名称 (SPN) 的任何其他帐户的密码。 本文介绍用于更改帐户密码的受支持的方法。 密码更改生效,无需重启 Linux 上的 SQL Server 服务。

adutil 工具用于更新密钥表。 adutil 命令必须从加入域的计算机运行。 有关 adutil 以及如何下载该工具的信息,请参阅 adutil 简介 - Active Directory 实用工具

在 Active Directory 中更新新密码之前,请务必使用下一个 kvno 数值更新密钥表中的新密码。 使用下一个 kvno 数值,可以防止修改密码后重新启动 SQL Server 服务。 如果先更新 Active Directory 中的密码,然后更改密钥表,则必须重启 SQL Server 服务,以确保 Active Directory 身份验证正常工作。

轮换密钥表的场景

我们分析一个示例。 Linux 上的 SQL Server 已启用 Active Directory 身份验证。 在 mssql.conf 文件中,将 network.privilegedadaccount 设置为 sqluser。 帐户 sqluser@CONTOSO.COM 已在 Active Directory 中创建,并且密钥表也已在默认位置 /var/opt/mssql/secrets/mssql.keytab 创建。 现在,你想要更改 sqluser@CONTOSO.COM 的密码。 下面是需要执行的步骤:

  1. 在加入域的计算机上安装 adutil

  2. 使用 kinit 命令获取或续订 Kerberos TGT(票证授予票证)。 使用 kinit 命令的特权帐户。 此帐户需要具有连接到域的权限,并且应该能够在域中创建帐户和 SPN。 在这种情况下,我们使用有权在名为 CONTOSO.COM 的域中创建帐户和 SPN 的 privilegeduser@CONTOSO.COM 帐户。

    kinit privilegeduser@CONTOSO.COM
    
  3. 运行 kinit 获取/续订 TGT 后,查询 network.privilegedadaccount 的当前 kvno 数值。 在本例中,该值为 sqluser@CONTOSO.COM

    kvno sqluser@CONTOSO.COM
    

可以选择使用 mssql-conf 轮换密钥表,或使用 adutil 手动轮换密钥表

使用 mssql-conf 轮换密钥表

可以安装 adutil 并将其与 mssql-conf 集成,这意味着可以使用 mssql-conf 轮换密钥表。

  1. 以根用户身份登录并切换到 mssql 用户。

    su mssql
    
  2. 使用 kinit 命令获取或续订 Kerberos TGT(票证授予票证)。 使用 kinit 命令的特权帐户。 此帐户需要具有连接到域的权限,并且应该能够在域中创建帐户和 SPN。 在这种情况下,我们使用有权在名为 CONTOSO.COM 的域中创建帐户和 SPN 的 privilegeduser@CONTOSO.COM 帐户。

    kinit privilegeduser@CONTOSO.COM
    
  3. 运行 mssql-conf 命令,提供 SQL Server 密钥表和 network.privilegedadaccount 详细信息。 在本示例中,privilegedadaccountsqluser

    ./mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser --use-next-kvno'
    

    当系统提示输入密码时,请输入要使用的新密码。 --use-next-kvno 选项用于分配当前 kvno + 1。

    可选:还可以将 --kvno 选项与 mssql-confsetup-ad-keytab 命令一起使用,提供特定的 kvno。 必须确保先获取用户的当前 kvno,然后相应地更新新的 kvno,即当前的 kvno + 1。

  4. 可以使用命令列出密钥表的密钥:

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

    你会注意到,密钥表中更新了用户和 SPN 条目的下一个 kvno。

  5. 现在可以更改 sqluser 用户的密码。 下面是一个示例。

    重要

    如果在此步骤中系统提示重启 SQL Server,可以忽略提示。 还要记得在 Active Directory 中更改密码

    bash-4.4$ kinit privilegedaccount@CONTOSO.COM
    Password for privilegedaccount@CONTOSO.COM:
    
    bash-4.4$ ./mssql-conf setup-ad-keytab /var/opt/mssql/secrets/mssql.keytab sqluser --use-next-kvno
    sqluser@contoso.com's password:
    Confirm sqluser@contoso.com's password:
    
    SQL Server needs to be restarted in order to adopt the new AD configuration, please run 'systemctl restart mssql-server.service'.
    
    bash-4.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)
       5 12/30/2021 20:06:34 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1.contoso.com:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96)
       5 12/30/2021 20:06:34 MSSQLSvc/sql1@CONTOSO.COM (aes256-cts-hmac-sha1-96)
    

使用 adutil 手动轮换密钥表

如果要使用 adutil 手动更新密钥表,请参阅以下步骤。

使用 adutil 更新密钥表会将条目添加到当前密钥表中。 例如,如果上一命令中的 kvno 数值为 2,请在更新密钥表时使用 kvno 数值 3。 以下是需要运行的 adutil 命令。

  • 更改端口号 (-p)、主机名 (-H)、密钥表路径 (-k) 和 kvno 数值,与环境相匹配。
adutil keytab createauto -k /var/opt/mssql/secrets/mssql.keytab -p 1433 -H mssql.contoso.com --password '<newpassword>' -s MSSQLSvc --kvno 3
adutil keytab create -k /var/opt/mssql/secrets/mssql.keytab -p sqluser --password '<newpassword>' --kvno 3

-k: 是 SQL Server 当前使用的密钥表路径,使用 mssql.conf 文件中的 network.kerberoskeytabfile 选项进行设置。

-H: 是 SQL Server 主机的完全限定域名。

在第一个命令中,-p: 是 SQL Server 服务配置为侦听的端口。 在第二个命令中,-p 表示要更新其密码的 network.privilegedadaccount。

kvno: 值需要为当前 kvno + 1。 可从步骤 3 获取当前 kvno 值。

运行上述命令后,必须为密钥表条目提供你选择的加密类型。 确保为环境选择正确的选项。

检查密钥表条目

更新密钥表后,现在应该会看到 kvno 3(新)密钥表中的条目,以及同一帐户 sqluser@CONTOSO.COM 和 SNS 的 kvno 2(旧)。 可以运行下面的 klist 命令来检查密钥表中的条目:

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

更改 Active Directory 中的帐户密码

最后一步是更新 network.privilegedadaccount 或 Windows Active Directory 中 SQL Server SPN 的所属帐户的密码。 在上述场景中,必须更新 Active Directory 中 sqluser@CONTOSO.COM 的密码。 将密码更改为在上一部分的步骤 3 中提供的 <newpassword>。 Active Directory 身份验证应继续工作,且无需重启 SQL Server 服务。