Compartir a través de


Cómo crear directivas de control de aplicaciones OLTP y del instalador administrado de In-Memory

Se aplica a:SQL Server

SQL Server compila y vincula una biblioteca de vínculos dinámicos (DLL) para cada tabla compilada nativa y procedimiento almacenado que tiene la implementación nativa de esos objetos en código C. Aunque los archivos DLL de OLTP de In-Memory se generan dinámicamente, los propios archivos pueden presentar algunos desafíos cuando hay requisitos de cumplimiento que tienen la integridad del código como criterio.

¿Qué es HKDLLGEN?

En SQL Server 2022 (16.x) Actualización acumulativa 17 y versiones posteriores, se agregó un componente conocido como generador DLL de Hekaton a la característica OLTP de In-Memory. Sin el nuevo proceso de generación de DLL de Hekaton (hkdllgen), el proceso principal de SQL Server convierte T-SQL en código C y, a continuación, inicia procesos de compilador y enlazador para generar archivos DLL OLTP In-Memory sin firmar. Hkdllgen, como aplicación intermedia, valida y acepta la salida de SQL Server y, a continuación, crea archivos DLL firmados por. Para aplicar directivas de integridad de código para estos archivos DLL, el proceso de Hkdllgen tendría que designarse como Control de aplicaciones de Windows Defender (WDAC) Instalador administrado.

El generador de DLL de Hekaton es el primer paso para garantizar que se puedan cumplir los requisitos de cumplimiento normativo, como integridad de código con archivos DLL generados por OLTP In-Memory. La integridad del código en este contexto garantiza que los archivos DLL que In-Memory OLTP genera son de confianza para el sistema operativo desde el momento en que se crean hasta que se cargan y ejecutan. La capacidad de designar el componente de generador de DLL de Hekaton como instalador administrado permite al sistema de integridad de código WDAC confiar en los archivos DLL que se generan y permite su uso.

¿Cómo funciona un instalador administrado?

El instalador administrado usa una colección de reglas especiales en AppLocker para designar archivos binarios de confianza para su organización como origen autorizado para la instalación de la aplicación. Cuando se ejecuta uno de estos archivos binarios de confianza, Windows supervisa el proceso del binario (y los procesos secundarios que inicia) y supervisa los archivos que se escriben en el disco. A medida que se escriben los archivos, se agrega una notificación o etiqueta al archivo, indicando que se originan de un instalador administrado.

Con AppLocker, el control de aplicaciones WDAC se puede configurar para confiar en los archivos instalados por un instalador administrado agregando la opción Habilitado:Instalador administrado a una directiva de Control de aplicaciones. Cuando se establece esa opción, App Control comprueba si hay información de origen del instalador administrado al determinar si se va a permitir que se ejecute un archivo binario. Siempre que no haya reglas de denegación para el binario, El control de aplicaciones le permite ejecutarse basándose exclusivamente en su origen del instalador administrado. AppLocker también controla la ejecución de archivos ejecutables designados como instalador administrado, pero no ofrece una cadena de confianza para archivos ejecutables y dll como WDAC. En este artículo, se explica cómo designar y configurar el proceso de hkdllgen como un instalador administrado que puede usar AppLocker y WDAC.

Habilitación del generador de DLL de Hekaton

Ejemplo

En este ejemplo, se usa sp_configure para habilitar la opción del generador de DLL Hekaton, que se denomina external xtp dll gen util enabled. Se crea una base de datos de prueba, junto con una tabla optimizada para memoria de prueba.

  1. Cree una base de datos de prueba.

    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. Cree una tabla de prueba dentro de la base de datos de prueba.

    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. Se genera un nuevo archivo de longitud cero con una extensión .gen para cada .dll dentro del subdirectorio <path-to-data-directory>\xtp\<database_id>. Los archivos DLL ahora están firmados.

Pasos para crear directivas OLTP AppLocker y instalador administrado en memoria

La interfaz de usuario de creación de directivas de AppLocker en el Editor de GPO (gpedit.msc) y los cmdlets de PowerShell de AppLocker no se pueden usar directamente para crear reglas para la colección de reglas del instalador administrado. Sin embargo, puede usar un editor de texto o XML para convertir una directiva de colección de reglas EXE en una colección de reglas ManagedInstaller.

Importante

