Cómo restringir el acceso de Python en Microsoft Excel mediante PowerShell

En el lugar de trabajo moderno, la seguridad de los datos y la gestión del acceso son cada vez más cruciales, especialmente a medida que las organizaciones integran diversos lenguajes y herramientas de programación en sus operaciones diarias.

Una de estas integraciones es el uso de Python en Microsoft Excel, una potente función que puede mejorar la productividad, pero que también plantea posibles riesgos de seguridad. Para los profesionales de TI y los proveedores de servicios gestionados (MSP), gestionar y restringir el acceso de Python en Excel es esencial para mantener un entorno seguro.

Este post explora un script de PowerShell diseñado para controlar el uso de Python en Excel, garantizando que se mantienen los protocolos de seguridad sin comprometer la funcionalidad.

Contexto

Con la creciente popularidad de Python en el análisis de datos y la automatización, su integración en Excel proporciona a los usuarios funciones avanzadas. Sin embargo, esta integración también introduce posibles vulnerabilidades, sobre todo si los scripts de Python se ejecutan sin la debida supervisión.

Los profesionales de TI y los MSP deben equilibrar las ventajas de las capacidades de Python con la necesidad de salvaguardar los datos confidenciales. El script de PowerShell que se analiza aquí ofrece una solución al permitir a los administradores restringir el acceso de Python en Excel, ya sea activando los avisos de seguridad, bloqueando completamente el acceso de Python o volviendo a la configuración predeterminada de Microsoft.

El script para restringir el acceso de Python

<#
.SYNOPSIS
    Restricts the use of Python in Excel for all users. By default it'll enable a security prompt but does have the option to block or to set it back to the Microsoft default (no warnings or prompts).
.DESCRIPTION
    Restricts the use of Python in Excel for all users. By default it'll enable a security prompt but does have the option to block or to set it back to the Microsoft default (no warnings or prompts).
.EXAMPLE
    (No Parameters)
    
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1

PARAMETER: -Block
    Blocks the use of Python in Excel.
.EXAMPLE
    -Block

    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 2
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 2
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 2

PARAMETER: -IncludeNewUsers
    Adds the registry key to the Default Profile so that this change carriers over when new accounts are created.
.EXAMPLE
    -IncludeNewUsers

    Set Registry::HKEY_USERS\DefaultProfile\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 1
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 1

PARAMETER: -ChangeBackToMicrosoftDefault
    Resets the setting/restriction back to the Microsoft Default (enabled with no security prompt).
.EXAMPLE
    -ChangeBackToMicrosoftDefault

    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1001\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 0
    Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1002\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings changed from 1 to 0
    Set Registry::HKEY_USERS\S-1-5-21-3870645062-3653562310-3850680542-1003\software\policies\microsoft\office\16.0\excel\security\PythonFunctionWarnings to 0
.LINK
    https://support.microsoft.com/en-us/office/data-security-and-python-in-excel-33cc88a4-4a87-485e-9ff9-f35958278327
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 8.1, Server 2012
    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://ninjastage2.wpengine.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 (
    [Parameter()]
    [Switch]$Block = [System.Convert]::ToBoolean($env:blockPython),
    [Parameter()]
    [Switch]$IncludeNewUsers = [System.Convert]::ToBoolean($env:includeNewUsers),
    [Parameter()]
    [Switch]$ChangeBackToMicrosoftDefault = [System.Convert]::ToBoolean($env:changeBackToMicrosoftDefaultSetting)
)

