Wie man Dateiveränderungen überwacht und die Integrität mit PowerShell sicherstellt

In der IT-Welt ist die Wahrung der Integrität und Sicherheit von Dateien von größter Bedeutung. IT-Experten und Managed Service Provider (MSPs) benötigen zuverlässige Methoden zur Überwachung von Dateiänderungen, um unbefugte Modifikationen zu verhindern, die Compliance zu gewährleisten und die Systemstabilität zu erhalten. In diesem Blogbeitrag wird ein leistungsfähiges PowerShell-Skript vorgestellt, mit dem geprüft werden kann, ob eine Datei vorhanden ist, ob sie innerhalb eines bestimmten Zeitraums geändert wurde und ob ihre Integrität mithilfe einer Hash-Prüfung überprüft wurde.

Kontext

IT-Experten und MSPs stehen oft vor der Herausforderung, sicherzustellen, dass Dateien unverändert bleiben, es sei denn, sie werden ausdrücklich von autorisierten Mitarbeiter:innen geändert. Unerlaubte Änderungen können zu Sicherheitsverletzungen, Datenbeschädigung und Problemen bei der Compliance führen. Um diese Probleme zu bewältigen, ist eine robuste Lösung zur Überwachung von Dateiänderungen und zur Gewährleistung der Dateiintegrität erforderlich. Dieses PowerShell-Skript bietet einen optimierten Ansatz, um diese Anforderungen zu erfüllen, indem es Warnmeldungen auf der Grundlage bestimmter Bedingungen, wie zum Beispiel Dateiänderungen oder deren Fehlen, sendet.

Das Skript zur Überwachung von Dateiänderungen

<#
.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 {

 

Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.

Zugang erhalten

Detailansicht

Dieses PowerShell-Skript überprüft die Existenz einer Datei, stellt fest, ob sie innerhalb eines bestimmten Zeitraums geändert wurde, und führt eine Hash-Prüfung durch, um die Dateiintegrität sicherzustellen. Schauen wir uns das Skript Schritt für Schritt an:

  1. Definition der Parameter: Das Skript beginnt mit der Definition von Parametern wie Alert, Path, Hash, Algorithm, Days, Hours und Minutes. Mit diesen Parametern können Benutzer:innen die zu überwachende Datei, den erwarteten Hash-Wert, den Hash-Algorithmus und den Zeitrahmen für die Änderungsprüfungen angeben.
  2. Ersetzen von Umgebungsvariablen: Das Skript ersetzt die Parameter dynamisch durch Umgebungsvariablen, wenn diese gesetzt sind. Diese Flexibilität ermöglicht eine einfache Integration in automatisierte Systeme und Skripte.
  3. Überprüfung der Administratorberechtigungen: Mit der Funktion ‘Test-IsElevated’ wird überprüft, ob das Skript mit Administratorrechten ausgeführt wird, um sicherzustellen, dass es über die erforderlichen Berechtigungen für den Zugriff auf die angegebenen Dateien und deren Überwachung verfügt.
  4. Validierung des Algorithmus: Das Skript prüft, ob der angegebene Hashing-Algorithmus unterstützt wird. Erlaubte Algorithmen sind SHA1, SHA256, SHA384, SHA512 und MD5.
  5. Prüfung auf Vorhandensein und Typ der Datei: Das Skript prüft, ob der angegebene Pfad existiert und bestätigt, dass es sich um eine Datei und nicht um ein Verzeichnis handelt.
  6. Hash-Verifizierung: Wenn ein Hash-Wert angegeben wird, berechnet das Skript den aktuellen Hash-Wert der Datei mit dem angegebenen Algorithmus und vergleicht ihn mit dem angegebenen Hash-Wert. Es gibt dann eine Warnmeldung aus, wenn eine Nichtübereinstimmung vorliegt oder die Datei nicht geändert wurde, je nach dem Parameter ‘Alert’.
  7. Prüfung der Änderungszeit: Das Skript berechnet die Abschlusszeit auf der Grundlage der angegebenen ‘Days’, ‘Hours’ und ‘Minutes’. Es vergleicht dann die letzte Änderungszeit der Datei mit der Abschlusszeit und gibt eine Warnmeldung aus, wenn die Datei innerhalb des angegebenen Zeitrahmens geändert wurde oder nicht.

Potenzielle Anwendungsfälle

Stellen Sie sich einen IT-Experten vor, der für die Aufrechterhaltung der Sicherheit und Integrität sensibler Konfigurationsdateien auf einem Server verantwortlich ist. Mit diesem Skript können sie eine tägliche Prüfung einrichten, um festzustellen, ob kritische Dateien geändert wurden. Sie könnten das Skript beispielsweise zur Überwachung einer Konfigurationsdatei verwenden, um zu gewährleisten, dass diese nicht unerwartet geändert wurde. Wenn das Skript eine Veränderung feststellt, löst es eine Benachrichtigung aus, sodass der IT-Experte diese untersuchen und entsprechende Maßnahmen ergreifen kann.

Vergleiche

Im Vergleich zu anderen Methoden zur Überwachung von Dateiänderungen, wie zum Beispiel zur Verwendung von Software von Drittanbietern oder manuellen Prüfungen, bietet dieses PowerShell-Skript mehrere Vorteile:

  • Kosteneffizienz: Da es sich um ein PowerShell-Skript handelt, sind keine kostspieligen Lösungen von Drittanbietern erforderlich.
  • Anpassungsmöglichkeiten: Die Anwender:innen können das Skript leicht an ihre speziellen Bedürfnisse anpassen.
  • Integration: Das Skript kann in bestehende Automatisierungsabläufe und -systeme integriert werden.

FAQs

1) Wie kann ich dieses Skript ausführen?

