Cómo monitorizar las modificaciones de los archivos y garantizar su integridad mediante PowerShell

En el mundo de la informática, mantener la integridad y seguridad de los archivos es primordial. Los profesionales de TI y los proveedores de servicios gestionados (MSP) necesitan métodos fiables para monitorizar las modificaciones de los archivos con el fin de evitar cambios no autorizados, garantizar el cumplimiento y mantener la estabilidad del sistema. Este post explora un potente script PowerShell diseñado para comprobar si un archivo existe, determinar si se ha modificado en un plazo de tiempo especificado y verificar su integridad mediante una comprobación hash.

Contexto

Los profesionales de TI y los MSP se enfrentan a menudo al reto de garantizar que los archivos permanezcan inalterados a menos que el personal autorizado los modifique explícitamente. Las modificaciones no autorizadas pueden provocar brechas de seguridad, corrupción de datos y problemas de cumplimiento. Para hacer frente a estos retos, se necesita una solución sólida que controle los cambios en los archivos y garantice su integridad. Este script PowerShell para monitorizar las modificaciones de los archivos ofrece un enfoque simplificado para abordar estas necesidades, proporcionando alertas basadas en condiciones específicas, como cambios en los archivos o la falta de ellos.

El script para monitorizar las modificaciones de los archivos

<#
.SYNOPSIS
    Checks whether a file is present and if it has been updated within your specified time frame or fails a hash check.
.DESCRIPTION
    Checks whether a file is present and if it has been updated within your specified time frame or fails a hash check.

PARAMETER: -Alert "Alert If Change" or -Alert "Alert If No Change"
    Raise an alert if the file has or hasn't been modified based on your other parameters.

PARAMETER: -Hash "REPLACEMEC32D73431CED24FF114B2A216671C60117AF5012B40"
    The hash or checksum to verify that the file hasn't been modified.
PARAMETER: -Algorithm "SHA256"
    The hashing algorithm used for your inputted hash.
.EXAMPLE
    -Path "C:\TestFile.txt" -Hash "REPLACEME04C6F26CC32D73431CED24FF114B2A216671C60117AF5012B40" -Alert "Alert If No Change"

    C:\TestFile.txt exists!
    Hash Given: REPLACEME04C6F26CC32D73431CED24FF114B2A216671C60117AF5012B40
    Current Hash: 35BAFB1CE99AEF3AB068AFBAABAE8F21FD9B9F02D3A9442E364FA92C0B3EEEF0
    Hash mismatch!

.EXAMPLE
    -Path "C:\TestFile.txt" -Hash "35BAFB1CE99AEF3AB068AFBAABAE8F21FD9B9F02D3A9442E364FA92C0B3BEEF0" -Alert "Alert If No Change"

    C:\TestFile.txt exists!
    Hash Given: 35BAFB1CE99AEF3AB068AFBAABAE8F21FD9B9F02D3A9442E364FA92C0B3BEEF0
    Current Hash: 35BAFB1CE99AEF3AB068AFBAABAE8F21FD9B9F02D3A9442E364FA92C0B3BEEF0
    Hash matches!
    [Alert] File has not been modified!

PARAMETER: -Days "REPLACEMEWITHANUMBER"
    Raise an alert if the file hasn't been modified within the specified number of days. 
    Minutes and Hours are added to this time.

PARAMETER: -Hours "REPLACEMEWITHANUMBER"
    Raise an alert if the file hasn't been modified within the specified number of hours. 
    Days and Minutes are added to this time.

PARAMETER: -Minutes "REPLACEMEWITHANUMBER"
    Raise an alert if the file hasn't been modified within the specified number of minutes. 
    Days and Hours are added to this time.
.EXAMPLE
    -Path "C:\TestFile.txt" -Days 365 -Alert "Alert If Change"

    C:\TestFile.txt exists!
    Checking if the file was modified in the last 365 day(s) 00 hour(s) 00 minute(s)
    File was last modified on 02/07/2024 14:59:56.
    File has been updated within the time period.
    [Alert] File has been modified!
.EXAMPLE
    -Path "C:\TestFile.txt" -Days 30 -Alert "Alert If Change"

    C:\TestFile.txt exists!
    Checking if the file was modified in the last 30 day(s) 00 hour(s) 00 minute(s)
    File was last modified on 05/15/2023 15:13:55.
    File has not been modified within the time period.

.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 8+, 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://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 (
    [Parameter()]
    [String]$Alert,
    [Parameter()]
    [String]$Path,
    [Parameter()]
    [String]$Hash,
    [Parameter()]
    [String]$Algorithm = "SHA256",
    [Parameter()]
    [int]$Days,
    [Parameter()]
    [int]$Hours,
    [Parameter()]
    [int]$Minutes
)

