Cómo configurar la autenticación NTLM en Windows mediante PowerShell

En un panorama de ciberseguridad en constante evolución, es primordial proteger las comunicaciones y el intercambio de datos. Uno de estos protocolos que ha sido objeto de debate es la autenticación NTLM (NT LAN Manager), que se utiliza para autenticar usuarios en entornos Microsoft. Con los recientes avances y la preocupación por la seguridad, se ha producido un cambio de las antiguas versiones de NTLM a la más segura NTLMv2. Hoy profundizaremos en un script de PowerShell que ayuda a gestionar las respuestas de autenticación NTLM mediante la configuración de LmCompatibilityLevel en el registro de Windows.

Antecedentes

Desarrollado originalmente como protocolo de autenticación por Microsoft, la autenticación NTLM ha sido objeto de varias actualizaciones para hacer frente a diversas vulnerabilidades de seguridad. Sin embargo, a medida que surgieron mecanismos de autenticación más seguros, especialmente NTLMv2, se hizo evidente la necesidad de restringir o desactivar las versiones anteriores. Este script ayuda a los profesionales de TI y a los proveedores de servicios gestionados (MSP) a realizar esta transición sin problemas, sin tener que navegar manualmente por complejas configuraciones del registro.

El script para configurar la autenticación NTLM en Windows

#Requires -Version 5.1

<#
.SYNOPSIS
    Set the LM and NTLMv1 authentication responses via LmCompatibilityLevel in the registry
.DESCRIPTION
    Set the LM and NTLMv1 authentication responses via LmCompatibilityLevel in the registry
.EXAMPLE
    No parameters needed.
    Sets LAN Manager auth level to 5, "Send NTLMv2 response only. Refuse LM & NTLM."
.EXAMPLE
     -LmCompatibilityLevel 5
    Sets LAN Manager auth level to 5, "Send NTLMv2 response only. Refuse LM & NTLM."
.EXAMPLE
     -LmCompatibilityLevel 3
    Sets LAN Manager auth level to 3, "Send NTLMv2 response only."
    This is the default from Windows 7 and up.
.EXAMPLE
    PS C:> Disable-LmNtlmV1.ps1 -LmCompatibilityLevel 5
    Sets LAN Manager auth level to 5, "Send NTLMv2 response only. Refuse LM & NTLM."
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Reference chart: https://ss64.com/nt/syntax-ntlm.html
    Release Notes:
    Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
.COMPONENT
    ProtocolSecurity
#>

[CmdletBinding()]
param (
    [Parameter()]
    [ValidateRange(0, 5)]
    [int]
    $LmCompatibilityLevel = 5
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
        { Write-Output $true }
        else
        { Write-Output $false }
    }
    function Set-ItemProp {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet("DWord", "QWord", "String", "ExpandedString", "Binary", "MultiString", "Unknown")]
            $PropertyType = "DWord"
        )
        New-Item -Path $Path -Force -ErrorAction SilentlyContinue | Out-Null
        if ((Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue)) {
            Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false | Out-Null
        }
        else {
            New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false | Out-Null
        }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    $Path = @(
        "HKLM:SYSTEMCurrentControlSetServicesLsa"
        "HKLM:SYSTEMCurrentControlSetControlLSA"
    )
    $Name = "LmCompatibilityLevel"
    # $Value = $LmCompatibilityLevel
    # Sets LmCompatibilityLevel to $LmCompatibilityLevel
    try {
        $Path | ForEach-Object {
            Set-ItemProp -Path $_ -Name $Name -Value $LmCompatibilityLevel
        }
        
    }
    catch {
        Write-Error $_
        exit 1
    }
    $Path | ForEach-Object {
        $Value = Get-ItemPropertyValue -Path $_ -Name $Name -ErrorAction SilentlyContinue
        if ($null -eq $Value) {
            Write-Host "$_$Name set to: OS's default value(3)."
        }
        else {
            Write-Host "$_$Name set to: $Value"
        }
    }
}
end {}

 

Accede a más de 300 scripts en el Dojo de NinjaOne

Obtén acceso

Análisis detallado

