Cómo desactivar SMBv1 (protocolo Bloque de mensajes del servidor versión 1) con PowerShell

El protocolo Bloque de mensajes del servidor (SMB) existe desde hace bastante tiempo y es una especie de columna vertebral para compartir archivos y otras operaciones de red. Sin embargo, la primera versión, SMBv1, actualmente se considera un problema debido a una multitud de vulnerabilidades de seguridad. Si eres un profesional de TI o un proveedor de servicios gestionados (MSP), garantizar la seguridad de la red debería ser tu principal preocupación. Entonces, ¿cómo desactivar SMBv1 de forma eficaz?

¿Qué hace el script?

Este script PowerShell ha sido diseñado con un propósito muy concreto: desactivar SMBv1 en entornos Windows. Funciona utilizando una secuencia de cmdlets de PowerShell incorporados y modificaciones del Registro para garantizar que SMBv1 está completamente desactivado. El script puede ejecutarse en un entorno Windows 10 o Windows Server 2016 o posterior, lo que lo hace muy versátil y valioso para cualquier sistema Windows moderno.

El script: desactivar SMBv1

#Requires -Version 5.1

<#
.SYNOPSIS
    Disables SMB v1
.DESCRIPTION
    Disables SMB v1 via Get-WindowsOptionalFeature, Set-SmbServerConfiguration, or Registry
.EXAMPLE
    No parameters needed.
.EXAMPLE
    PS C:> Disable-SMBv1.ps1
    No parameters needed.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    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).
#>

[CmdletBinding()]
param ()

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"
        )
        # Do not output errors and continue
        $ErrorActionPreference = [System.Management.Automation.ActionPreference]::SilentlyContinue
        if (-not $(Test-Path -Path $Path)) {
            # Check if path does not exist and create the path
            New-Item -Path $Path -Force | Out-Null
        }
        if ((Get-ItemProperty -Path $Path -Name $Name)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = Get-ItemProperty -Path $Path -Name $Name
            try {
                Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false -ErrorAction Continue | Out-Null
            }
            catch {
                Write-Error $_
            }
            Write-Host "$Path$Name changed from $CurrentValue to $(Get-ItemProperty -Path $Path -Name $Name)"
        }
        else {
            # Create property with value
            try {
                New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false -ErrorAction Continue | Out-Null
            }
            catch {
                Write-Error $_
            }
            Write-Host "Set $Path$Name to $(Get-ItemProperty -Path $Path -Name $Name)"
        }
        $ErrorActionPreference = [System.Management.Automation.ActionPreference]::Continue
    }
    $Disable = 0
    # $Enable = 1 # Not Used
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    
    # Try using Get-WindowsOptionalFeature first
    if (-not $(Get-Command -Name "Get-WindowsOptionalFeature").Name -like "Get-WindowsOptionalFeature") {
        Write-Host "Get-WindowsOptionalFeature command not found. Continuing."
    }
    else {
        if ((Get-WindowsOptionalFeature -Online -FeatureName smb1protocol -ErrorAction SilentlyContinue).State -notlike "Disabled") {
            # Disables smb1protocol feature
            try {
                Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol
                # Disabled SMB1, exit
                exit 0
            }
            catch {
                Write-Host "smb1protocol feature not found. Continuing."
            }
        }
    }

    if (-not $(Get-Command -Name "Get-SmbServerConfiguration").Name -like "Get-SmbServerConfiguration") {
        Write-Host "Get-SmbServerConfiguration command not found. Continuing."
        $Path = "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters"
        $Name = "SMB1"
        # https://docs.microsoft.com/en-us/windows-server/storage/file-server/troubleshoot/detect-enable-and-disable-smbv1-v2-v3#registry-editor
        # Sets SMB1 to 0
        Set-ItemProp -Path $Path -Name $Name -Value $Disable
    }
    if ((Get-SmbServerConfiguration).EnableSMB1Protocol) {
        try {
            Set-SmbServerConfiguration -EnableSMB1Protocol $false            
        }
        catch {
            Write-Host "Failed to disable SMBv1."
            exit 1
        }
    }
}
end {}

 

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

Obtén acceso

Preocupaciones de seguridad relacionadas con SMBv1

