Zo maakt u beleid voor In-Memory OLTP App Control en beheerde installatieprogramma's

van toepassing op:SQL Server-

SQL Server compileert en koppelt een dynamic-link library (DLL) voor elke native gecompileerde tabel en opgeslagen procedure, met de native implementatie van die objecten in C-code. Hoewel In-Memory OLTP-DLL's dynamisch worden gegenereerd, kunnen de bestanden uitdagingen vormen in omgevingen waar code-integriteitshandhaving vereist is.

Wat is HkDllGen?

In SQL Server 2022 (16.x) Cumulative Update 17 en latere versies bevat de In-Memory OLTP-functie de Hekaton-DLL-generator, oftewel HkDllGen. Zonder HkDllGen genereert SQL Server de C-bron binnen sqlservr.exe en start de compiler, die de linker aanroept om de In-Memory OLTP DLL te maken. Met externe generatie ingeschakeld, exporteert SQL Server geserialiseerde objectmetadata en start het door Microsoft ondertekende hkdllgen.exe. HkDllGen valideert en importeert die metadata, genereert de C-bron in een eigen proces en start de compiler en linker.

Om codeintegriteit voor deze DLL's af te dwingen, gebruik je AppLocker om de Microsoft-signed hkdllgen.exe aan te wijzen als een beheerde installer en schakel je het vertrouwen van Managed Installer in in het App Control for Business-beleid, voorheen Windows Defender Application Control (WDAC). Windows registreert vervolgens dat de gegenereerde DLL's afkomstig zijn van de HkDllGen-procesboom, waardoor App Control ze kan vertrouwen op basis van hun beheerde installer-oorsprong.

HkDllGen is de eerste stap richting het voldoen aan wettelijke vereisten die codeintegriteit voor In-Memory OLTP omvatten. In dit scenario zorgt codeintegriteit ervoor dat Windows een vertrouwde oorsprong kan opstellen voor elke gegenereerde DLL en dat vertrouwen kan evalueren wanneer SQL Server deze laadt. De gegenereerde DLL is niet Authenticode-ondertekend. Windows vertrouwt het op basis van hoe het is gemaakt.

Hoe werkt een beheerd installatieprogramma?

Een beheerde installer gebruikt een speciale regelverzameling in AppLocker om binaries aan te wijzen die uw organisatie vertrouwt als geautoriseerde bron voor applicatie-installatie. Wanneer een van deze vertrouwde binaire bestanden wordt uitgevoerd, bewaakt Windows het proces van het binaire bestand (en alle door dit proces gestarte subprocessen) en kijkt het naar bestanden die naar de schijf worden geschreven. Wanneer bestanden worden geschreven, wordt een claim of tag toegevoegd aan het bestand als afkomstig van een beheerd installatieprogramma.

Het oorsprongskenmerk is een door de kernel beheerd uitgebreid attribuut. Het is geen Authenticode-handtekening en verandert de uitgever of signeringsstatus van de gegenereerde DLL niet.

Door AppLocker te gebruiken, kan App Control for Business (voorheen Windows Defender Application Control, of WDAC) worden geconfigureerd om bestanden te vertrouwen die een beheerde installer installeert door de optie Enabled:Managed Installer toe te voegen aan een App Control-beleid. Wanneer u die optie instelt, controleert App Control of er herkomstinformatie van een beheerde installer aanwezig is bij het bepalen of een binair bestand mag worden uitgevoerd. Zolang er geen regels voor weigeren voor het binaire bestand zijn, kan App Control worden uitgevoerd op basis van de oorsprong van het beheerde installatieprogramma. AppLocker beheert ook de uitvoering van uitvoerbare bestanden die het aanwijst als een beheerde installatie, maar biedt geen vertrouwensketen voor uitvoerbare bestanden en DLL's zoals WDAC. Dit artikel legt uit hoe je het HkDllGen-proces kunt aanwijzen en configureren als een beheerde installer die zowel AppLocker als WDAC kunnen gebruiken.

De Hekaton DLL-generator inschakelen

Voorbeeld

