次の方法で共有


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 プロセスをマネージド インストーラー Windows Defender アプリケーション制御 (WDAC) 指定する必要があります。

Hekaton DLL ジェネレーターは、コード整合性 などの規制コンプライアンス要件を、OLTP で生成された DLL In-Memory 満たすことを保証するための最初のステップです。 このコンテキストのコード整合性により、OLTP によって生成 In-Memory DLL は、作成されてから読み込まれて実行されるまで、オペレーティング システムによって信頼されます。 Hekaton DLL ジェネレーター コンポーネントをマネージド インストーラーとして指定する機能により、WDAC コード整合性システムは、生成された DLL を信頼し、それらを使用できるようになります。

マネージド インストーラーのしくみ

マネージド インストーラーは、AppLocker の特別な規則コレクションを使用して、組織によって信頼されているバイナリを、アプリケーションインストールの承認されたソースとして指定します。 これらの信頼されたバイナリのいずれかが実行されると、Windows はバイナリのプロセス (および起動する子プロセス) を監視し、ディスクに書き込まれるファイルを監視します。 ファイルが書き込まれると、マネージド インストーラーからの要求またはタグがファイルに追加されます。

AppLocker を使用すると、Enabled:Managed Installer オプションを App Control ポリシーに追加することで、マネージド インストーラーによってインストールされたファイルを信頼するように WDAC アプリ制御を構成できます。 このオプションを設定すると、バイナリの実行を許可するかどうかを判断するときに、App Control によって、管理されたインストーラーの配信元情報がチェックされます。 バイナリの拒否規則がない限り、App Control では、マネージド インストーラーの配信元に基づいて実行できます。 AppLocker では、マネージド インストーラーとして指定されている実行可能ファイルの実行も制御されますが、WDAC などの実行可能ファイルと DLL に対する信頼のチェーンは提供されません。 この記事では、AppLocker と WDAC の両方で使用できるマネージド インストーラーとして hkdllgen プロセスを指定および構成する方法について説明します。

Hekaton DLL ジェネレーターを有効にする

この例では、sp_configure を使用して、external xtp dll gen util enabledと呼ばれる Hekaton DLL ジェネレーター オプションを有効にします。 テスト データベースが、テスト メモリ最適化テーブルと共に作成されます。

  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 拡張子を持つ新しい長さ 0 のファイルが、<path-to-data-directory>\xtp\<database_id> サブディレクトリ内の各 .dll に対して生成されます。 dlls が署名されるようになりました。

In-Memory OLTP AppLocker および Managed Installer ポリシーを作成する手順

GPO エディターの AppLocker ポリシー作成 UI (gpedit.msc) と AppLocker PowerShell コマンドレットを直接使用して、Managed Installer 規則コレクションの規則を作成することはできません。 ただし、XML エディターまたはテキスト エディターを使用して、EXE ルール コレクション ポリシーを ManagedInstaller ルール コレクションに変換できます。

重要

AppLocker コントロール ポリシーの構成をサーバーに Hekaton DLL 生成実行可能ファイルを追加する前に、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 に配布することも、単一のサーバーのローカル ポリシーに適用することもできます。 ドメイン管理者と協力して、ドメイン レベルからコード整合性ポリシーを適用することをお勧めします。

  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 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="*"/>
    
  3. AppLocker マネージド インストーラー構成ポリシーを展開します。 次の PowerShell コマンドに示すように、AppLocker ポリシーをインポートしてグループ ポリシーで展開するか、スクリプトを使用して Set-AppLockerPolicy コマンドレットを使用してポリシーを展開できます。

    #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 アプリケーション ID サービスと AppLocker フィルター ドライバーを構成します。

    appidtel.exe start [-mionly]
    

Windows Defender Application Control for Business ウィザードでマネージド インストーラー オプションを有効にする

Windows Defender アプリケーション制御 (WDAC)hkdllgen.exe プロセスによって生成された DLL を信頼するには、アプリコントロール ポリシーで [Enabled: Managed Installer オプションを指定する必要があります。 この設定は、オプション 13 で Set-RuleOption コマンドレットを使用して定義できます。

WDAC 基本ポリシー ウィザード テンプレート基本ポリシーからコード整合性ポリシー ファイルを生成します。

既定の Windows ポリシー以降では、このガイドで削除されるオプションが少なくなります。 既定の Windows モードと Microsoft モードの許可ポリシーの詳細については、サンプル アプリコントロール for Business の基本ポリシーに関する記事を参照してください。

基本テンプレート ポリシー

WDAC 基本テンプレート画面のスクリーンショット。

Windows ポリシーの基本テンプレートを選択したら、ポリシーに名前を付け、アプリ制御ポリシーをディスクに保存する場所を選択します。

ポリシーの種類を選択する

複数ポリシー形式の を選択し、ポリシーの種類として基本ポリシー する

WDAC の [ポリシーの種類の選択] 画面のスクリーンショット。

ポリシー テンプレートの構成

[マネージド インストーラー]、[再起動せずにポリシーを更新する]、[署名されていないシステム整合性ポリシー]、および [ユーザー モード コード整合性ポリシー] のオプションのみを有効にします。 その他のポリシー ルール オプションを無効にします。 これを行うには、ポリシー ルールのタイトルの横にあるスライダー ボタンを押します。

次の表に、左端の列から始まる各ポリシー規則の説明を示します。 ポリシールールの記事 では、各ポリシールールについて詳しい説明を提供します。

ルール オプション 説明
マネージド インストーラー このオプションを使用して、管理対象インストーラーとして定義されている Hekaton DLL ジェネレーターなどのソフトウェア配布ソリューションによってインストールされたアプリケーションを自動的に許可します。
を再起動せずにポリシーを更新 システムの再起動を必要とせずに、今後の App Control for Business ポリシーの更新プログラムを適用できるようにするには、このオプションを使用します。
"署名されていないシステム整合性ポリシー " ポリシーが署名されていない状態を維持できるようにします。 このオプションを削除した場合、ポリシーに署名し、UpdatePolicySigners をポリシーに追加して、今後のポリシーの変更を有効にする必要があります。
ユーザー モード コードの整合性 App Control for Business ポリシーでは、カーネル モードとユーザー モードの両方のバイナリが制限されます。 既定では、カーネル モード バイナリのみが制限されます。 このルール オプションを有効にすると、ユーザー モードの実行可能ファイルとスクリプトが検証されます。

ポリシー テンプレートの構成画面のスクリーンショット。

監査モード を最初に有効にする必要があります。これは、新しい App Control for Business ポリシーを適用する前にテストできるためです。 監査モードでは、アプリケーションはブロックされません。ポリシー外のアプリケーションが開始されるたびに、ポリシーによってイベントがログに記録されます。 このため、すべてのテンプレートで監査モードが既定で有効になっています。

ファイル ルール

一覧からすべてのポリシー署名規則を削除します。

WDAC ファイル ルール画面のスクリーンショット。

(省略可能)hkdllgen.exe などのファイルが発行元として署名されるようにするカスタム パブリッシャー ポリシー規則を追加します。

WDAC カスタム ポリシー画面のスクリーンショット。

発行元のファイル規則タイプでは、コード署名証明書チェーンのプロパティに基づいてファイル規則を定義します。

WDAC ポリシールール画面のスクリーンショット。

[ルールの作成] ボタンを選択した後、1 つのポリシー署名規則が存在する必要があります。

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 ポリシーをデバイスから削除する必要があります。