begin {
    # Replace parameters with dynamic script variables
    if ($env:alert -and $env:alert -notlike "null") { $Alert = $env:alert }
    if ($env:targetFilePath -and $env:targetFilePath -notlike "null") { $Path = $env:targetFilePath }
    if ($env:hash -and $env:hash -notlike "null") { $Hash = $env:hash }
    if ($env:algorithm -and $env:algorithm -notlike "null") { $Algorithm = $env:algorithm }
    if ($env:daysSinceLastModification -and $env:daysSinceLastModification -notlike "null") { $Days = $env:daysSinceLastModification }
    if ($env:hoursSinceLastModification -and $env:hoursSinceLastModification -notlike "null") { $Hours = $env:hoursSinceLastModification }
    if ($env:minutesSinceLastModification -and $env:minutesSinceLastModification -notlike "null") { $Minutes = $env:minutesSinceLastModification }

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

    if (-not (Test-IsElevated)) {
        Write-Warning -Message "Some files or folders may require local Administrator permissions to view."
    }

    # Verify the given algorithm is supported by PowerShell
    $AllowedAlgorithms = "SHA1", "SHA256", "SHA384", "SHA512", "MD5"
    if ($AllowedAlgorithms -notcontains $Algorithm) {
        Write-Host "[Error] Invalid Algorithm selected ($Algorithm)! Allowed selections are 'SHA1','SHA256','SHA384','SHA512' and 'MD5'."
        exit 1
    }

    # Check for required parameter
    if (-Not ($Path)) {
        Write-Host "[Error] A filepath is required!"
        Exit 1
    }

    switch ($Alert) {
        "Alert If Change" { Write-Verbose "Alerting if file $Path has been modified." }
        "Alert If No Change" { Write-Verbose "Alerting if file $Path has not been modified." }
        default { Write-Verbose "No alert was selected." }
    }

    $ExitCode = 0
}
process {

    # File existence check
    if ($Path -and -Not (Test-Path $Path -ErrorAction SilentlyContinue)) {
        Write-Host "[Alert] $Path does not exist!"
        Exit 1
    }
    else {
        Write-Host "$Path exists!"
    }

    # Confirm we were given a filepath and not a directory
    $File = Get-Item -Path $Path -ErrorAction SilentlyContinue
    if ($File.PSIsContainer) {
        Write-Host "[Error] Please provide a file path, not a directory."
        Exit 1
    }

    # If given the files hash verify it matches
    if ($Hash) {
        $CurrentHash = Get-FileHash -Path $File.FullName -Algorithm $Algorithm | Select-Object -ExpandProperty Hash
        Write-Host "Hash Given: $Hash"
        Write-Host "Current Hash: $CurrentHash"

        if ($Hash -notlike $CurrentHash) {
            Write-Host "Hash mismatch!"

            if($Alert -eq "Alert If Change"){
                Write-Host "[Alert] File has been modified!"
                $ExitCode = 1
            }
        }
        else {
            Write-Host "Hash matches!"

            if($Alert -eq "Alert If No Change"){
                Write-Host "[Alert] File has not been modified!"
                $ExitCode = 1
            }
        }
    }

    # Get the current date and subtract the days, hours and minutes to compare with the file 
    $Cutoff = Get-Date
    $CurrentDate = $Cutoff

    if ($Days) { $Cutoff = $Cutoff.AddDays(-$Days) }
    if ($Hours) { $Cutoff = $Cutoff.AddHours(-$Hours) }
    if ($Minutes) { $Cutoff = $Cutoff.AddMinutes(-$Minutes) }

    $TimeSpan = New-TimeSpan $Cutoff $CurrentDate

    if (($Days -or $Hours -or $Minutes) -and ($Cutoff -ne $CurrentDate)) {
        Write-Host "Checking if the file was modified in the last $($TimeSpan.ToString("dd' day(s) 'hh' hour(s) 'mm' minute(s)'"))"
        Write-Host "File was last modified on $($File.LastWriteTime)."

        if ($File.LastWriteTime -ge $Cutoff) {
            Write-Host "File has been updated within the time period."

            if($Alert -eq "Alert If Change"){
                Write-Host "[Alert] File has been modified!"
                $ExitCode = 1
            }
        }
        else {
            Write-Host "File has not been updated within the time period."

            if($Alert -eq "Alert If No Change"){
                Write-Host "[Alert] File has not been modified!"
                $ExitCode = 1
            }
        }
    }

    Exit $ExitCode
}
end {

 

Análisis detallado

Este script de PowerShell para monitorizar las modificaciones de los archivos está diseñado para comprobar la existencia de un archivo, verificar si se ha modificado en un periodo de tiempo determinado y realizar una comprobación hash para garantizar la integridad del archivo. Desglosemos el script paso a paso:

  1. Definición de parámetros: el script para monitorizar las modificaciones de los archivos comienza definiendo parámetros, incluyendo Alerta, Ruta, Hash, Algoritmo, Días, Horas y Minutos. Estos parámetros permiten a los usuarios especificar el archivo que se va a supervisar, el hash esperado, el algoritmo hash y el plazo de tiempo para las comprobaciones de modificación.
  2. Sustitución de variables de entorno: el script sustituye dinámicamente los parámetros por variables de entorno si están configuradas. Esta flexibilidad permite una fácil integración con sistemas automatizados y scripts.
  3. Comprobación de permisos de administrador: se utiliza una función Test-IsElevated para verificar si el script para monitorizar las modificaciones de los archivos se está ejecutando con privilegios de administrador, asegurando que tiene los permisos necesarios para acceder y monitorizar los archivos especificados.
  4. Validación del algoritmo: el script comprueba si el algoritmo hash proporcionado es compatible. Los algoritmos permitidos son SHA1, SHA256, SHA384, SHA512 y MD5.
  5. Comprobación de existencia y tipo de fichero: el script para monitorizar las modificaciones de los archivos verifica si la ruta especificada existe y confirma que es un archivo, no un directorio.
  6. Verificación Hash: si se proporciona un hash, el script calcula el hash actual del archivo utilizando el algoritmo especificado y lo compara con el hash dado. A continuación, alerta si hay una falta de coincidencia o si el archivo no se ha modificado en función del parámetro Alerta.
  7. Comprobación del tiempo de modificación: el script para monitorizar las modificaciones de los archivos calcula la hora límite en función de los parámetros Días, Horas y Minutos. A continuación, compara la última hora de modificación del archivo con la hora de corte y emite una alerta si el archivo se ha modificado o no en el plazo especificado.

Posibles casos de uso

Imagina a un profesional de TI responsable de mantener la seguridad e integridad de los archivos de configuración sensibles de un servidor. Con este script para monitorizar las modificaciones de los archivos, puede configurar una comprobación diaria para verificar si se ha alterado algún archivo crítico. Por ejemplo, podría utilizar el script para supervisar un archivo de configuración, asegurándose de que no se ha modificado inesperadamente. Si el script detecta un cambio, emite una alerta que permite al profesional informático investigar y tomar las medidas oportunas.

Comparaciones

En comparación con otros métodos para supervisar los cambios en los archivos, como el uso de software de terceros o las comprobaciones manuales, este script de PowerShell para monitorizar las modificaciones de los archivos ofrece varias ventajas:

  • Rentabilidad: al ser un script de PowerShell, elimina la necesidad de costosas soluciones de terceros.
  • Personalización: los usuarios pueden modificar fácilmente el script para adaptarlo a sus necesidades específicas.
  • Integración: el script puede integrarse en los flujos de trabajo y sistemas de automatización existentes.

FAQ

1) ¿Cómo se ejecuta este script?