Debe existir una directiva de AppLocker antes de agregar el ejecutable hekaton DLL Generation a una configuración de directiva de control de AppLocker de servidores; de lo contrario, existe el riesgo de que Windows Defender bloquee las funciones básicas del sistema operativo. Para obtener más información sobre la creación, las pruebas y el mantenimiento de las directivas de control de aplicaciones, consulte la guía de implementación de AppLocker.

Los ejemplos restantes se aplican a windows Server 2022 y windows 11 y versiones posteriores.

Para comprobar que al menos existe una colección de reglas de exe dentro de la configuración de la directiva de control de AppLocker de servidores, ejecute el siguiente comando de PowerShell:

Get-AppLockerPolicy -Effective

O bien, para guardar la salida de las directivas vigentes en un archivo XML para su visualización:

Get-AppLockerPolicy -Effective -Xml > effective_app_policy.xml

Los pasos siguientes le guían por el proceso de creación y aplicación de una directiva que se puede aplicar a un servidor local. Una directiva del instalador administrado que se genera mediante estos pasos se puede combinar en una directiva de todo el GPO y distribuirla a todos los servidores SQL Server dentro de un entorno, o bien se puede aplicar a la directiva local de un solo servidor. Se recomienda trabajar con un administrador de dominio para que la directiva de integridad de código se aplique desde el nivel de dominio.

  1. Use New-AppLockerPolicy para crear una regla EXE para el archivo que va a diseñar como instalador administrado. En este ejemplo se crea una regla para el generador de DLL de Hekaton mediante el tipo de regla publisher, pero se puede usar cualquier tipo de regla de AppLocker. Es posible que tenga que volver a formatear la salida para mejorar la legibilidad.

    #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. Edite manualmente el AppLocker_HKDLLGEN_Policy.xml y cambie los siguientes valores de atributo:

    • RuleCollection Type a ManagedInstaller
    • EnforcementMode a AuditOnly
    • BinaryVersionRange LowSection a "*" y HighSection a "*"

    Cambio:

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

    para:

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

    Cambio:

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

    para:

    <BinaryVersionRange LowSection="*" HighSection="*"/>
    
  3. Implemente la directiva de configuración del instalador administrado de AppLocker. Puede importar la directiva de AppLocker e implementarla con directiva de grupo o usar un script para implementar la directiva con el cmdlet Set-AppLockerPolicy tal como se muestra en el siguiente comando de 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
    
  4. Si implementa la directiva de AppLocker a través de un script de PowerShell, use la utilidad appidtel.exe desde un símbolo del sistema administrativo para configurar el servicio de identidad de aplicación de AppLocker y el controlador de filtro de AppLocker.

    appidtel.exe start [-mionly]
    

Habilitar la opción del instalador administrado en el Asistente para el Control de aplicaciones de Windows Defender para empresas

Para que Control de aplicaciones de Windows Defender (WDAC) confíe en los archivos DLL generados por el hkdllgen.exe proceso, la opción Habilitado: Instalador administrado debe especificarse en la directiva de Control de aplicaciones. Esta configuración se puede definir mediante el cmdlet Set-RuleOption con la opción 13.

Genere un archivo de directiva de integridad de código a partir de una de las directivas base de Asistente para directivas base de WDAC plantilla.

A partir de directiva Predeterminada de Windows proporciona menos opciones, que se quitan en esta guía. Puede acceder a más información sobre el modo de Windows predeterminado y Permitir directivas de modo de Microsoft a través del artículo Directivas base de ejemplo de Control de aplicaciones para empresas.

Directiva de plantilla base

Captura de pantalla de la plantilla base WDAC.

Una vez seleccionada la plantilla base de directiva de Windows, asigne un nombre a la directiva y elija dónde guardar la directiva de Control de aplicaciones en el disco.

Selección de un tipo de directiva

Elija el formato de directiva múltiple y directiva base como tipo de directiva

Recorte de pantalla de la pantalla Seleccionar tipo de directiva WDAC.

Configuración de la plantilla de directiva

Habilite solo el instalador administrado, la directiva de actualización sin reiniciar, la directiva de integridad del sistema sin firmar y las opciones de regla de directiva de integridad de código en modo de usuario. Deshabilite las demás opciones de regla de directiva. Para ello, presione el botón deslizante situado junto a los títulos de la regla de directiva.

En la tabla siguiente se incluye una descripción de cada regla de directiva, empezando por la columna de la izquierda. El artículo sobre las reglas de la política , sección, proporciona una descripción más completa de cada normativa de la política.

