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.