為 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 公用程式簡介

請務必先使用下一個 kvno 數值更新金鑰表中的新密碼,再更新 Active Directory 中的密碼。 使用下一個 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。 目前的 kvno 值取自步驟 3。

執行上述命令後,您必須為金鑰表項目提供您選擇的加密類型。 請確實為您的環境選擇正確的類型。

檢查金鑰表項目

更新金鑰表之後,您現在應該會在金鑰表中看到相同帳戶 sqluser@CONTOSO.COM 和 SPN 的 kvno 3 (新的) 以及 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 服務。