Einleitung
Ich habe bereits über das eigentliche Problem in einem anderen Beitrag berichtet, zwecks der nicht erfolgreichen VSS- Sicherungen der bestehenden Protokolldateien der Zertifizierungsstelle. Kurz um: Die Protokolldateien wachsen in bestimmten Konstellationen unaufhörlich an und verbrauchen Speicher.
Der aktuelle Beitrag dient lediglich dazu, die ermittelten Werte automatisiert einzusammeln und bei überschreiten eines vordefinierten Wertes, eine E-Mail Erinnerung auszulösen. Die Erinnerung enthält ausschließlich die aktuellen Zahlen und verweist im Betreff daraufhin, dass der Grenzwert des vordefinierten Wertes erreicht ist!
Vorgehen
Ich habe ein kleines Skript geschrieben, dass die Anzahl der enthaltenen Dateien mit der Endung *.log und den Gesamtspeicherverbrauch der Protokolldateien im CertLog- Verzeichnis auswertet. Die Erinnerung per E-Mail wird ausgelöst, wenn der Grenzwert für die Anzahl der Dateien überschritten wird. Da die einzelnen Protokolldateien nicht größer als 1.024 KB werden, ist die Anzahl quasi gleichzusetzen mit dem Gesamtspeicherverbrauch aller Protokolldateien (Richtwert).
Beispiel:
26 Protokolldateien, entsprechen ca. 26 MB an Gesamtgröße (0,02 GB) aller Protokolldateien. Daher habe ich entschieden, mich für einen Grenzwert auf die Anzahl der Protokolldateien zu beschränken.
Voraussetzungen
- Lokal angemeldete Sitzung auf dem betreffenden Windows PKI Server.
- Der Windows PKI Server muss über den Exchange Server E-Mails versenden dürfen (Relay)
- Geöffnete PowerShell ISE
Prüfen
Zur eigentlichen Ermittlung des Protokollverzeichnisses, nutzt zuvor die dafür vorgesehenen PowerShell Befehlszeilen:
$dir = "C:\Windows\System32\CertLog" $logfiles = (Get-ChildItem –force $dir –Recurse -ErrorAction SilentlyContinue | where {$_.Name -like '*.log'}) $result = $logfiles | measure Length -s -ErrorAction SilentlyContinue | Select-Object -Property ` @{l='Directory';e={$dir}}, ` @{l='Files';e={($logfiles ).count}}, ` @{l="Size(GB)";e={[math]::Round((($_.Sum)/1GB),2)}} $result
Ausgabe:
Funktioniert dieser Befehl in der entsprechenden PowerShell Konsole, dann kann nun mit der Automatisierung begonnen werden.
Skript
Wie bereits eingangs erwähnt, ist das Ziel, die zusammengetragenen Informationen automatisiert per E-Mail zu versenden, sobald der vordefinierte Grenzwert überschritten ist. Damit die Ergebnisse in ansehnlicher Form versendet und dargestellt werden können, eignet sich die Konvertierung der Ergebnisse in das HTML- Format. Anschließend ist noch die E-Mail- Funktionalität herzustellen.
Werden nun die erforderlichen PowerShell Befehlszeilen kombiniert, dann kommt ungefähr das folgende Ergebnis dabei heraus:
<# .SYNOPSIS Enumerate the TransactionLogs and check the counts state. .DESCRIPTION The script enumerate TransactionLogs, convert the result to HTML and send the result via E-Mail, if the limit of max count is reached. .OUTPUTS E-Mail Report. .NOTES Version: 1.0 Author: André Stuhr Creation Date: 02/16/2022 Purpose/Change: First initial script development #> Clear-Host # Create a SMTP Server Object $mailserver = "FQDN" # servername.domain.tld $port = 587 # or Port 25 $smtp = New-Object System.Net.Mail.SMTPClient $mailserver, $port $smtp.Credentials = [system.Net.CredentialCache]::DefaultNetworkCredentials # Analyse Parameter of Logfiles in defined Directory $dir = "C:\Windows\System32\CertLog" $logfiles = (Get-ChildItem –force $dir –Recurse -ErrorAction SilentlyContinue | where {$_.Name -like '*.log'}) $result = $logfiles | measure Length -s -ErrorAction SilentlyContinue | Select-Object -Property ` @{l='Directory';e={$dir}}, ` @{l='Files';e={($logfiles).count}}, ` @{l="Size (GB)";e={[math]::Round((($_.Sum)/1GB),2)}} | ConvertTo-Html -Head $style # Definition of the maximum number of Logfiles $files = 50 # max Value $count = ($logfiles).count # Send E-Mail, if the maximum number of Logfiles are detected if ($files -le $count) { # E-Mail parameter settings $smtpto = "<Recipient>" # e.g. functional mailbox $smtpfrom = "Certificate Authority <Sender>" # e.g service@domain.tld $subject = "TransactionLogFiles has define Limit reached. Manual Backup-Job needed." $message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto $message.Subject = $messageSubject $message.IsBodyHTML = $true # HTML parameter settings $style = "<style>BODY{font-family: Arial; font-size: 10pt;}" $style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}" $style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }" $style = $style + "TD{border: 1px solid black; padding: 5px; }" $style = $style + "</style>" # Create the message $mail = New-Object System.Net.Mail.Mailmessage $smtpfrom, $smtpto, $subject, $result $mail.IsBodyHTML=$true # Send the message $smtp.send($mail) } else { exit }
Die if, else- Bedingung soll sicherstellen, dass E-Mails NUR versendet werden, wenn auch der entsprechend, vordefinierte Grenzwert überschritten ist. Ist der Grenzwert somit nicht überschritten, wird auch keinerlei E-Mail versendet!
Speichert das Skript lokal in einem geeigneten Verzeichnis ab, der Name der Datei kann hierbei frei gewählt werden! Nun ist es aus der PowerShell ISE heraus bereits möglich, das Skript 1x vollständig ablaufen zu lassen und somit die vollständige Funktionalität testen zu können… treten in der Ausführung Fehler auf, müssen diese anschließend analysiert und das Skript korrigiert werden!
Denkt hierbei bitte unbedingt an die Anpassung der erforderlichen Variablen:
- $mailserver
- $port
- $files
- $smtpto
- $smtpfrom
Optionale Anpassungen von Variablen:
- $dir
- $subject
- $style
Automatisierung
Ist das Skript lokal gespeichert, kann nun mit der Windows Aufgabenplanung fortgefahren werden. Hierzu erstellt eine neue Aufgabe.
Wie in diesem Beispiel:
Hierfür eignet sich ein Group Managed Service Account (gMSA). Wie solch ein Account grundsätzlich eingerichtet werden kann, habe ich bereits in einem anderen Beitrag berichtet. Nutzt hierzu am besten die Webseitensuche (Suchbegriff= gmsa).
Aktionen setzen
Aktion: | Programm starten |
Programm/Skript: | %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe |
Argumente hinzufügen: | -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -command "&{C:\scripts\ca\Get-CATransactionLogFiles.ps1}" |
Ohne diese hinterlegten Informationen, funktioniert die Ausführung der Aufgabe in der Aufgabenplanung nicht erfolgreich. Ändert bitte noch den Pfad und Dateinamen zur Skriptdatei in dem hinterlegten Argument.
Ergebnis
So oder so ähnlich sieht nach einer erfolgreichen Ausführung der Aufgabe, die eingehende E-Mail aus!
Schlusswort
Natürlich könnte man auch den manuellen Backup-Job mit dem PowerShell- Befehl automatisiert starten und auch eher die Gesamtgröße des Verzeichnisses als Grenzwert hernehmen. Hierbei geht es jedoch eher um die Sensibilisierung und der rechtzeitigen Erkennung, falls die Protokolldateien trotz eines funktionierenden VSS Backups, doch nicht erfolgreich eingesammelt worden sind.
Sprich, mit dieser Methode kann noch ein zusätzlicher Kontrollmechanismus geschaffen werden, um wirklich sicherstellen zu können, dass die Protokolldateien der Zertifizierungsstelle regelmäßig durch externe Backup-Systeme gesichert werden. Ist dies nicht der Fall, wird eine entsprechende E-Mail Erinnerung versendet!