Um das Skript auszuführen, speichern Sie es als .ps1-Datei und führen es in PowerShell mit den entsprechenden Parametern aus.

2) Kann dieses Skript mehrere Dateien gleichzeitig überwachen?

Das Skript ist darauf ausgelegt, jeweils eine Datei zu überwachen. Sie können es jedoch so ändern, dass es bei Bedarf mehrere Dateien durchläuft.

3) Was passiert, wenn ich keine Administratorrechte habe?

Das Skript gibt eine Warnmeldung aus, und einige Dateien oder Ordner sind möglicherweise ohne die erforderlichen Berechtigungen nicht zugänglich.

Folgen

Die Verwendung dieses Skripts zur Überwachung von Dateiänderungen hat erhebliche Auswirkungen auf die IT-Sicherheit. Es stellt sicher, dass unautorisierte Modifikationen sofort erkannt werden, sodass eine schnelle Reaktion und Minimierung möglich ist. Eine regelmäßige Überwachung trägt zur Aufrechterhaltung der Systemintegrität bei, gewährleistet die Einhaltung von Sicherheitsrichtlinien und schützt vor möglichen Verstößen.

Empfehlungen

  • Regelmäßige Überprüfungen: Planen Sie regelmäßige Überprüfungen, um eine kontinuierliche Überwachung kritischer Dateien zu gewährleisten.
  • Integration: Integrieren Sie das Skript in Ihre vorhandenen IT-Verwaltungs- und Automatisierungs-Tools, um für einen nahtlosen Betrieb zu sorgen.
  • Backup: Führen Sie immer Backups von wichtigen Dateien durch, um sie im Falle unbefugter Änderungen wiederherstellen zu können.

Abschließende Überlegungen

Die Überwachung von Dateiänderungen ist für die Aufrechterhaltung der IT-Sicherheit und -Integrität von entscheidender Bedeutung. Dieses PowerShell-Skript bietet eine effiziente und anpassbare Lösung für IT-Experten und MSPs. Durch die Integration dieses Skripts in Ihren Arbeitsablauf können Sie eine kontinuierliche Überwachung und eine sofortige Erkennung aller nicht autorisierten Änderungen sicherstellen. Für umfassendere IT-Management-Lösungen sollten Sie NinjaOne in Betracht ziehen, eine leistungsstarke Plattform zur Verbesserung Ihrer IT-Abläufe und Sicherheit.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool zur Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, alle Geräte zu überwachen, zu verwalten, zu sichern und zu unterstützen, unabhängig vom Standort, ohne dass eine komplexe Infrastruktur vor Ort erforderlich ist.

Erfahren Sie mehr über NinjaOne Remote Script Deployment, sehen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion unserer NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Allgemeine Geschäftsbedingungen für Skripte

Indem Sie unten auf die Schaltfläche “Ich akzeptiere” klicken, erklären Sie Ihr Einverständnis mit den folgenden rechtlichen Bedingungen sowie mit unseren Nutzungsbedingungen:

  • Eigentumsrechte: NinjaOne besitzt und wird weiterhin alle Rechte, Titel und Interessen an dem Skript (einschließlich des Urheberrechts) behalten. NinjaOne gewährt Ihnen eine eingeschränkte Lizenz zur Nutzung des Skripts in Übereinstimmung mit diesen rechtlichen Bedingungen.
  • Einschränkung der Nutzung: Sie dürfen das Skript nur für Ihre legitimen persönlichen oder internen Geschäftszwecke verwenden und es nicht an Dritte weitergeben.
  • Verbot der Wiederveröffentlichung: Sie sind unter keinen Umständen berechtigt, das Skript in einer Skriptbibliothek, die einem anderen Softwareanbieter gehört oder von diesem kontrolliert wird, erneut zu veröffentlichen.
  • Gewährleistungsausschluss: Das Skript wird “wie gesehen” und “wie verfügbar” bereitgestellt, ohne jegliche Garantie. NinjaOne gibt keine Versprechen oder Garantien, dass das Skript frei von Fehlern ist oder dass es Ihre speziellen Bedürfnisse oder Erwartungen erfüllt.
  • Risikoübernahme: Die Verwendung des Skripts erfolgt auf eigene Gefahr. Sie erkennen an, dass die Nutzung des Skripts mit bestimmten Risiken verbunden ist, und Sie verstehen und übernehmen jedes dieser Risiken.
  • Verzicht und Freigabe: Sie machen NinjaOne nicht für nachteilige oder unbeabsichtigte Folgen verantwortlich, die sich aus Ihrer Nutzung des Skripts ergeben, und Sie verzichten auf alle gesetzlichen oder billigkeitsrechtlichen Rechte oder Rechtsmittel, die Sie gegen NinjaOne im Zusammenhang mit Ihrer Nutzung des Skripts haben könnten.
  • EULA: Wenn Sie ein NinjaOne-Kunde sind, unterliegt Ihre Nutzung des Skripts dem für Sie geltenden Endbenutzer-Lizenzvertrag (EULA).