如何创建 In-Memory OLTP 应用控制和托管安装程序策略
适用于:SQL Server
SQL Server 编译并链接每个本机编译表和存储过程的动态链接库(DLL),该库在 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) 托管安装程序。
Hekaton DLL 生成器是第一步,可确保通过内存中 OLTP 生成的 DLL 满足合规性要求(如代码完整性)。 在此上下文中,代码完整性可确保In-Memory OLTP生成的DLL从被创建到被加载和执行的整个过程中,始终受到操作系统的信任。 将 Hekaton DLL 生成器组件指定为托管安装程序的功能允许 WDAC 代码完整性系统信任生成的 DLL,并允许使用它们。
托管安装程序的工作原理是什么?
托管安装程序使用 AppLocker 中的特殊规则集合将组织信任的二进制文件指定为应用程序安装的授权源。 当其中一个受信任的二进制文件运行时,Windows 会监视二进制文件的进程(以及它启动的任何子进程),并监视正在写入磁盘的文件。 写入文件时,文件被添加上一个声明或标记,以表明其来自托管安装程序。
使用 AppLocker,可以将 WDAC 应用控制配置为信任托管安装程序安装的文件,方法是将 “已启用:托管安装程序” 选项添加到应用控制策略。 设置该选项后,应用控制会在确定是否允许二进制文件运行时检查托管安装程序源信息。 只要二进制文件没有拒绝规则,应用控制就允许它完全基于其托管安装程序源运行。 AppLocker 还控制被指定为托管安装程序的可执行文件的执行,但它不提供可执行文件和 DLL(如 WDAC)的信任链。 本文逐步介绍如何将 hkdllgen
进程指定和配置为可由 AppLocker 和 WDAC 使用的托管安装程序。
启用 Hekaton DLL 生成器
示例
在此示例中,sp_configure
用于启用 Hekaton DLL 生成器选项,该选项称为 external xtp dll gen util enabled
。 将创建测试数据库以及测试内存优化表。
创建测试数据库。
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
在测试数据库中创建测试表。
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
将为
<path-to-data-directory>\xtp\<database_id>
子目录中的每个.dll
生成具有.gen
扩展名的新零长度文件。 现在这些 dll 都已签名。
创建 In-Memory OLTP AppLocker 和托管安装程序策略的步骤
GPO 编辑器(gpedit.msc)和 AppLocker PowerShell cmdlet 中的 AppLocker 策略创建 UI 不能直接用于为托管安装程序规则集合创建规则。 但是,可以使用 XML 或文本编辑器将 EXE 规则集合策略转换为 ManagedInstaller 规则集合。
重要事项
在将 Hekaton DLL 生成可执行文件添加到服务器的 AppLocker 控制策略配置之前,应该先存在一个 AppLocker 策略,否则存在被 Windows Defender 阻止基本操作系统功能的风险。 有关创建、测试和维护应用程序控制策略的详细信息,请参阅 AppLocker 部署指南。
其余示例适用于 windows Server 2022 和 Windows 11 及更高版本。
若要验证至少 exe 规则集合存在于服务器 AppLocker 控制策略配置中,请执行以下 PowerShell 命令:
Get-AppLockerPolicy -Effective
或者将有效策略的输出保存到 XML 文件中以查看:
Get-AppLockerPolicy -Effective -Xml > effective_app_policy.xml
以下步骤逐步讲解如何创建和应用可应用于本地服务器的策略。 使用这些步骤生成的托管安装程序策略可以合并到 GPO 范围策略中,并分发到环境中的所有 SQL Server,或应用于单个服务器的本地策略。 建议与域管理员合作,从域级别应用代码完整性策略。
使用 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
手动编辑
AppLocker_HKDLLGEN_Policy.xml
并更改以下属性值:RuleCollection Type
至ManagedInstaller
EnforcementMode
至AuditOnly
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="*"/>
部署 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
如果通过 PowerShell 脚本部署 AppLocker 策略,请使用管理命令提示符中的 appidtel.exe 实用工具来配置 AppLocker 应用程序标识服务和 AppLocker 筛选器驱动程序。
appidtel.exe start [-mionly]
在适用于企业的 Windows Defender 应用程序控制向导中启用托管安装程序选项
若要使 Windows Defender 应用程序控制(WDAC) 信任由 hkdllgen.exe
进程生成的 DLL,必须在应用程序控制策略中指定“已启用 :托管安装程序”选项。 可以通过将 Set-RuleOption cmdlet 与选项 13 结合使用来定义此设置。
从 WDAC 基本策略向导 模板基策略之一生成代码完整性策略文件。
从 默认 Windows 策略开始时,提供的选项较少,而这些选项已在本指南中删除。 有关默认 Windows 模式和允许Microsoft模式策略的详细信息,请参阅 示例应用控制商业基础策略文章。
基本模板策略
选择 Windows 策略基模板后,为策略指定一个名称,并选择在磁盘上保存应用控制策略的位置。
选择策略类型
选择 多个策略格式,基本策略 作为策略类型
配置策略模板
仅启用托管安装程序、更新策略而不重新启动、未签名的系统完整性策略和用户模式代码完整性策略规则选项。 禁用其他策略规则选项。 为此,可以按策略规则标题旁边的滑块按钮。
下表包含每个策略规则的说明,从最左侧的列开始。 策略规则文章 提供了每个策略规则的完整说明。
规则选项 | 描述 |
---|---|
托管安装程序 | 使用此选项可自动允许软件分发解决方案安装的应用程序,例如已定义为托管安装程序的 Hekaton DLL 生成器。 |
在不重新启动的情况下更新策略 | 使用此选项可以允许将来的应用控制企业版策略更新应用,而无需系统重启。 |
未签名系统完整性策略 | 允许策略保持未签名状态。 删除此选项后,必须对策略进行签名,并在策略中加入 UpdatePolicySigners 以启用将来的策略修改。 |
用户模式代码完整性 | 适用于企业的应用控制策略限制内核模式和用户模式二进制文件。 默认情况下,只有内核模式二进制文件受到限制。 启用此规则选项会验证用户模式可执行文件和脚本。 |
最初应启用 审核模式,因为它允许在强制实施策略之前测试新的应用控制企业策略。 使用审核模式时,每当启动策略外部的应用程序时,策略不会阻止任何应用程序,而是记录事件。 因此,默认情况下,所有模板都启用了审核模式。
文件规则
从列表中删除所有策略签名规则。
(可选)添加自定义发布者策略规则,以确保将 hkdllgen.exe 之类的文件签署为发布者。
发布者文件规则类型使用代码签名证书链中的属性来制定文件规则。
选择 创建规则 按钮后,应存在单个策略签名规则。
部署应用控制策略。 请参阅部署商用应用控制策略。
创建策略后,新策略将写入选择为策略文件位置的路径。 策略文件名的新二进制版本将策略版本追加到文件名的末尾。 策略.cip 文件可以复制到 SQL Server 实例上的 C:\Windows\System32\CodeIntegrity\CiPolicies\Active
子目录。
手动部署代码完整性策略
为了创建更简化的代码完整性策略,可以编辑完成 WDAC 应用控制策略向导后生成的更通用 策略.xml 文件。 如果未在 SQL Server 上执行 WDAC 应用控制策略向导,但从工作站执行,则可能会出现这种情况。 例如,自定义较少的代码完整性策略文件可能如下所示:
<?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"
移除托管安装程序功能
若要从设备中移除托管安装程序功能,需要按照删除 AppLocker 规则:清除单个系统或远程系统上的 AppLocker 策略中的说明从设备中移除托管安装程序 AppLocker 策略。