SMBv1 es conocido por sus carencias en términos de seguridad. Ha sido blanco frecuente de diversos tipos de ataques, ransomware y violaciones de datos. Tener SMBv1 activado es como dejar la puerta de casa abierta; simplemente estás invitando a los problemas a entrar. Este script de PowerShell resuelve eficazmente el problema desactivando SMBv1.

Tiempo y eficacia

Desactivar manualmente SMBv1 puede necesitar mucho tiempo, especialmente en entornos de red a gran escala. Este script automatiza el proceso, ahorrando tiempo y esfuerzo. Para los MSP que gestionan redes de varios clientes, esta herramienta es una bendición.

Un enfoque integral

El script intenta desactivar SMBv1 a través de múltiples vías, incluyendo el cmdlet Get-WindowsOptionalFeature, el cmdlet Set-SmbServerConfiguration y ediciones directas del Registro. Esto garantiza que el protocolo se desactive, incluso si uno de los métodos falla o no está disponible en el sistema en cuestión.

Cómo utilizar el script para desactivar SMBv1

Ejecutar el script es sencillo. He aquí una guía rápida:

  1. Guarda el script en un archivo llamado Disable-SMBv1.ps1.
  2. Abre PowerShell como administrador.
  3. Navega hasta la carpeta donde guardaste el script.
  4. Ejecuta el script escribiendo PS C:>.Disable-SMBv1.ps1 y pulsando Intro.

Asegúrate de que tienes privilegios de Administrador, o el script terminará, precisamente para que no realices cambios que no deberías accidentalmente.

¿A quién le resulta útil este script?

  • Profesionales de TI: si te encargas del mantenimiento de una red corporativa o incluso de una de menor escala, este script debería formar parte de tu kit de herramientas. De este modo, podrás automatizar el proceso de desactivación de SMBv1 en varios sistemas con una sola operación.
  • Proveedores de servicios gestionados (MSP): para quienes gestionan redes de varios clientes, la posibilidad de desactivar rápidamente protocolos vulnerables como SMBv1 puede añadir una capa adicional de seguridad, haciendo que el servicio sea más valioso para los clientes.

Integración del script con NinjaOne

Para los profesionales de TI y proveedores de servicios gestionados (MSP) que confían en NinjaOne como solución de monitorización y gestión remota, la incorporación de este script en su protocolo de mantenimiento regular o de seguridad puede añadir otra capa de solidez a sus operaciones.

Ejecución programada

Puedes programar la ejecución del script PowerShell a través del motor de scripting de NinjaOne. De este modo, te aseguras de que SMBv1 se deshabilite automáticamente en todos los sistemas nuevos que se añadan a la red o en cualquier sistema que se reinicie, manteniendo así una postura de seguridad uniforme.

Supervisión y alertas

Con las funciones de alerta de NinjaOne, puedes crear alertas personalizadas que te notifiquen cuando el script se haya ejecutado correctamente o si se encuentran problemas. Esto te proporciona información en tiempo real, lo que te permite intervenir en caso necesario.

Despliegue remoto

El script para desactivar SMBv1 puede ser desplegado remotamente en múltiples sistemas a través de NinjaOne. Esto es especialmente útil para los MSP que gestionan una amplia gama de redes. Con unos pocos clics puedes aplicar una política de seguridad crítica en todos tus endpoints gestionados.

Informes de cumplimiento

Para los requisitos de cumplimiento como el GDPR o la HIPAA, donde la desactivación de protocolos obsoletos y vulnerables puede ser obligatoria, la ejecución de este script a través de NinjaOne puede ser una forma sencilla de demostrar la existencia de medidas de seguridad adecuadas. Las funciones de creación de informes de NinjaOne pueden ayudarte a generar informes completos para los registros de auditoría.

Reflexiones finales

Desactivar SMBv1 debería ser una obligación para cualquier organización que se tome en serio la seguridad de la red. Este script de PowerShell proporciona un método fiable, eficaz y completo para hacerlo. Dada la necesidad crítica de mejorar los protocolos de seguridad en el panorama informático empresarial actual, adoptar este script debería ser una prioridad absoluta.

Categorías:

Quizá también te interese…

×

¡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).