共用方式為


如何建立 In-Memory OLTP 應用程控與受管理安裝程序原則

適用於:SQL Server

SQL Server 會針對每個原生編譯數據表和預存程式,編譯並鏈接動態連結庫,其具有 C 程式代碼中這些物件的原生實作。 雖然 In-Memory OLTP DLL 是以動態方式產生,但當有合規性需求以程式代碼完整性強制執行為準則時,檔案本身可能會提供一些挑戰。

什麼是HKDLLGEN?

在 SQL Server 2022 (16.x) 累積更新 17 和更新版本中,稱為 Hekaton DLL 產生器的元件已新增至 In-Memory OLTP 功能。 如果沒有新的 Hekaton DLL 產生 (hkllgen) 程式,主要 SQL Server 進程會將 T-SQL 轉換成 C 程式,然後啟動編譯程式和鏈接器進程,以產生未簽署 In-Memory OLTP DLL。 Hkdllgen作為中繼應用程式,會驗證並接受來自 SQL Server 的輸出,然後建立已簽署 DLL。 若要強制執行這些 DLL 的程式代碼完整性原則,Hkdllgen 程式必須指定為 Windows Defender 應用程控 (WDAC) Managed Installer。

Hekaton DLL 產生器是邁向滿足法規合規性需求的第一步,例如 程式代碼完整性 可以藉由 In-Memory OLTP 生成的 DLL 達成。 此內容中的程式碼完整性可確保從建立到載入和執行,操作系統會信任 In-Memory OLTP 產生的 DLL。 將 Hekaton DLL 產生器元件指定為 Managed Installer 的能力可讓 WDAC 程式代碼完整性系統信任產生的 DLL,並允許它們使用。

受管理的安裝程式如何運作?

受控安裝程式會使用 appLocker 中的特殊規則集合,將貴組織信任的二進位檔指定為應用程式安裝授權來源。 當其中一個受信任的二進位檔執行時,Windows 會監視二進位檔的進程(以及它啟動的任何子進程),並監看正在寫入磁碟的檔案。 隨著檔案的寫入,宣告或標籤會被新增到檔案中,表示其來源於受管控的安裝程式。

透過 AppLocker,WDAC 應用程控可藉由將 Enabled:Managed Installer 選項新增至應用程控原則,將受管理安裝程式所安裝的檔案設定為信任檔案。 設定該選項時,應用程控會在判斷是否允許二進位檔執行時檢查 Managed 安裝程式來源資訊。 只要二進位檔沒有拒絕規則,App Control 就允許它完全根據其受控安裝程式來源執行。 AppLocker 也會控制指定為受控安裝程式的可執行檔執行,但不會為 WDAC 等可執行檔和 DLL 提供信任鏈結。 在本文中,我們將逐步解說如何將 hkdllgen 程式指定和設定為 AppLocker 和 WDAC 可以使用的受控安裝程式。

啟用 Hekaton DLL 產生器

在這裡範例中,sp_configure 用來啟用 Hekaton DLL 產生器選項,稱為 external xtp dll gen util enabled。 系統會建立測試資料庫,以及測試記憶體優化數據表。

  1. 建立測試資料庫。

    USE master;
    GO
    
    EXECUTE sp_configure 'external xtp dll gen util enabled', 1;
    RECONFIGURE;
    GO
    
    CREATE DATABASE HekatonDbForTesting ON
    PRIMARY (
        NAME = N'HekatonDbForTesting_Data',
        FILENAME = N'<path-to-data-directory>\HekatonDbForTesting_Data.mdf'
    ),
    FILEGROUP [HekatonDbForTestin_XTP_FG] CONTAINS MEMORY_OPTIMIZED_DATA (
        NAME = HekatonDbForTesting_XTP_CHKPOINT,
        FILENAME = N'<path-to-data-directory>\HekatonDbForTesting_XTP_CHKPOINT'
    )
    LOG ON (
        NAME = N'HekatonDbForTesting_log',
        FILENAME = N'<Path_To_Log_Directory>\HekatonDbForTesting_Log.ldf'
    );
    GO
    
  2. 在測試資料庫中建立測試數據表。

    USE HekatonDbForTesting;
    GO
    
    CREATE TABLE dbo.TestCustomerTable
    (
        CustomerId INT NOT NULL
            PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000),
        FirstName NVARCHAR (50) NOT NULL,
        LastName NVARCHAR (50) NOT NULL
    )
    WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
    GO
    
  3. 系統會針對 .gen 子目錄中的每個 .dll 產生具有 <path-to-data-directory>\xtp\<database_id> 擴展名的新零長度檔案。 dll 現在已簽名。