Opción de regla Descripción
Instalador administrado Use esta opción para permitir automáticamente las aplicaciones instaladas por una solución de distribución de software, como el generador de DLL hekaton, que se ha definido como un instalador administrado.
Directiva de actualización sin reiniciar Use esta opción para permitir que se apliquen actualizaciones futuras de directivas de App Control para empresas sin necesidad de reiniciar el sistema.
Directiva de integridad del sistema sin firmar Permite que la directiva permanezca sin firmar. Cuando se quita esta opción, la directiva debe estar firmada y tener UpdatePolicySigners agregados a la directiva para habilitar futuras modificaciones de directiva.
Integridad de Código en Modo de Usuario Las directivas de Control de aplicaciones para empresas restringen los archivos binarios en modo kernel y en modo de usuario. De forma predeterminada, solo los archivos binarios en modo kernel están restringidos. Al habilitar esta opción de regla, se validan los ejecutables y scripts del modo de usuario.

Captura de pantalla de la pantalla de Configuración de la plantilla de directiva.

Debe habilitar Modo de auditoría inicialmente, ya que le permite probar nuevas directivas de Control de aplicaciones para negocios antes de aplicarlas. Con el modo de auditoría, no se bloquea ninguna aplicación; en su lugar, la directiva registra un evento cada vez que se inicia una aplicación fuera de la directiva. Por este motivo, todas las plantillas tienen habilitado el modo de auditoría de forma predeterminada.

Reglas de archivo

Quite todas las reglas de firma de directivas de la lista.

Recorte de pantalla de Reglas de archivo WDAC.

(Opcional) Agregue una regla de directiva de Publicador personalizado que garantizaría que los archivos como hkdllgen.exe se firmaran como publicador.

Captura de pantalla de la Directiva Personalizada de WDAC.

El tipo de regla de archivo del publicador usa propiedades de la cadena de certificados de firma de código para basar las reglas de archivo.

Captura de pantalla de la interfaz de reglas de la directiva WDAC.

Después de seleccionar el botón Crear regla, debe existir una única regla de firma de directiva.

Recorte de pantalla de la lista de reglas de firma de la directiva WDAC.

Implemente la directiva de Control de aplicaciones. Consulte Implementación de directivas de Control de aplicaciones para negocios.

Una vez creada la directiva, la nueva directiva se escribe en la ruta elegida como ubicación del archivo de la directiva. La nueva versión binaria del nombre del archivo de directiva tiene la versión de directiva anexada al final del nombre de archivo. La directivaarchivo .cip se puede copiar en el subdirectorio C:\Windows\System32\CodeIntegrity\CiPolicies\Active en la instancia de SQL Server.

Implementar manualmente una directiva de integridad de código

Para crear una directiva de integridad de código más simplificada, se puede editar un archivo de directiva de más genérico.xml que se generó después de completar el Asistente para directivas de control de aplicaciones WDAC. Este escenario puede surgir si el Asistente para directivas de control de aplicaciones WDAC no se ejecuta en sql Server, sino desde una estación de trabajo. Por ejemplo, un archivo de directiva de integridad de código menos personalizado podría ser similar al siguiente:

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

Este ejemplo no tiene una regla de publicador firmada y supone que el archivo de directiva usa un directorio de trabajo local (por ejemplo, C:\Temp) con un nombre de archivo de 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"

Para aplicar la directiva sin reiniciar el servidor y comprobar el estado de integridad de código, ejecute este script de 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*

Compruebe que los archivos DLL de Hekaton generados son de confianza para la integridad de código.

Una vez que la integridad de código funciona en modo auditoría o modo activo, los archivos DLL generados por el generador de DLL Hekaton son de confianza para Windows y tienen un agregado extendido con atributos a los archivos.

Se agrega una notificación Smartlocker como parte de los metadatos. Esto se puede ver mediante el comando fsutil desde un símbolo del sistema administrativo. Por ejemplo, al seleccionar uno de los archivos OLTP en memoria generados dinámicamente desde la carpeta \Data\xtp\<database_id> y ejecutando el siguiente comando:

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

Captura de pantalla de la salida fsutil.

Quitar la función del Instalador Administrado

Para quitar la característica instalador administrado del dispositivo, debe quitar la directiva de AppLocker del instalador administrado del dispositivo siguiendo las instrucciones de Eliminar una regla de AppLocker: Borrar directivas de AppLocker en un único sistema o sistemas remotos.