In-Memory OLTP のアプリ制御およびマネージド インストーラー ポリシーを作成する方法

適用対象:SQL Server

SQL Serverは、ネイティブにコンパイルされた各テーブルとストアドプロシージャに対して動的リンクライブラリ(DLL)をコンパイルしリンクし、それらのオブジェクトのネイティブ実装をCコードで含みます。 In-Memory OLTP DLLは動的に生成されますが、コードの整合性強制が必要な環境ではファイルが課題となることがあります。

HkDllGenとは何ですか?

SQL Server 2022(16.x)累積アップデート17以降のバージョンでは、In-Memory OLTP機能にHekaton DLLジェネレーター(HkDllGen)が含まれています。 HkDllGenがなければ、SQL Serverはsqlservr.exe内でCソースを生成し、コンパイラを起動します。コンパイラはリンカーを呼び出して In-Memory OLTP DLLを作成します。 外部生成を有効にすると、SQL Serverシリアライズされたオブジェクトメタデータをエクスポートし、Microsoft署名付きhkdllgen.exeを起動します。 HkDllGenはそのメタデータを検証・インポートし、独自のプロセスでCソースを生成し、コンパイラとリンカーを起動します。

これらのDLLのコード整合性を強制するために、AppLockerを使ってMicrosoft署名されたhkdllgen.exeをマネージドインストーラーとして指定し、かつてのApplication Control(WDAC)Windows Defender App Control for Businessポリシーでマネージドインストーラーの信頼を有効にします。 Windowsは生成されたDLLがHkDllGenプロセスツリーから来ていることを記録し、App Controlが管理されたインストーラーの起源に基づいてそれらを信頼できるようにします。

HkDllGenは、インメモリ OLTP において コード整合性 を含む法規制要件を満たすための第一歩です。 この場合、コードの整合性により、Windowsは生成された各DLLに対して信頼されたオリジンを確立し、SQL Serverがそれを読み込む際にその信頼を評価できます。 生成されたDLLはAuthenticode署名されていません。 Windowsは、その作成方法に基づいて信頼しています。

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

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

オリジンクレームはカーネル管理の拡張属性です。 これはAuthenticode署名ではなく、生成されたDLLの出版者や署名ステータスは変わりません。

AppLockerを使用することで、App Control for Business(旧Windows Defender Application Control、WDAC)は、Enabled:Managed InstallerオプションをApp Controlポリシーに追加することで、管理されたインストーラーがインストールするファイルを信頼するように設定できます。 そのオプションを設定すると、App Controlはバイナリの実行を許可するかどうかを判断する際に管理されたインストーラーの元情報をチェックします。 バイナリの拒否規則がない限り、App Control では、マネージド インストーラーの配信元に基づいて実行できます。 AppLockerは管理型インストーラーとして指定した実行ファイルの実行も制御しますが、WDACのように実行ファイルやDLLに対して信頼の連鎖は提供していません。 この記事では、HkDllGenプロセスをAppLockerとWDACの両方が使用できる管理型インストーラーとして指定・設定する方法を解説します。

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

この例は、external xtp dll gen util enabledオプションを付けた sp_configure を使用することで 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. <path-to-data-directory>\xtp\<database_id>サブディレクトリ内のHkDllGenを通じて生成された各DLLの隣に.genファイルが作成されます。 このファイルはHkDllGenの出力をキャプチャし、コンパイル成功後は通常0長になります。 その存在は外部生成子が呼び出されたことを示しています。 生成されたDLLはAuthenticode署名されていません。 Windowsが生成されたDLLをその発信元に基づいて信頼させるには、管理インストーラーの追跡とApp Controlポリシーが必要です。

既存のDLLは管理されたインストーラーの発信元情報を遡って取得しません。 ポリシーの検証時に管理されたインストーラー追跡が有効になった後に新しいDLLを生成してください。

In-Memory OLTP の AppLocker ポリシーと管理されたインストーラー ポリシーを作成する手順