Dit voorbeeld schakelt de Hekaton-DLL-generator in met external xtp dll gen util enabled met de optie sp_configure. Maak een testdatabase en een testgeheugen-geoptimaliseerde tabel aan.

  1. Maak een testdatabase.

    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. Maak een testtabel in de testdatabase.

    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. Er wordt naast elke DLL die via HkDllGen in de submap <path-to-data-directory>\xtp\<database_id> wordt gegenereerd, een .gen-bestand aangemaakt. Dit bestand legt HkDllGen-uitvoer vast en heeft normaal gesproken nul lengte na een succesvolle compilatie. De aanwezigheid ervan geeft aan dat de externe generator is ingeschakeld. De gegenereerde DLL's zijn niet Authenticode-ondertekend. Om Windows de gegenereerde DLL's op basis van hun oorsprong te vertrouwen, heb je Managed Installer tracking en een App Control-beleid nodig.

Bestaande DLL's krijgen niet achteraf de herkomstinformatie van beheerde installers. Genereer een nieuwe DLL nadat managed installer tracking actief is bij het valideren van het beleid.

Stappen voor het maken van beleidsregels voor In-Memory OLTP, AppLocker en beheerde installatieprogramma's

Je kunt de AppLocker-beleidscreatie-UI in GPO Editor (gpedit.msc) of de AppLocker PowerShell-cmdlets niet gebruiken om regels te maken voor de beheerde installatieregelverzameling. Je kunt echter een XML- of teksteditor gebruiken om een EXE-regelverzamelingsbeleid om te zetten in een beheerde installatieregelverzameling.

Belangrijk

Je hebt een AppLocker-beleid nodig voordat je het Hekaton DLL-generatie-uitvoerbare bestand toevoegt aan de AppLocker Control-beleidsconfiguratie van een server. Zonder beleid kan Windows Defender basisfuncties van het besturingssysteem blokkeren. Voor meer informatie over het creëren, testen en onderhouden van applicatiecontrolebeleid, zie de AppLocker-implementatiegids.

De overige voorbeelden in dit artikel zijn van toepassing op Windows Server 2022 en Windows 11 en latere versies.

Om te verifiëren dat er ten minste een exe-regelcollectie bestaat binnen de AppLocker Control-beleidsconfiguratie van de server, voer je het volgende PowerShell-commando uit:

Get-AppLockerPolicy -Effective

Of voer het volgende commando uit om de uitvoer van de effectieve beleidsregels op te slaan in een XML-bestand voor weergave:

Get-AppLockerPolicy -Effective -Xml > effective_app_policy.xml

De volgende stappen beschrijven het proces van het aanmaken en toepassen van een beleid dat je kunt toepassen op een lokale server. Een beheerd installerbeleid dat met deze stappen wordt gegenereerd, kan worden samengevoegd tot een GPO-breed beleid en verspreid naar alle SQL Server-instanties binnen een omgeving, of worden toegepast op het lokale beleid van één enkele server. Je zou met een domeinbeheerder moeten samenwerken om het Code Integrity-beleid vanaf domeinniveau toe te passen.

  1. Gebruik New-AppLockerPolicy om een EXE-regel te maken voor het bestand dat u aanduidt als een beheerd installatieprogramma. Dit voorbeeld maakt een regel voor de Hekaton DLL-generator door het Publisher-regeltype te gebruiken, maar je kunt elk AppLocker-regeltype gebruiken. Mogelijk moet u de uitvoer opnieuw opmaken voor leesbaarheid.

    # 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. Bewerk de AppLocker_HkDllGen_Policy.xml handmatig en wijzig de volgende kenmerkwaarden:

    • RuleCollection Type tot ManagedInstaller
    • EnforcementMode tot AuditOnly
    • BinaryVersionRange LowSection tot "*" en HighSection tot "*"

    Veranderen:

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

    Aan:

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

    Veranderen:

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

    Aan:

    <BinaryVersionRange LowSection="*" HighSection="*"/>
    
  3. Implementeer het configuratiebeleid voor het beheerde installatieprogramma van AppLocker. Je kunt het AppLocker-beleid importeren en het implementeren met Group Policy, of een script gebruiken om het beleid te implementeren met de Set-AppLockerPolicy cmdlet zoals getoond in het volgende PowerShell-commando.

    #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. Als je het AppLocker-beleid met een PowerShell-script deployt, gebruik dan de appidtel.exe utility vanuit een administratieve opdrachtprompt om de AppLocker Application Identity-service en de AppLocker-filterdriver te configureren.

    appidtel.exe start [-mionly]
    