El script se divide esencialmente en tres fases: inicio, proceso y final.

  • Fase de inicio: el script comienza con la definición de dos funciones:
  • Test-IsElevated: comprueba si el script se ejecuta con privilegios de administrador.
  • Set-ItemProp: crea o establece una propiedad de clave de registro.
  • Fase del proceso: verifica que el usuario tiene derechos elevados. En caso contrario, se indica un error. De otra manear, pasa a modificar el LmCompatibilityLevel en dos posibles rutas del registro. Tras la modificación, el script confirma la configuración aplicada.
  • Fase final: no se utiliza explícitamente, pero es un marcador de posición para posibles futuras actualizaciones o ampliaciones del script.

Posibles casos de uso

Estudio de caso: Imagina a Marta, administradora de TI en una empresa mediana. Recientemente se han sometido a una auditoría de seguridad que ha revelado que algunos sistemas siguen utilizando versiones de NTLM obsoletas. Con cientos de máquinas que gestionar, no es factible actualizar manualmente cada una de ellas. Usando este script, Marta actualiza sin problemas todos los sistemas, asegurándose de que sólo aceptan respuestas NTLMv2.

Comparaciones

Aunque la directiva de grupo también se puede utilizar para gestionar la configuración de NTLM en una organización, scripts de PowerShell, como el que tratamos en este post, ofrecen más granularidad y automatización. Pueden integrarse en herramientas de automatización o flujos de trabajo más amplios, agilizando el proceso y haciéndolo menos propenso a errores manuales.

FAQ

  • ¿Cómo comprueba el script si se tienen privilegios de administrador?
    El script utiliza la función Test-IsElevated para determinar si se está ejecutando con derechos de administrador.
  • ¿Qué ocurre si quiero establecer un valor de LmCompatibilityLevel diferente?
    Puedes hacerlo proporcionando el parámetro -LmCompatibilityLevel al ejecutar el script, por ejemplo, Disable-LmNtlmV1.ps1 -LmCompatibilityLevel 3.
  • ¿Es compatible con versiones anteriores de Windows?
    El script es compatible con Windows 10 y Windows Server 2016 en adelante.

Implicaciones

Al establecer el LmCompatibilityLevel, los profesionales de TI dictan cómo los sistemas manejan la autenticación NTLM. La restricción a NTLMv2 mejora la seguridad, reduciendo los riesgos asociados a versiones más antiguas y menos seguras. Sin embargo, es crucial garantizar la compatibilidad, ya que los sistemas o aplicaciones más antiguos pueden tener problemas de conectividad tras los cambios.

Recomendaciones

  • Haz siempre una copia de seguridad del estado actual del registro antes de realizar cambios.
  • Primero, prueba el script en un entorno controlado para comprender su impacto.
  • Mantente al día sobre las mejores prácticas de seguridad e intégralas en tus auditorías rutinarias.

Reflexiones finales

Mientras que los scripts PowerShell como estos permiten a los profesionales de TI mejorar la seguridad, las herramientas de supervisión y gestión como NinjaOne elevan aún más estas capacidades. Con supervisión, automatización e informes integrados, plataformas como NinjaOne garantizan que tu infraestructura de TI siga siendo sólida, segura y eficiente, complementando los scripts y las intervenciones manuales.

Recuerda que, en el ámbito de las TI, las medidas proactivas, combinadas con las herramientas adecuadas, allanan el camino hacia una mayor seguridad y una gestión eficaz del sistema.

 

Próximos pasos

La creación de un equipo de TI próspero y eficaz requiere contar con una solución centralizada que se convierta en tu principal herramienta de prestación de servicios. NinjaOne permite a los equipos de TI supervisar, gestionar, proteger y dar soporte a todos sus dispositivos, estén donde estén, sin necesidad de complejas infraestructuras locales.

Obtén más información sobre NinjaOne Endpoint Management, echa un vistazo a un tour en vivoo tu prueba gratuita de la plataforma NinjaOne.

Categorías:

Quizá también te interese…

Ver demo×
×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón «Acepto» que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona «tal cual» y «según disponibilidad», sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).