建立 In-Memory OLTP AppLocker 和受管理安裝程序原則的步驟

GPO 編輯器中的 AppLocker 原則建立 UI(gpedit.msc)和 AppLocker PowerShell Cmdlet 無法直接用來建立 Managed Installer 規則集合的規則。 不過,您可以使用 XML 或文字編輯器,將 EXE 規則集合原則轉換成 ManagedInstaller 規則集合。

重要

在將 Hekaton DLL 生成的可執行檔新增至伺服器的 AppLocker 控制原則設定之前,應該先存在 AppLocker 原則,否則有可能因 Windows Defender 造成基本操作系統功能被封鎖的風險。 如需建立、測試和維護應用程控原則的詳細資訊,請參閱 AppLocker 部署指南

其餘範例適用於 windows Server 2022 Windows 11 和更新版本。

若要確認 AppLocker 控制原則組態中至少有 exe 規則集合存在,請執行下列 PowerShell 命令:

Get-AppLockerPolicy -Effective

或者,將有效原則的輸出儲存至 XML 檔案以檢視:

Get-AppLockerPolicy -Effective -Xml > effective_app_policy.xml

下列步驟會逐步引導您建立及套用可套用至本地伺服器的原則。 使用這些步驟生成的受管理的安裝程式政策可以合併到 GPO 全域政策中,然後分發至環境內的所有 SQL Server,或者應用到單一伺服器的本地政策。 我們建議您與網域系統管理員合作,從網域層級套用程式代碼完整性原則。

  1. 使用 New-AppLockerPolicy,為您要指定為受控安裝程式的檔案建立 EXE 規則。 此範例會使用發行者規則類型來建立 Hekaton DLL 產生器的規則,但可以使用任何 AppLocker 規則類型。 您可能需要重新格式化輸出以取得可讀性。

    #Change the current working path of the PowerShell command line or ISE to something other than the default (that is, C:\Temp). Retrieve SQL Server Path
    $SQLPath = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\MSSQLServer\Setup' -Name 'SQLPath'
    $FullPath = Join-Path -Path $SQLPath.SQLPath -ChildPath 'Binn\xtp'
    
    # Set an environment variable for the In-memory OLTP Path
    [System.Environment]::SetEnvironmentVariable('SQLPathWithXtp', $FullPath, 'Process')
    
    # Generate an AppLocker Policy for the HKDLLGEN.EXE in the current working directory. The Get-AppLockerFileInformation cmdlet will extract the    executables publisher information as well as generate a hash for the binary.
    Get-ChildItem -Path ${env:SQLPathWithXtp}'.\hkdllgen.exe' | Get-AppLockerFileInformation | New-AppLockerPolicy -RuleType Publisher -User Everyone    -Xml > AppLocker_HKDLLGEN_Policy.xml
    
  2. 手動編輯 AppLocker_HKDLLGEN_Policy.xml 並變更下列屬性值:

    • RuleCollection TypeManagedInstaller
    • EnforcementModeAuditOnly
    • BinaryVersionRange LowSection"*"HighSection"*"

    改變:

    <RuleCollection Type="Exe" EnforcementMode="NotConfigured">
    

    至:

    <RuleCollection Type="ManagedInstaller" EnforcementMode="AuditOnly">
    

    改變:

    <BinaryVersionRange LowSection="2022.160.4175.1" HighSection="2022.160.4175.1"/>
    

    至:

    <BinaryVersionRange LowSection="*" HighSection="*"/>
    
  3. 部署 AppLocker 受控安裝程式設定原則。 您可以匯入AppLocker原則並使用組策略部署,或使用腳本搭配 Set-AppLockerPolicy Cmdlet 來部署原則,如下列 PowerShell 命令所示。

    #Enable the AppLocker Policy and merge with the existing policy that exists on the system.
    Set-AppLockerPolicy -XmlPolicy .\AppLocker_HKDLLGEN_Policy.xml -Merge -ErrorAction SilentlyContinue
    
  4. 如果透過PowerShell腳本部署AppLocker原則,請使用系統管理命令提示字元中的 appidtel.exe 公用程式來設定AppLocker 應用程式識別服務和 AppLocker 篩選驅動程式。

    appidtel.exe start [-mionly]
    