De optie voor het beheerde installatieprogramma inschakelen in de wizard Windows Defender Application Control for Business

Om Windows Defender Application Control (WDAC) te vertrouwen op de DLL's die door het proces worden gegenereerdhkdllgen.exe, specificeer je de optie Enabled: Managed Installer in je App Control-beleid. Definieer deze instelling door de cmdletSet-RuleOption te gebruiken met optie 13.

Genereer een code-integriteitsbeleidsbestand van een van de wizard WDAC-basisbeleid sjabloonbasisbeleid.

Beginnen met het standaardbeleid voor Windows biedt minder opties, die in deze handleiding worden verwijderd. Voor meer informatie over de Default Windows Mode en Allow Microsoft Mode-beleidsregels, zie het artikel over de basisbeleid van App Control for Business.

Basissjabloonbeleid

Schermopname van het scherm WDAC-basissjabloon.

Nadat je het Windows-beleidsbasissjabloon hebt geselecteerd, geef je het beleid een naam en kies je waar je het App Control-beleid op de schijf opslaat.

Een beleidstype selecteren

Kies het Multiple Policy Format en Base Policy als beleidstype.

Schermopname van het scherm WDAC Selecteer beleidstype.

Beleidssjabloon configureren

Schakel alleen de beleidsregelopties Managed Installer, Beleid bijwerken zonder opnieuw op te starten, Niet-ondertekend systeemintegriteitsbeleid en Code-integriteit in gebruikersmodus in. Schakel de andere beleidsregelopties uit. Om de instellingen te wijzigen, selecteer je de schuifknop naast de titels van de beleidsregels.

De volgende tabel beschrijft elke beleidsregel, beginnend met de meest linkse kolom. Het artikel over beleidsregels geeft een meer gedetailleerde beschrijving van elke beleidsregel.

Regeloptie Beschrijving
Beheerd installatieprogramma Gebruik deze optie om automatisch applicaties toe te staan die worden geïnstalleerd door een softwaredistributieoplossing, zoals de Hekaton DLL-generator, die is gedefinieerd als een beheerde installer.
Beleid bijwerken zonder opnieuw op te starten Gebruik deze optie om toe te staan dat toekomstige app-beheer voor bedrijven-beleidsupdates worden toegepast zonder dat een systeem opnieuw hoeft te worden opgestart.
Beleid voor systeemintegriteit zonder handtekening Hiermee staat u toe dat het beleidsdocument ongetekend blijft. Wanneer deze optie wordt verwijderd, moet het beleid worden ondertekend en moet UpdatePolicySigners aan het beleid worden toegevoegd om toekomstige beleidswijzigingen mogelijk te maken.
Gebruikersmodus-code-integriteit Beleid voor App-beheer voor Bedrijven beperkt zowel kernelmodus als binaries in gebruikersmodus. Standaard worden alleen binaire bestanden in de kernelmodus beperkt. Als u deze regeloptie inschakelt, worden uitvoerbare bestanden en scripts in de gebruikersmodus gevalideerd.

schermopname van het scherm Beleidssjabloon configureren.

U moet in eerste instantie auditmodus inschakelen, omdat u hiermee nieuwe App Control for Business-beleidsregels kunt testen voordat u ze afdwingt. In de auditmodus wordt geen enkele applicatie geblokkeerd. In plaats daarvan registreert het beleid een gebeurtenis telkens wanneer een applicatie buiten het beleid start. Daarom is voor alle sjablonen standaard controlemodus ingeschakeld.

Bestandsregels

Verwijder alle beleidsondertekeningsregels uit de lijst.

Schermopname van het scherm WDAC-bestandsregels.