begin {

    # If incompatible options are detected error out
    if($Block -and $ChangeBackToMicrosoftDefault){
        Write-Error "-ChangeBackToMicrosoftDefault and -Block cannot be used together. The 'Change Back To Microsoft Default' option is to set Python in Excel back to how Microsoft ships the feature (with all security warnings disabled)."
        exit 1
    }

    # Write a warning message for the least secure option
    if($ChangeBackToMicrosoftDefault){
        Write-Warning "Changing the setting back to the default. All Python security warnings will be disabled..."
    }

    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    # Handy registry setting function
    function Set-HKProperty {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet('DWord', 'QWord', 'String', 'ExpandedString', 'Binary', 'MultiString', 'Unknown')]
            $PropertyType = 'DWord'
        )
        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 -ErrorAction SilentlyContinue)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = (Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name
            try {
                Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Error $_
                exit 1
            }
            Write-Host "$Path\$Name changed from $CurrentValue to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name)"
        }
        else {
            # Create property with value
            try {
                New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error "[Error] Unable to Set registry key for $Name please see below error!"
                Write-Error $_
                exit 1
            }
            Write-Host "Set $Path\$Name to $($(Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue).$Name)"
        }
    }

    # This function will gather all the user profiles on the system for use later
    function Get-UserHives {
        param (
            [Parameter()]
            [ValidateSet('AzureAD', 'DomainAndLocal', 'All')]
            [String]$Type = "All",
            [Parameter()]
            [String[]]$ExcludedUsers,
            [Parameter()]
            [switch]$IncludeDefault
        )
    
        # User account SID's follow a particular patter depending on if they're azure AD or a Domain account or a local "workgroup" account.
        $Patterns = switch ($Type) {
            "AzureAD" { "S-1-12-1-(\d+-?){4}$" }
            "DomainAndLocal" { "S-1-5-21-(\d+-?){4}$" }
            "All" { "S-1-12-1-(\d+-?){4}$" ; "S-1-5-21-(\d+-?){4}$" } 
        }
    
        # We'll need the NTuser.dat file to load each users registry hive. So we grab it if their account sid matches the above pattern. 
        $UserProfiles = Foreach ($Pattern in $Patterns) { 
            Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" |
                Where-Object { $_.PSChildName -match $Pattern } | 
                Select-Object @{Name = "SID"; Expression = { $_.PSChildName } },
                @{Name = "UserName"; Expression = { "$($_.ProfileImagePath | Split-Path -Leaf)" } }, 
                @{Name = "UserHive"; Expression = { "$($_.ProfileImagePath)\NTuser.dat" } }, 
                @{Name = "Path"; Expression = { $_.ProfileImagePath } }
        }
    
        # There are some situations where grabbing the .Default user's info is needed.
        switch ($IncludeDefault) {
            $True {
                $DefaultProfile = "" | Select-Object UserName, SID, UserHive, Path
                $DefaultProfile.UserName = "Default"
                $DefaultProfile.SID = "DefaultProfile"
                $DefaultProfile.Userhive = "$env:SystemDrive\Users\Default\NTUSER.DAT"
                $DefaultProfile.Path = "$env:SystemDrive\Users\Default"
    
                $DefaultProfile | Where-Object { $ExcludedUsers -notcontains $_.UserName }
            }
        }
    
        $UserProfiles | Where-Object { $ExcludedUsers -notcontains $_.UserName }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # If we're only asked to set it for existing users we won't include the default registry hive
    if($IncludeNewUsers){
        $UserProfiles = Get-UserHives -Type "All" -IncludeDefault
    }else{
        $UserProfiles = Get-UserHives -Type "All"
    }
    
    $Key = "software\policies\microsoft\office\16.0\excel\security"
    $PropertyName = "PythonFunctionWarnings"

    if($ChangeBackToMicrosoftDefault){
        # No Prompt and unlocked
        $Value = 0
    }

    # This is the default option for the script
    if(-not ($ChangeBackToMicrosoftDefault) -and -not ($Block)){
        # Prompt
        $Value = 1
    }
    
    if($Block){
        # Block
        $Value = 2
    }

    # Loop through each profile on the machine
    Foreach ($UserProfile in $UserProfiles) {
        # Load User ntuser.dat if it's not already loaded
        If (($ProfileWasLoaded = Test-Path Registry::HKEY_USERS\$($UserProfile.SID)) -eq $false) {
            Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe LOAD HKU\$($UserProfile.SID) `"$($UserProfile.UserHive)`"" -Wait -WindowStyle Hidden
        }

        Set-HKProperty -Path "Registry::HKEY_USERS\$($UserProfile.SID)\$Key" -Name $PropertyName -Value $Value
        
        # Unload NTuser.dat
        If ($ProfileWasLoaded -eq $false) {
            [gc]::Collect()
            Start-Sleep 1
            Start-Process -FilePath "cmd.exe" -ArgumentList "/C reg.exe UNLOAD HKU\$($UserProfile.SID)" -Wait -WindowStyle Hidden | Out-Null
        }
    }
}
end {
    
    
    
}

 

Análisis detallado

El script PowerShell proporcionado está diseñado para restringir el acceso de Python en Excel. Aquí tienes un desglose paso a paso de cómo funciona el script para restringir el acceso de Python:

1. Parámetros del script:

  • Block: este parámetro bloquea el uso de Python en Excel estableciendo la clave de registro PythonFunctionWarnings en 2, impidiendo de forma efectiva cualquier ejecución de Python.
  • -IncludeNewUsers: cuando se utiliza este parámetro, el script también aplica la restricción a los nuevos perfiles de usuario, garantizando que cualquier usuario futuro creado en el sistema herede la misma configuración.
  • ChangeBackToMicrosoftDefault: esta opción restablece la clave del registro a su valor predeterminado (0), lo que permite que Python se ejecute sin ningún aviso o advertencia de seguridad.