管理されたインストーラーのルールコレクションのルールを作成するために、GPOエディター(gpedit.msc)のAppLockerポリシー作成UIやAppLockerのPowerShellコマンドレットを使うことはできません。 ただし、XMLやテキストエディタを使ってEXEルール収集ポリシーを管理されるインストーラールールコレクションに変換することは可能です。

重要

Hekaton DLL生成実行ファイルをサーバーのAppLocker Controlポリシー設定に追加する前に、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インスタンスに配布するか、単一サーバーのローカルポリシーに適用できます。 ドメイン管理者と連携して、ドメインレベルでコード整合性ポリシーを適用してください。

  1. New-AppLockerPolicy を使用して、マネージド インストーラーとして指定するファイルの EXE 規則を作成します。 この例では、Publisherルールタイプを使って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.
    $sqlPathParams = @{
       Path = 'HKLM:\SOFTWARE\Microsoft\MSSQLServer\Setup'
       Name = 'SQLPath'
    }
    $SQLPath = Get-ItemProperty @sqlPathParams
    
    $joinPathParams = @{
       Path = $SQLPath.SQLPath
       ChildPath = 'Binn\xtp'
    }
    $FullPath = Join-Path @joinPathParams
    
    # Set an environment variable for the In-memory OLTP Path.
    [System.Environment]::SetEnvironmentVariable('SQLPathWithXtp', $FullPath, 'Process')
    
    # Generate an AppLocker Policy for hkdllgen.exe in the current working directory.
    # The Get-AppLockerFileInformation cmdlet extracts the executable's publisher
    # information, and generates a hash for the binary.
    $hkDllGenPath = Join-Path -Path $env:SQLPathWithXtp -ChildPath 'hkdllgen.exe'
    
    $newPolicyParams = @{
       RuleType = 'Publisher'
       User = 'Everyone'
       Xml = $true
    }
    Get-ChildItem -Path $hkDllGenPath |
    Get-AppLockerFileInformation |
    New-AppLockerPolicy @newPolicyParams > 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 マネージド インストーラー構成ポリシーを展開します。 AppLockerポリシーをインポートしてグループポリシーでデプロイするか、以下のPowerShellコマンドに示されているように 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 Application Identity サービスと AppLocker フィルタードライバを設定してください。

    appidtel.exe start [-mionly]
    

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

Windows Defender Application Control(WDAC)がhkdllgen.exeプロセスによって生成されたDLLを信頼するために、App Controlポリシーで「Enabled: Managed Installer」オプションを指定します。 この設定は、 Set-RuleOption コマンドレット とオプション13を使って定義します。

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

既定の Windows ポリシー以降では、このガイドで削除されるオプションが少なくなります。 デフォルトWindowsモードおよびAllow Microsoftモードポリシーの詳細については、「ビジネスベースのポリシーの例示アプリコントロール」記事をご覧ください。

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

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

Windowsのポリシーベーステンプレートを選択した後、ポリシー名を付け、App Controlポリシーをディスクに保存する場所を選択します。

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

ポリシータイプとして「 複数ポリシーフォーマット 」と 「ベースポリシー 」を選択してください。

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

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

管理インストーラー、再起動なしのポリシー更新、署名なしシステム整合性ポリシーユーザーモードコード整合性ポリシーのルールオプションのみを有効にします。 その他のポリシー ルール オプションを無効にします。 設定を変更するには、ポリシールールのタイトル横にあるスライダーボタンを選択してください。

以下の表は、左端の列から始まる各ポリシールールを説明します。 ポリシールールの記事では、各ポリシールールの詳細な説明が提供されています。

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

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

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

ファイル ルール

すべてのポリシー署名ルールをリストから削除してください。

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

(任意)hkdllgen.exeのカスタムPublisher許可ルールを追加してください。 このルールは、実行ファイルの既存のMicrosoftコード署名証明書の情報を用いて、HkDllGenのマッチングバージョンを識別し許可します。

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

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

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

ルール作成を選択すると、単一のポリシー署名ルールが存在するはずです。

WDAC ポリシー署名規則の一覧画面のスクリーンショット。

アプリ制御ポリシーをデプロイします。 「ビジネス向けアプリ制御ポリシーの展開」を参照してください。