Para ejecutar el script para monitorizar las modificaciones de los archivos, guárdalo como archivo .ps1 y ejecútalo en PowerShell con los parámetros adecuados.

2) ¿Este script puede monitorizar varios archivos a la vez?

El script está diseñado para monitorizar las modificaciones de los archivos uno a uno. Sin embargo, puedes modificarlo para que recorra varios archivos en bucle si es necesario.

3) ¿Qué ocurre si no tengo privilegios de administrador?

El script emitirá una advertencia y es posible que no se pueda acceder a algunos archivos o carpetas sin los permisos necesarios.

Implicaciones

El uso de este script para monitorizar las modificaciones de los archivos tiene importantes implicaciones para la seguridad informática. Garantiza la rápida detección de cualquier modificación no autorizada, lo que permite una rápida respuesta y mitigación. La supervisión periódica ayuda a mantener la integridad del sistema, garantiza el cumplimiento de las políticas de seguridad y protege frente a posibles infracciones.

Recomendaciones

  • Controles periódicos: programa comprobaciones periódicas para garantizar la supervisión continua de los archivos críticos.
  • Integración: integra el script para monitorizar las modificaciones de los archivos en tus herramientas existentes de gestión y automatización de TI para un funcionamiento sin problemas.
  • Copias de seguridad: mantén siempre copias de seguridad de los archivos críticos para restaurarlos en caso de modificaciones no autorizadas.

Reflexiones finales

Supervisar las modificaciones de los archivos es crucial para mantener la seguridad y la integridad de las TI. Este script de PowerShell para monitorizar las modificaciones de los archivos proporciona una solución eficaz y personalizable para los profesionales de TI y los MSP. Al integrar este script en tu flujo de trabajo, puedes garantizar una supervisión continua y una detección rápida de cualquier cambio no autorizado. Para obtener soluciones de gestión de TI más completas, considera la posibilidad de probar NinjaOne, una potente plataforma diseñada para mejorar tis operaciones y seguridad de TI.

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