(Optioneel) Voeg een Custom Publisher toelaatregel toe voor hkdllgen.exe. Deze regel gebruikt informatie uit het bestaande Microsoft-codeondertekeningscertificaat van het uitvoerbare bestand om versies van HkDllGen te identificeren en te laten matchen.

Schermopname van het aangepaste WDAC-beleidsscherm.

Het Publisher-bestandsregeltype gebruikt eigenschappen in de certificaatketen voor het ondertekenen van programmacode om bestandsregels op te stellen.

Schermafbeelding van het WDAC-beleidsregelscherm.

Nadat je Create Rule hebt geselecteerd, zou er één Policy Signing-regel moeten bestaan.

Schermopname van het WDAC-beleidsondertekeningsregelscherm.

Implementeer uw app-beheerbeleid. Zie Implementeren van App Control for Business-beleid.

Nadat het beleid is aangemaakt, wordt het nieuwe beleid geschreven naar het pad dat als locatie van het beleidbestand is gekozen. De nieuwe binaire versie van de beleidsbestandsnaam bevat de beleidsversie aan het einde van de bestandsnaam. Je kunt het <policy>.cip bestand kopiëren naar de C:\Windows\System32\CodeIntegrity\CiPolicies\Active submap van de SQL Server-instantie.

Een code-integriteitsbeleid handmatig implementeren

Om een meer gestroomlijnd Code Integrity-beleid te creëren, kun je een generieker <policy>.xml bestand bewerken dat je genereert nadat je de WDAC App Control Policy Wizard hebt voltooid. Dit scenario kan ontstaan als je de WDAC App Control Policy Wizard niet op een SQL Server draait, maar vanaf een werkstation. Een minder aangepast code-integriteitsbeleidsbestand kan er bijvoorbeeld als volgt uitzien:

<?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>

Dit voorbeeld heeft geen signed publisher-regel en gaat ervan uit dat het policy-bestand een lokale werkmap gebruikt (bijvoorbeeld C:\Temp) met de bestandsnaam .Hekaton_Custom_CIPolicy.xml

$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

Als u het beleid wilt toepassen zonder de server opnieuw op te starten en de status van code-integriteit te controleren, voert u dit PowerShell-script uit:

# 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*

Controleer of de gegenereerde Hekaton-DLL's worden vertrouwd door Code Integrity

Nadat de AppLocker Managed Installer-regel en de benodigde AppLocker-diensten actief zijn, genereer je een nieuwe OLTP-DLL In-Memory via HkDllGen. Windows volgt de HkDllGen-procesboom en voegt een $KERNEL.SMARTLOCKER.ORIGINCLAIM uitgebreide attribuut toe aan bestanden die door die procesboom worden gemaakt.

Wanneer App Control in audit- of handhavingsmodus werkt met Enabled:Managed Installer, kan Code Integrity de gegenereerde DLL vertrouwen op basis van de oorsprong van de beheerde installer. Om te verifiëren dat het uitgebreide attribuut is toegevoegd, selecteer je een nieuw gegenereerde DLL uit de \Data\xtp\<database_id> map en voer je het volgende commando uit vanuit een verhoogde opdrachtprompt:

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

schermopname van fsutil-uitvoer.

De aanwezigheid van alleen $KERNEL.SMARTLOCKER.ORIGINCLAIM bevestigt niet dat het bestand afkomstig is van een beheerde installatie. Hetzelfde uitgebreide attribuut kan de oorsprong van Intelligent Security Graph en hoe vertrouwen is geërfd vastleggen. In de eerste gegevensrij identificeert ULONG aan het begin van de tweede 00 de herkomst van Managed Installer, terwijl 01 de herkomst van Intelligent Security Graph identificeert. Om de resterende waarden van origin-claims te beoordelen, raadpleegt u de technische referentie voor Managed Installer en ISG.

De functie Beheerd installatieprogramma verwijderen

Om de Managed Installer-functie van het apparaat te verwijderen, verwijdert u het Managed Installer AppLocker-beleid van het apparaat door de instructies in de regel Delete an AppLocker te volgen: Clear AppLocker-beleidsregels op één systeem of externe systemen.