In-Memory OLTP 앱 제어 및 관리형 설치 관리자 정책을 만드는 방법
적용 대상:SQL Server
SQL Server는 C 코드에서 해당 개체의 네이티브 구현이 있는 모든 네이티브 컴파일 테이블 및 저장 프로시저에 대해 DLL(동적 연결 라이브러리)을 컴파일하고 연결합니다. In-Memory OLTP DLL은 동적으로 생성되지만, 코드 무결성 적용을 기준으로 하는 규정 준수 요구 사항이 있는 경우 파일 자체는 몇 가지 문제를 제공할 수 있습니다.
HKDLLGEN이란?
SQL Server 2022(16.x) 누적 업데이트 17 이상 버전에서는 Hekaton DLL 생성기라는 구성 요소가 In-Memory OLTP 기능에 추가되었습니다. 새 Hekaton DLL 생성(hkdllgen) 프로세스가 없으면 주 SQL Server 프로세스는 T-SQL을 C 코드로 변환한 다음 컴파일러 및 링커 프로세스를 시작하여 서명되지 않은 In-Memory OLTP DLL을 생성합니다.
Hkdllgen
는 중간 애플리케이션인으로서 SQL Server에서 출력을 유효성을 검사하고 수락한 후 서명된 DLL을로 만듭니다. 이러한 DLL에 대한 코드 무결성 정책을 적용하려면 Hkdllgen
프로세스를 WDAC(Windows Defender Application Control) 관리형 설치 관리자로 지정해야 합니다.
Hekaton DLL 생성기는 코드 무결성 같은 규정 준수 요구 사항이 In-Memory OLTP 생성 DLL을 충족할 수 있도록 하는 첫 번째 단계입니다. 이 컨텍스트의 코드 무결성은 OLTP에서 생성하는 In-Memory DLL이 생성되고 로드되고 실행될 때까지 운영 체제에서 신뢰할 수 있도록 합니다. Hekaton DLL 생성기 구성 요소를 관리형 설치 관리자로 지정하는 기능을 통해 WDAC 코드 무결성 시스템은 생성된 DLL을 신뢰하고 이를 사용할 수 있습니다.
관리되는 설치 관리자는 어떻게 작동하나요?
관리되는 설치 관리자는 AppLocker 특수 규칙 컬렉션을 사용하여 조직에서 신뢰할 수 있는 이진 파일을 애플리케이션 설치에 대한 권한 있는 원본으로 지정합니다. 이러한 신뢰할 수 있는 이진 파일 중 하나가 실행되면 Windows는 이진 파일의 프로세스(및 이진 파일이 시작되는 모든 자식 프로세스)를 모니터링하고 디스크에 기록되는 파일을 감시합니다. 파일이 작성되면 클레임 또는 태그가 관리되는 설치 관리자에서 시작된 것으로 파일에 추가됩니다.
AppLocker를 사용하면 App Control 정책에 Enabled:Managed Installer 옵션을 추가하여 관리되는 설치 관리자가 설치한 파일을 신뢰하도록 WDAC App Control을 구성할 수 있습니다. 이 옵션을 설정하면, App Control은 이진 파일 실행 허용 여부를 결정할 때 관리형 설치 관리자 원본 정보를 확인합니다. 이진 파일에 대한 거부 규칙이 없는 한 App Control을 사용하면 관리된 설치 관리자 출처에 따라 바이너리가 실행될 수 있습니다. 또한 AppLocker는 관리되는 설치 관리자로 지정된 실행 파일의 실행을 제어하지만 WDAC와 같은 실행 파일 및 DLL에 대한 신뢰 체인을 제공하지는 않습니다. 이 문서에서는 AppLocker와 WDAC 모두에서 사용할 수 있는 관리형 설치 관리자로 hkdllgen
프로세스를 지정하고 구성하는 방법을 안내합니다.
Hekaton DLL 생성기 사용
본보기
이 예제에서는 sp_configure
이(가) external xtp dll gen util enabled
이라고 불리는 Hekaton DLL 생성기 옵션을 활성화하는 데 사용됩니다. 테스트 메모리 최적화 테이블과 함께 테스트 데이터베이스가 만들어집니다.
테스트 데이터베이스를 만듭니다.
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
.gen
하위 디렉터리 내의 각.dll
마다<path-to-data-directory>\xtp\<database_id>
확장명의 길이가 0인 새 파일이 생성됩니다. 이제 DLL 파일들이 서명되었습니다.
In-Memory OLTP AppLocker 및 관리형 설치 관리자 정책을 만드는 단계
GPO 편집기(gpedit.msc)의 AppLocker 정책 만들기 UI 및 AppLocker PowerShell cmdlet은 관리되는 설치 관리자 규칙 컬렉션에 대한 규칙을 만드는 데 직접 사용할 수 없습니다. 그러나 XML 또는 텍스트 편집기를 사용하여 EXE 규칙 컬렉션 정책을 ManagedInstaller 규칙 컬렉션으로 변환할 수 있습니다.
중요하다
AppLocker 정책 구성 서버에 Hekaton DLL 생성 실행 파일을 추가하기 전에 AppLocker 정책이 있어야 합니다. 그렇지 않으면 Windows Defender에서 기본 운영 체제 함수를 차단할 위험이 있습니다. 애플리케이션 제어 정책의 생성, 테스트 및 유지 관리에 대한 자세한 내용은 AppLocker 배포 가이드참조하세요.
나머지 예제는 Windows Server 2022 및 Windows 11 이상 버전에 적용됩니다.
서버 AppLocker Control 정책 구성 내에 exe 규칙 컬렉션이 있는지 확인하려면 다음 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 정책을 가져오고 그룹 정책을 사용하여 배포하거나 스크립트를 사용하여 다음 PowerShell 명령에 표시된 대로 Set-AppLockerPolicy cmdlet을 사용하여 정책을 배포할 수 있습니다.
#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 애플리케이션 ID 서비스 및 AppLocker 필터 드라이버를 구성합니다.
appidtel.exe start [-mionly]
비즈니스용 Windows Defender 애플리케이션 제어 마법사에서 관리되는 설치 관리자 옵션 사용
WDAC(Windows Defender 애플리케이션 제어)hkdllgen.exe
프로세스에서 생성된 DLL을 신뢰하려면 사용: 관리형 설치 관리자 옵션을 App Control 정책에 지정해야 합니다. 이 설정은 옵션 13에서 Set-RuleOption cmdlet 사용하여 정의할 수 있습니다.
WDAC 기본 정책 마법사 템플릿 기본 정책 중 하나에서 코드 무결성 정책 파일을 생성합니다.
기본 Windows 정책부터는 이 가이드에서 제거되는 더 적은 옵션을 제공합니다. 기본 Windows 모드 및 Microsoft 모드 허용 정책에 대한 자세한 내용은 비즈니스용 앱 제어 기본 정책 문서통해 액세스할 수 있습니다.
기본 템플릿 정책
Windows 정책 기본 템플릿이 선택되면 정책 이름을 지정하고 디스크에 App Control 정책을 저장할 위치를 선택합니다.
정책 유형 선택
정책 유형으로 다중 정책 형식 및 기본 정책을 선택하십시오.
정책 템플릿 구성
다시 부팅하지 않고 관리되는 설치 관리자, 업데이트 정책, 서명되지 않은 시스템 무결성 정책 및 사용자 모드 코드 무결성 정책 규칙 옵션만 사용하도록 설정합니다. 다른 정책 규칙 옵션을 사용하지 않도록 설정합니다. 정책 규칙 제목 옆에 있는 슬라이더 단추를 눌러 이 작업을 수행할 수 있습니다.
다음 표에는 왼쪽 열부터 시작하여 각 정책 규칙에 대한 설명이 있습니다. 정책 규칙 문서 각 정책 규칙에 대한 자세한 설명을 제공합니다.
규칙 옵션 | 묘사 |
---|---|
관리형 설치 관리자 | 이 옵션을 사용하여 관리되는 설치 관리자로 정의된 Hekaton DLL 생성기와 같은 소프트웨어 배포 솔루션에 의해 설치된 애플리케이션을 자동으로 허용합니다. |
다시 부팅하지 않고 업데이트 정책 | 이 옵션을 사용하여 시스템을 다시 부팅하지 않고도 향후 비즈니스용 App Control 정책 업데이트를 적용할 수 있습니다. |
서명되지 않은 시스템 무결성 정책 | 정책이 서명되지 않은 상태로 유지되도록 허용합니다. 이 옵션이 제거되면 정책에 서명하고 향후 정책 수정을 사용하도록 UpdatePolicySigners를 정책에 추가해야 합니다. |
사용자 모드 코드 무결성 | 비즈니스용 앱 제어 정책은 커널 모드와 사용자 모드 이진 파일을 모두 제한합니다. 기본적으로 커널 모드 이진 파일만 제한됩니다. 이 규칙 옵션을 사용하도록 설정하면 사용자 모드 실행 파일 및 스크립트의 유효성이 검사됩니다. |
감사 모드를 적용하기 전에 새 비즈니스용 앱 제어 정책을 테스트할 수 있으므로 처음에는 사용하도록 설정해야 합니다. 감사 모드에서는 애플리케이션이 차단되지 않고 정책 외부의 애플리케이션이 시작될 때마다 정책이 이벤트를 기록합니다. 이러한 이유로 모든 템플릿에는 기본적으로 감사 모드가 사용하도록 설정되어 있습니다.
파일 규칙
목록에서 정책 서명 규칙을 모두 제거합니다.
(선택 사항)hkdllgen.exe 같은 파일이 게시자로 서명되도록 하는 사용자 지정 게시자 정책 규칙을 추가합니다.
게시자 파일 규칙 형식은 코드 서명 인증서 체인의 속성을 기본 파일 규칙에 사용합니다.
규칙 만들기 단추를 선택하면 단일 정책 서명 규칙이 있어야 합니다.
앱 제어 정책을 배포합니다. 비즈니스용 앱 컨트롤 배포 정책 참조하세요.
정책이 만들어지면 새 정책이 정책 파일 위치로 선택된 경로에 기록됩니다. 정책 파일 이름의 새 이진 버전에는 파일 이름의 끝에 정책 버전이 추가됩니다.
정책의.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"
관리되는 설치 관리자 기능 제거
디바이스에서 관리되는 설치 관리자 기능을 제거하려면 AppLocker 규칙 삭제:단일 시스템 또는 원격 시스템에서 AppLocker 정책 지우기 지침에 따라 디바이스에서 관리되는 설치 관리자 AppLocker 정책을 제거해야 합니다.
관련 콘텐츠
- 비즈니스용 App Control을 사용하여 관리되는 설치 관리자가 배포한 앱을 자동으로 허용
- OLTP 개요 및 사용 시나리오 In-Memory
- Memory-Optimized 테이블 대한 쿼리 처리 가이드
- In-Memory OLTP 을 위한 샘플 데이터베이스
- AppLocker 배포 가이드
- 비즈니스용 앱 제어 정책 배포하기