ポリシーが作成された後、新しいポリシーはポリシーファイルの場所として選ばれたパスに書き込まれます。 新しいバイナリバージョンのポリシーファイル名には、ファイル名の最後にポリシーバージョンが含まれています。 <policy>.cipファイルをSQL ServerインスタンスのC:\Windows\System32\CodeIntegrity\CiPolicies\Activeサブディレクトリにコピーできます。

コード整合性ポリシーを手動で展開する

より効率的なコード整合性ポリシーを作成するには、WDACアプリ制御ポリシーウィザードを完了した後に生成するより汎用的な <policy>.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>

この例には署名済みパブリッシャールールがなく、ポリシーファイルがファイル名Hekaton_Custom_CIPolicy.xmlのローカルワーキングディレクトリ(例えばC:\Temp)を使用していると仮定しています。

$policyPath = '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)
$policyIdParams = @{
    FilePath = $policyPath
    PolicyName = 'Hekaton Managed Installer Policy'
    ResetPolicyID = $true
}
Set-CIPolicyIdInfo @policyIdParams

$option13Params = @{
    FilePath = $policyPath
    Option = 13
}
Set-RuleOption @option13Params

$option16Params = @{
    FilePath = $policyPath
    Option = 16
}
Set-RuleOption @option16Params

# Retrieve the Policy ID from the App Control policy XML.
# Code Integrity uses this ID as the binary file name.
[xml]$AppControlPolicy = Get-Content -Path $policyPath
$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.
$convertParams = @{
    XmlFilePath = $policyPath
    BinaryFilePath = "C:\Windows\System32\CodeIntegrity\CiPolicies\Active\$PolicyBinary"
}
ConvertFrom-CIPolicy @convertParams

サーバーを再起動せずにポリシーを適用し、コードの整合性の状態を確認するには、次の PowerShell スクリプトを実行します。

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

# View the current status of WDAC Code Integrity. If WDAC is in Audit mode
# the "UserModeCodeIntegrityPolicyEnforcementStatus" has a value of "1"
# for Audit mode. A value of "0" mean that Code Integrity is not active.
$deviceGuardParams = @{
    ClassName = 'Win32_DeviceGuard'
    Namespace = 'root\Microsoft\Windows\DeviceGuard'
}
Get-CimInstance @deviceGuardParams | Format-List *codeintegrity*

生成された Hekaton DLL がコード整合性によって信頼されていることを確認する

AppLocker管理インストーラールールと必要なAppLockerサービスが有効になったら、HkDllGenを通じて新しい In-Memory OLTP DLLを生成してください。 Windows HkDllGen プロセスツリーを追跡し、そのプロセスツリーで作成されたファイルに$KERNEL.SMARTLOCKER.ORIGINCLAIM拡張属性を追加します。

App Controlが監査または強制モードで Enabled:Managed Installerを使用している場合、Code Integrityは管理されたインストーラーの起源に基づいて生成されたDLLを信頼できます。 拡張属性が追加されたことを確認するには、 \Data\xtp\<database_id> フォルダから新たに生成されたDLLを選択し、昇格されたコマンドプロンプトから以下のコマンドを実行します。

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

fsutil 出力のスクリーンショット。

$KERNEL.SMARTLOCKER.ORIGINCLAIMの存在だけでは、そのファイルが管理されているインストーラーの発信源であることを証明できません。 同じ拡張属性は、インテリジェントセキュリティグラフの起源や信頼の継承方法を記録できます。 最初のデータ行では、2番目のULONGの冒頭にある00がマネージドインストーラーのオリジンを示し、01はインテリジェントセキュリティグラフのオリジンを示します。 残りの原産地請求値を評価するには、 管理インストーラーおよびISGの技術参考文献を参照してください。

管理インストーラーの削除機能

デバイスからマネージドインストーラー機能を削除するには、「Delete a AppLocker」ルールの指示に従って、Managed Installer AppLockerポリシーをデバイスから削除してください :単一またはリモートシステムでAppLockerポリシーをクリアする。