2. Manipulación del registro:

  • El script para restringir el acceso de Python opera modificando el Registro de Windows, específicamente apuntando a la clave PythonFunctionWarningskey localizada bajo la configuración de seguridad de Excel. Dependiendo de los parámetros pasados, el script establece esta clave en 0, 1 o 2, lo que corresponde a ninguna advertencia, un aviso de seguridad o un bloqueo completo, respectivamente.

3. Gestión de perfiles de usuario:

  • El script recupera todos los perfiles de usuario del sistema y aplica los cambios en el registro en consecuencia. También incluye una función para cargar y descargar el archivo NTUSER.DAT para cada perfil de usuario, asegurando que los cambios se apliquen incluso si el usuario no está conectado en ese momento.

4. Tratamiento de errores y comprobación de elevación:

  • El script para restringir el acceso de Python  comprueba si se está ejecutando con privilegios elevados (derechos de administrador) y finalizará con un mensaje de error en caso contrario. Esto es crucial, ya que modificar el registro requiere tales privilegios.

Posibles casos de uso

Imagina a un MSP que gestiona la infraestructura informática de una gran organización. Recientemente han introducido la integración de Python en Excel para el análisis avanzado de datos, pero les preocupan los riesgos potenciales de la ejecución no regulada de scripts Python.

Al desplegar este script de PowerShell para restringir el acceso de Python, el MSP puede implementar avisos de seguridad en todas las cuentas de usuario, garantizando que cualquier intento de ejecutar Python en Excel requiera una aprobación explícita. Además, pueden bloquear por completo la ejecución de Python en máquinas que manejen información confidencial, como datos financieros, para mitigar aún más los riesgos.

Comparaciones

Existen otros métodos para restringir el uso de Python en Excel, como la configuración de directivas de grupo o la edición manual del registro. Sin embargo, es posible que estos enfoques no ofrezcan el mismo nivel de granularidad o automatización que proporciona el script PowerShell para restringir el acceso de Python.

Por ejemplo, aunque la directiva de grupo puede ser eficaz, es posible que no se aplique fácilmente a todos los perfiles de usuario o que no permita el bloqueo selectivo frente a la solicitud. Por otro lado, la edición manual del registro es propensa a errores y poco práctica para implantaciones a gran escala.

FAQ

1. ¿Qué ocurre si utilizo los parámetros -Block y -ChangeBackToMicrosoftDefault a la vez?

  • El script para restringir el acceso de Python terminará con un error, ya que estas dos opciones son incompatibles. El bloqueo de Python y la vuelta a la configuración por defecto no pueden hacerse simultáneamente.

2. ¿Necesito ejecutar el script como administrador?

  • Sí, el script para restringir el acceso de Python requiere privilegios elevados para modificar el registro.

3. ¿Puedo aplicar esta configuración a los nuevos usuarios de forma automática?

  • Sí, al utilizar el parámetro -IncludeNewUsers, el script se asegura de que los nuevos perfiles de usuario hereden las mismas restricciones de Python.

Implicaciones

Restringir el uso de Python en Excel puede tener implicaciones significativas para la seguridad de los datos dentro de una organización. Los administradores de TI pueden impedir la ejecución de scripts no autorizados o maliciosos, protegiendo así los datos confidenciales. Sin embargo, también es esencial considerar el impacto en la productividad, ya que unas políticas demasiado restrictivas pueden obstaculizar casos de uso legítimos.

Recomendaciones

Al utilizar este script para restringir el acceso de Python, es aconsejable:

  • Probar la configuración en un pequeño grupo de usuarios antes de realizar un despliegue a gran escala para asegurarte de que no interrumpes el funcionamiento normal.
  • Revisar y actualizar periódicamente las restricciones en función de la evolución de las necesidades de seguridad de la organización y de la introducción de nuevas herramientas o prácticas.
  • Considerar la posibilidad de utilizar el parámetro -IncludeNewUsers para mantener políticas de seguridad coherentes en toda la organización.

Reflexiones finales

Gestionar la integración de Python en Excel es una tarea crítica para los profesionales de TI y los MSP, especialmente en entornos en los que la seguridad de los datos es primordial. Este script PowerShell proporciona una solución robusta para restringir el acceso de Python, ofreciendo flexibilidad y automatización que otros métodos pueden carecer.

Para aquellos que buscan agilizar y asegurar aún más sus operaciones de TI, NinjaOne ofrece herramientas y servicios integrales diseñados para satisfacer las necesidades de la gestión moderna de TI. Ya sea mediante la automatización, la supervisión o la gestión de la seguridad, NinjaOne puede ayudarte a mantener una infraestructura de TI segura y eficiente.

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…

×

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