在商務用 Windows Defender 應用程控精靈中啟用受管理的安裝程序選項

若要 Windows Defender 應用程控 (WDAC) 信任 hkdllgen.exe 程式所產生的 DLL,您必須在應用程控原則中指定 [已啟用 :Managed Installer] 選項。 您可以使用選項 13 的 Set-RuleOption Cmdlet 來定義此設定。

從其中一個 WDAC 基底原則精靈 範本基底原則產生程式代碼完整性原則檔案。

預設的 Windows 原則開始,這本指南會移除一些選項,使剩下的選項更少。 如需預設 Windows 模式和允許 Microsoft 模式原則的詳細資訊,可透過 範例應用程式控管企業基礎原則的文章存取。

基底範本原則

WDAC 基底範本畫面的螢幕快照。

選取 Windows 原則基底範本之後,請為原則指定名稱,並選擇在磁碟上儲存應用程控原則的位置。

選取原則類型

選擇 多個原則格式,並將 基底原則 作為原則類型

WDAC 選取原則類型畫面的螢幕快照。

設定原則範本

只啟用受管理的安裝程式、無需重新啟動的更新原則、未簽署的系統完整性原則,以及使用者模式程式完整性原則規則選項。 停用其他原則規則選項。 可以透過按下政策規則標題旁的滑動按鈕來達成。

以下表格描述每個政策規則,從最左列開始。 原則規則一文 提供每個原則規則的更完整描述。

規則選項 描述
受管理的安裝程式 使用此選項可自動允許軟體發佈解決方案所安裝的應用程式,例如 Hekaton DLL 產生器,其已定義為受控安裝程式。
更新政策無需重新啟動 使用此選項可讓未來的商務應用程控原則更新套用,而不需要重新啟動系統。
未簽署的系統完整性原則 允許政策保持未簽署。 移除此選項時,必須簽署政策,並在政策中新增 UpdatePolicySigners,以啟用未來的政策修改。
使用者模式程式代碼完整性 商務用應用程控原則會限制內核模式和使用者模式二進位檔。 根據預設,只會限制內核模式二進位檔。 啟用此規則選項會驗證使用者模式可執行檔和腳稿。

[設定原則範本] 畫面的螢幕快照。

您應該一開始啟用 稽核模式,因為它可讓您在強制執行原則之前測試新的商務用應用程控原則。 使用稽核模式時,不會封鎖任何應用程式,只要啟動原則以外的應用程式,原則就會記錄事件。 基於這個理由,所有範本預設都會啟用稽核模式。

檔案規則

從清單中移除所有政策簽署規則。

WDAC 檔案規則畫面的螢幕快照。

(選擇性) 新增自定義發行者原則規則,以確保 hkdllgen.exe 等檔案會以發行者身分簽署。

WDAC 自定義原則畫面的螢幕快照。

發行者檔案規則類型會使用程式碼簽署憑證鏈中的屬性來制定檔案規則。

WDAC 原則規則畫面的螢幕快照。

按下 [建立規則] 按鈕之後,應該會有一個原則簽署規則。

WDAC 原則簽署規則清單畫面的螢幕快照。

部署您的應用程式控制原則。 請參閱 部署企業應用程控原則

建立原則之後,新原則會寫入選擇為原則檔案位置的路徑。 新的二進位原則檔案名稱在其結尾附加了原則版本號。 原則.cip 檔案可以複製到 SQL Server 實例上的 C:\Windows\System32\CodeIntegrity\CiPolicies\Active 子目錄。

手動部署程式代碼完整性原則

若要建立更精簡的程式代碼完整性原則,可以編輯完成WDAC應用程控原則精靈之後所產生的更一般 原則.xml 檔案。 如果 WDAC 應用程控原則精靈未在 SQL Server 上執行,但從工作站執行,就可能發生此案例。 例如,較不自定義的程式代碼完整性原則檔案看起來可能像這樣:

   <?xml version="1.0" encoding="utf-8"?>
<SiPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:sipolicy" PolicyType="Base Policy">
  <VersionEx>10.0.5.0</VersionEx>
  <PlatformID>{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}</PlatformID>
  <PolicyID>{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}</PolicyID>
  <BasePolicyID>{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}</BasePolicyID>
  <Rules>
    <Rule>
      <Option>Enabled:Unsigned System Integrity Policy</Option>
    </Rule>
    <Rule>
      <Option>Enabled:UMCI</Option>
    </Rule>
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    <Rule>
      <Option>Enabled:Managed Installer</Option>
    </Rule>
    <Rule>
      <Option>Enabled:Update Policy No Reboot</Option>
    </Rule>
  </Rules>
  <EKUs>
    <!--EKU ID-->
  </EKUs>
  <FileRules>
    <!--FileAttrib ID -->
  </FileRules>
  <Signers />
  <SigningScenarios>
    <SigningScenario ID="ID_SIGNINGSCENARIO_KMCI" FriendlyName="Kernel Mode Signing Scenario" Value="131">
      <ProductSigners />
    </SigningScenario>
    <SigningScenario ID="ID_SIGNINGSCENARIO_UMCI" FriendlyName="User Mode Signing Scenario" Value="12">
      <ProductSigners />
    </SigningScenario>
  </SigningScenarios>
  <UpdatePolicySigners />
  <HvciOptions>0</HvciOptions>
</SiPolicy>

此範例沒有已簽署的發行者規則,並假設原則檔案使用本機工作目錄(例如,C:\Temp),檔名為 Hekaton_Custom_CIPolicy.xml

#Create Windows Defender Application Control (WDAC) policy and set Option 13 (Enabled:Managed Installer) and Option 16 (Enabled:Update Policy No Reboot)
Set-CIPolicyIdInfo -FilePath C:\Temp\Hekaton_Custom_CIPolicy.xml -PolicyName "Hekaton Managed Installer Policy" -ResetPolicyID
Set-RuleOption -FilePath C:\Temp\Hekaton_Custom_CIPolicy.xml -Option 13
Set-RuleOption -FilePath C:\Temp\Hekaton_Custom_CIPolicy.xml -Option 16

# The App Control policy XML file in this example is located in the C:\Temp directory.
$AppControlPolicyXMLFile = 'C:\Temp\test\Hekaton_Custom_CIPolicy.xml'

# Retrieve the Policy ID from the App Control policy XML. This will be used as the binary file name that Code Integrity will use.
[xml]$AppControlPolicy = Get-Content -Path $AppControlPolicyXMLFile
$PolicyID = $AppControlPolicy.SiPolicy.PolicyID
$PolicyBinary = $PolicyID + ".cip"

# Convert the App Control policy XML to binary format and save it into the Active Code Integrity path.
ConvertFrom-CIPolicy -XmlFilePath $AppControlPolicyXMLFile -BinaryFilePath "C:\Windows\System32\CodeIntegrity\CiPolicies\Active\$PolicyBinary"

若要套用原則而不重新啟動伺服器並檢查程式代碼完整性的狀態,請執行此 PowerShell 腳本:

# Refresh the Code Integrity policy without a reboot of the system
Invoke-CimMethod -Namespace root\Microsoft\Windows\CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{FilePath = "C:\Windows\System32\CodeIntegrity\CiPolicies\Active\$PolicyBinary" }

# View the current status of WDAC Code Integrity.
# If WDAC is in Audit mode the "UserModeCodeIntegrityPolicyEnforcementStatus" will have a value of "1" for Audit mode. A value of "0" signifies that Code Integrity is not active.
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard | Format-List *codeintegrity*

確認所產生的 Hekaton DLL 是否受到程式碼完整性的信任

一旦程式代碼完整性在稽核模式或作用中模式中運作,Hekaton DLL 產生器所產生的 DLL 就會受到 Windows 的信任,並且將擴充屬性新增至檔案。

Smartlocker 索賠已新增為元數據的一部分。 這可以使用來自系統管理命令提示字元的 fsutil 命令來檢視。 例如,從 \Data\xtp\<database_id> 資料夾中選取其中一個記憶體內部 OLTP 動態產生的檔案,然後執行下列命令:

fsutil file queryea "D:\SQL\MSSQL17.MSSQLSERVER\MSSQL\DATA\xtp\5\xtp_t_5_64719283_196202718557591_1.dll"

fsutil 輸出的螢幕快照。

拿掉受管理的安裝程式功能

若要從裝置移除受管理安裝程式功能,您必須遵循 刪除 AppLocker 規則的指示,從裝置移除受控安裝程式 AppLocker 原則:清除單一系統或遠端系統上的 AppLocker 原則