Wissenswertes und Spannendes aus der Welt der professionellen IT. 

Lesestoff für alle, die IT lieben.

Wir sind die heise academy. Als die Weiterbildungsmarke im größten IT-Verlag Europas heben wir professionelle IT auf ein neues Level. Immer am Puls der Branche und stets im Austausch mit den bekanntesten Experten: In unserem academy Blog schreiben Content-Creatoren aus unserem Team und ausgewählte IT-Spezialisten über Themen aus ihren Fachgebieten. Hier geht es um Entwicklungen und Prognosen, Trends, Tipps und Tricks für den Berufsalltag – wir berichten unabhängig und redaktionell verifiziert.

Wir sind die heise academy – die Weiterbildungsmarke im größten IT-Verlag Europas. In unserem Blog schreiben Content-Creatoren und IT-Expert:innen über Trends, Tipps und Entwicklungen der Branche – unabhängig, redaktionell geprüft und nah am Puls der IT.

Unsere neuesten Beiträge

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"slider","subLayout":"left-image","columns":{"desktop":2,"tablet":2,"mobile":1},"rowGap":14,"content":{"height":"fill"},"postsPerPage":10,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderAutoplayOptions":{"delay":3},"sliderSpeed":3,"sliderPageColor":"var(--accent)","sliderPrevNextColor":"var(--accent)","isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"rgba(0, 0, 0, 1)","metaIconColor":"var(--contrast)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedCategories":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderIsAutoplay":true,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

IT-Security

Wo Cyberangriffe, Datenlecks und digitale Angriffsflächen zunehmend zum Alltag gehören, liefert diese Kategorie fundiertes Know-how rund um den Schutz von Systemen, Netzwerken und sensiblen Informationen. Ob Datenschutz-Pflichten, Darknet-Hintergründe oder Open-Source-Intelligence – hier erfährst du praxisnah, was IT-Security heute ausmacht und wie du dich sicher aufstellst.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[16],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"excerptColor":"var(u002du002dcontrast)","readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"isMetaAuthorLink":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

IT-Weiterbildung

Bleibe nicht stehen – in der IT-Welt verändert sich alles rasant. In dieser Kategorie findest du Impulse, Strategien und konkrete Tipps rund um Weiterbildung und Qualifizierung im IT-Bereich. Ob neue Technologien, Projektrollen oder Kompetenzaufbau im Team: Hier geht es darum, wie du und dein Team fit bleiben, weiter lernen und echte Fortschritte machen.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[14],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"excerptColor":"var(u002du002dcontrast)","readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"isMetaAuthorLink":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

Cloud-Technologien

Cloud-Services sind heute viel mehr als nur „Speicher im Netz“: Sie ermöglichen agile Infrastruktur, global skalierbare Anwendungen und moderne Mitarbeitermodelle. In dieser Kategorie zeigen wir, wie du Cloud-Architekturen, Plattformen und Migrationen strategisch angehst, welche Chancen und Risiken damit verbunden sind – und wie du dein Unternehmen fit für die Cloud-Zukunft machst.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[19],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

Künstliche Intelligenz & Data Science

Big Data, Machine Learning, Deep Learning, Sprachmodelle – die Themen rund um KI und Data Science verändern heute fast jede Branche. In dieser Kategorie beleuchten wir, wie Daten zu wertvollen Erkenntnissen werden, wie KI-Anwendungen strategisch geplant und verantwortungsvoll betrieben werden können und welche Kompetenzen in der Praxis wirklich zählen. Hier findest du fachlich fundierte Impulse für Fach- und Führungskräfte, die KI-Potenziale nicht nur erkennen, sondern erfolgreich umsetzen möchten.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[21],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

Softwareentwicklung

In dieser Kategorie dreht sich alles um das Handwerk der modernen Programmierung — von sauberen Architekturen über praxisnahe Testverfahren bis hin zu agilen Vorgehensweisen und Tool-Chains. Wir zeigen, wie aus Anforderungen funktionierende Software wird, welche Methoden heute entscheidend sind und wie Entwickler und Teams ihre Projekte effizient, wartbar und zukunftssicher gestalten.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[17],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

Web-Technologien

Das Web ist mehr als nur eine Website – es ist eine Plattform voller Möglichkeiten: Front‑ und Backend, JavaScript, HTML, CSS, moderne Frameworks und komplexe Web‑Architekturen. In dieser Kategorie zeigen wir, wie du Web‑Technologien gezielt einsetzt, welche neuen Standards und Trends du kennen solltest, und wie du Web‑Projekte technisch sauber und anwenderfreundlich umsetzt.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[18],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

IT- & Projektmanagement

IT erfolgreich gestalten: In dieser Kategorie bündeln wir Beiträge zu IT-Management, Projektmanagement und Digitaler Souveränität. Erfahre, wie du digitale Projekte effizient steuerst, IT-Strukturen zukunftsfähig aufstellst und technologische Unabhängigkeit förderst.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[20],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"rgba(0, 0, 0, 1)","metaIconColor":"var(--contrast)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderIsAutoplay":true,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

Netzwerke & Systeme

Stabile Netzwerke und leistungsfähige Systeme sind das Rückgrat moderner IT‑Infrastrukturen. In dieser Kategorie beleuchten wir die Technologie‑ und Architekturthemen, die dafür sorgen, dass Daten zuverlässig fließen, Systeme skalieren und Nutzer sicher eingebunden sind. Ob Netzwerkdesign, Systemadministration oder moderne Orchestrierung – hier gibt es praxisnahe Impulse für Fach‑ und Führungskräfte, die IT‑Landschaften professionell gestalten wollen.

Alle Beiträge

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>
Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>
"' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[22],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"rgba(0, 0, 0, 1)","metaIconColor":"var(--contrast)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderIsAutoplay":true,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…

heise academy aktuell

Bleib am Puls der Weiterbildungswelt: In dieser Kategorie erfährst du alle aktuellen News, Entwicklungen und Impulse rund um die heise academy. Ob neue Formate, Trends in der IT‑Weiterbildung oder spannende Aktionen – hier findest du kompakt und informativ, was gerade wichtig ist.

In diesem Skript wird die Splatting-Technik verwendet, um die Parameter für die Trigger- und Action-Erstellung in übersichtlichen und pflegbaren Hashtabellen zu organisieren. Dadurch wird der Code lesbarer und einfacher zu warten.

Scheduled Jobs vs. Scheduled Tasks

In der PowerShell-Automatisierung stehen zwei Hauptkonzepte zur Verfügung: Scheduled Jobs und Scheduled Tasks. Obwohl beide Ansätze ähnliche Ziele verfolgen, unterscheiden sie sich in ihrer Funktionsweise und in ihren Einsatzmöglichkeiten.

Scheduled Tasks sind Teil des Windows Task Schedulers und bieten eine tiefe Integration in das Betriebssystem. Sie können nicht nur PowerShell-Skripte, sondern auch andere Programme oder Skripte ausführen. Scheduled Tasks eignen sich besonders gut für komplexe Szenarien, die eine enge Verknüpfung mit Windows-Diensten und -Anwendungen erfordern. Sie bieten erweiterte Planungsoptionen, wie die Ausführung basierend auf spezifischen Ereignissen oder Zuständen des Systems.

Scheduled Jobs hingegen sind eine PowerShell-spezifische Funktion. Sie ermöglichen es, PowerShell-Befehle und -Skripte zu planen und als Hintergrundjobs auszuführen. Diese Jobs sind eng in die PowerShell-Umgebung integriert, was das Ausführen von PowerShell-Cmdlets und das Verarbeiten von PowerShell-Objekten erleichtert. Scheduled Jobs sind ideal für Aufgaben, die regelmäßig und ohne direkte Benutzerinteraktion durchgeführt werden sollen.

Ein Scheduled Job kann wie folgt angelegt werden:

# Register eines PowerShell Scheduled-Jobs
$trigger = New-JobTrigger -At 10pm -Daily
$jobOption = New-ScheduledJobOption -StartIfOnBatteries

Register-ScheduledJob -Name "MeinPowerShellJob" -ScriptBlock { # DeinIhr PowerShell-Code hier, z.B. ein Skript ausführen
. C:\ps\scheduledtask\logger.ps1
} -Trigger $trigger -ScheduledJobOption $jobOption

Bei der Verwendung von Scheduled Jobs ist jedoch Folgendes zu beachten:

  • Geringere Kompatibilität mit externen Tools: Beispielsweise können Scheduled Tasks auch mittels Ansible angelegt werden, welches wiederum keine Unterstützung für Scheduled Jobs bietet.
  • Einschränkungen bei der Auswahl möglicher Trigger: Scheduled Tasks können unter anderem durch Windows Events (EventLog) angestoßen werden. Scheduled Jobs beschränken sich auf die zeitliche Dimension.

Effektive Strategien zur Fehlervermeidung und Optimierung

Die Automatisierung mit PowerShell und Windows Task Scheduler birgt immense Vorteile, jedoch auch potentielle Fallstricke. Im folgenden werden diese Fallstricke, sowie weitere Optimierungspotentiale beschrieben.

Ausführungskontext und Verzeichnisstruktur

Ein häufiges Missverständnis ist die Annahme, dass PowerShell-Skripte automatisch im Speicherort des Skripts ausgeführt werden. Es ist wichtig zu wissen, dass Skripte standardmäßig im Kontext des Systemverzeichnisses, wie z.B. C:\Windows\system32, gestartet werden. Um Probleme mit relativen Pfadangaben zu vermeiden, sollte der Skriptkontext zu Beginn der Ausführung zum Speicherort des Skripts gewechselt werden. Dies lässt sich mit der PowerShell-Umgebungsvariable $PSScriptRoot realisieren:


Set-Location $PSScriptRoot

Nutzung von Scheduled Tasks im Clusterbetrieb

Für eine erhöhte Verfügbarkeit und Ausfallsicherheit können Scheduled Tasks clustergesteuert eingesetzt werden. Dies bietet Vorteile wie Hochverfügbarkeit durch Failover-Fähigkeiten, zentralisiertes Management und verbesserte Skalierbarkeit. Der Einsatz im Cluster-Modus erfordert ein bestehendes Windows-Cluster-Setup.

$taskName = "ClusteredTask"
$taskType = "ClusterWide"
$clusterName = "MeinCluster"

# ... Konfiguration von Trigger, Principal und Action ...

Register-ClusteredScheduledTask -TaskName $taskName -TaskType $taskType -Cluster $clusterName -Trigger $trigger -Principal $principal -Action

Sicherheitsaspekte und Benutzerberechtigungen

Sicherheit ist ein kritischer Aspekt bei der Automatisierung. PowerShell-Skripte werden im Kontext des angegebenen Benutzers ausgeführt, was bedeutet, dass die Sicherheitsberechtigungen dieses Benutzers berücksichtigt werden müssen. Es ist ratsam, spezielle Benutzerkonten mit minimal notwendigen Berechtigungen zu verwenden, um das Risiko einer übermäßigen Rechtevergabe zu vermeiden.

Monitoring und Protokollierung

Standardmäßiges Logging des Task Schedulers reicht oft nicht aus, um eine detaillierte Übersicht über die Ausführung von Automatisierungsaufgaben zu erhalten. Erweitere das Logging durch PowerShell-spezifische Funktionen wie das Transcript- Feature oder nutze fortgeschrittene Tools wie das PSFramework-Modul für ein umfassendes Monitoring.

Parametermanagement

Die Verwaltung von Übergabeparametern ist ein wesentlicher Bestandteil der Skriptautomatisierung. Anstatt feste Werte direkt im Skript zu definieren, sollten externe Parameterquellen wie Konfigurationsdateien genutzt werden. Dies erhöht die Flexibilität und Wartbarkeit der Skripte. Standardmäßig unterstützt die PowerShell JSON und XML als Datenformate.

Fazit

Gerade im Windows-Umfeld stellt die Kombination von PowerShell und Task Scheduler eine sehr starke und kostenfreie Option dar. Der Feature-Umfang ist natürlich bei weitem nicht so umfassend wie bei kommerziellen Tools zur Job-Steuerung. Für Anwendungsszenarien wie einfachem Reporting oder Aufräumarbeiten (Log-Dateien, etc.) erfüllt der Task Scheduler seinen Zweck. Wichtig ist hierbei lediglich, dass die genannten Best Practices angewendet werden und fehlende Features wie die Verwendung eines Credential- und Key-Stores ergänzt werden.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Das starke Duo für alle Fälle erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (2) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-2/ Wed, 17 Jan 2024 16:33:47 +0000 https://blog.heise-academy.de/?p=6252 Adaptive Cards und Zertifikats-Monitoring: Im zweiten Teil der Serie geht es um die Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus. Erfahre mehr über eine interessante Methode, dich über das Auslaufen der Zertifikate informieren zu lassen.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (2)

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Von: Philip Lorenz

Im ersten Teil dieser Reihe demonstrierte ich ich die grundsätzliche Verwendung von Teams-WebHooks mithilfe der PowerShell. Dabei habe ich mich jedoch auf die Informationsebene beschränkt, also die reine Übermittlung von textbasierten Alerts ohne zusätzliche Funktionalität. In diesem Teil gehen wir unter der Verwendung individueller Schaltflächen über den reinen Informationsgrad hinaus.

Teams Adaptive Cards: Am Beispiel von Zertifikats-Monitoring mit PowerShell

Falls du zu den Admins gehörst, die noch nie mit Problemen oder Ausfallzeiten aufgrund eines abgelaufenen Zertifikats zu kämpfen hatten, dann hattest du entweder außergewöhnliches Glück, oder du hast dein Zertifikatsmanagement hervorragend im Griff. In vielen Firmen treten gelegentlich Probleme mit abgelaufenen Zertifikaten auf, deren Gültigkeit oft erst überprüft wird, wenn sie bereits abgelaufen sind und der Service nicht mehr verfügbar ist.

Um zu verhindern, dass dir das (wieder) passiert, stelle ich dir ein PowerShell-Skript zur Verfügung, das Server auf ablaufende Zertifikate überprüft. Zugegeben: Das Skript zum Auslesen der Zertifikate ist eher unspektakulär, fast schon nebensächlich. Viel interessanter und relevanter ist die Methode, wie du über das Auslaufen der Zertifikate informiert wirst. In diesem Artikel möchte ich dir zeigen, wie du sogenannte Adaptive Cards versenden kannst. Diese bieten den Vorteil, dass du beispielsweise Buttons in die Nachrichten einfügen kannst, was ganz neue Möglichkeiten zur Reaktion auf Alarme eröffnet, zum Beispiel:

  • Du möchtest Alerts automatisch in Tickets umwandeln? Füge dem WebHook-Alert einen Button hinzu, über den die Informationen an den Ticket-Dienst gesendet werden. Du kannst dies sogar von deinem Smartphone aus tun, während du im Fitnessstudio bist oder den Hund ausführst.
  • Ein Dienst auf deinem Server hat unerwartet gestoppt? Lass dich darüber informieren und starte ihn mit einem Klick in Teams neu.

Wie du erkennen kannst, gibt es verschiedene Anwendungsfälle, bei denen eine unmittelbare Reaktion direkt aus der Nachricht heraus nützlich sein kann. In diesem Artikel erstellen wir ein Skript, das die Zertifikate auf verschiedenen Servern ausliest, überprüft, ob diese in den nächsten 100 Tagen ablaufen, und dabei eine Nachricht an Teams sendet. Diese Nachricht enthält einen Button, mit dem wir direkt zu den Zertifikatseinstellungen des jeweiligen Servers im Windows-Admin-Center gelangen können, um dort notwendige Änderungen vorzunehmen.

Die Nachricht, die wir gestalten werden, sieht folgendermaßen aus:

Die Vorbereitung

Natürlich brauchen wir wieder einen Teams-Kanal, der WebHooks empfangen kann. Wie du das einrichtest, habe ich dir im ersten Artikel dieser Serie erklärt. Da unsere Anforderungen hier recht einfach sind, können wir uns das Leben erleichtern: Das Modul PSTeams ermöglicht es dir, die Card mit einfachen PowerShell-Cmdlets zu gestalten, so dass du dich nicht mit JSON herumschlagen musst. In unserem Fall benötigen wir natürlich auch eine Installation des Windows-Admin-Centers. Du hast aber die Freiheit, selbst zu entscheiden, wie du auf den Alert über den Button reagieren möchtest, falls du das WAC nicht nutzt. Der Befehl, um alle Zertifikate auf einem Server anzeigen zu lassen, die in den nächsten 100 Tagen auslaufen, lautet:

Get-Childitem Cert: -Recurse -ExpiringInDays 100 | Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath

Gefiltert habe ich den Befehl übrigens nach den Attributen, die mir wichtig erscheinen. Wir haben nun also alle Informationen, um mit der Gestaltung der Adaptive Card zu beginnen. Der Code am Beginn des Scripts sieht folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"

# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

Zuerst werden sämtliche Ziel-Computer (welche später bezüglich der Zertifikate abgefragt werden) definiert. Anschließend musst du noch deine Teams-D für den WebHook angeben. Die WACURL entspricht der URL deines Windows-Admin-Centers. Anschließend prüfen wir noch, ob PSTeams installiert ist – wenn dieses noch nicht vorhanden ist, wird es installiert.

Gestaltung der Teams-Card mit PSTeams

Drei Elemente aus PSTeams sind für uns von Bedeutung: Facts, Sections und Buttons. Facts enthalten alle Informationen, die wir über Teams darstellen möchten. Diese Facts sind verschiedenen Sections zugeordnet. Diese Sections dienen der logischen und visuellen Trennung. Buttons sind ebenfalls einer Section zugeordnet und öffnen eine Webseite oder setzen andere HTTP-Anfragen ab.

In unserem Fall sind die Zertifikatsattribute jeweils Facts. Der Friendlyname eines Zertifikats, ebenso wie der Thumbprint usw., wird als Fact dargestellt und einer Section zugeordnet. Eine Section enthält dabei immer genau ein Zertifikat. Eine Teams-Nachricht bezieht sich immer nur auf einen Server, daher benötigen wir auch nur einen Button in der gesamten Card, der uns zum Servereintrag im Windows Admin Center führt. Dieser Button hat seine eigene Section.

Nun müssen wir alle Server aus dem Array $TargetComputers abfragen – dies tun wir mit einer Foreach-Schleife, sodass wir direkt danach die entsprechenden Zertifikatsdaten vom jeweiligen Server erhalten können:

foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }
 }

Die Variable $ExpiringCertificates beinhaltet nun alle Zertifikate, die in den nächsten 100 Tagen ablaufen. Nun müssen wir diese Informationen, wie zuvor beschrieben, auf die verschiedenen Sections verteilen. Dazu erstellen wir ein leeres Array, das wir nach und nach mit Sections befüllen. Innerhalb der bereits beschriebenen ForEach-Schleife erstellen wir eine weitere ForEach-Schleife, die über alle Zertifikate iteriert. Für jedes Zertifikat wird eine neue Section erstellt, diese Section mit den Facts (den Attributen des aktuellen Zertifikats) gefüllt und die neu erstellte Section dem Section-Array hinzugefügt. Am Ende haben wir also ein Array mit allen Informationen (in Sections unterteilt) und könnten dieses direkt an Teams senden. Bevor wir das tun, erstellen wir jedoch noch eine letzte Section, die den Button für das Windows-Admin-Center enthält. Den Link, den der Button aufruft, passen wir für jeden Server an, da in der URL festgelegt werden kann, welcher Computer/Server im Admin Center geöffnet werden soll. Unser Code sieht nun also folgendermaßen aus:

# Array with Computers, that should be monitored
$TargetComputers = @("Server01")
# TeamsID - URL generated by Teams
$TeamsID = ""
# URL of Windows Admin Center
$WACURL = "https://localhost:6516/"


# ModuleCheck: Installs PSTeams if not available
if(-not (Get-Module -ListAvailable PSTeams)) {
    Install-Module -Name PSTeams -Force
}
else {
    Write-Verbose "PSTeams is already installed."
}

# Iterating through every computer in $TargetComputers
foreach ($computer in $TargetComputers) {
	# Getting all certificates of specified computer, that will expire in the next 100 days
    [array]$ExpiringCerts = Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-ChildItem Cert:\LocalMachine -Recurse -ExpiringInDays 100 |
	        Select-Object FriendlyName, Issuer, Thumbprint, NotBefore, NotAfter, PSParentPath
    }

    # Checking, whether there are any certificates expiring in the specified timespan before proceeding
    if ($ExpiringCerts.Count -gt 0){

        # Creating Sections with embedded Facts (Certificate Information) for Teams
        $Sections = @()
        foreach ($cert in $ExpiringCerts) {
            $facts = @()
	        $cert |
                Get-Member |
                Where-Object MemberType -eq NoteProperty |
                ForEach-Object {
                    $facts += New-TeamsFact -Name $_.Name -Value "**$($cert.($_.Name))**"
                }
            $Sections += New-TeamsSection -ActivityDetails $facts
        }


        # Gets server-URL within Windows Admin Center and Teams-Button to access it
        $WACURLServer = $WACURL + "servermanager/connections/server/" + $computer + "/tools/certificates"
        $Button = New-TeamsButton -Name 'Edit Certificates' -Link $WACURLServer -Type 'ViewAction'
        $Section = New-TeamsSection -Buttons $Button

        # Send Card
        $Sections += $Section
        $Count = $ExpiringCerts.count
        Send-TeamsMessage -URI $TeamsID -Color Red -Sections $Sections `
        -MessageTitle "Alert: $count Certificates on $computer expire within the next 100 days!" `
    }

}

Wenn wir nun also diesen Code ausführen und sich auslaufende Zertifikate auf den Maschinen befinden, erhalten wir die oben gezeigte Teams-Card. Du hast nun in wenigen Minuten ein eigenes Alerting für deine Zertifikate erstellt!

Hinweis: Wenn in deiner Organisation alle Zertifikate von einer zentralen Zertifizierungsstelle (CA) ausgestellt wurden, ist es effizienter, eine zentrale Abfrage an die CA zu senden, anstatt jeden einzelnen Server auf seine Zertifikate zu überprüfen. Die genannten 100 Tage sind keine persönliche Empfehlung, da ich diesen Zeitraum für zu lang halte. Ich habe die 100 Tage nur zu Demonstrationszwecken gewählt, um sicherzustellen, dass wir einige Treffer erzielen. Meiner Meinung nach ist ein Zeitraum von 15 bis 30 Tagen für die Überwachung angemessen, obwohl dies natürlich je nach Umgebung variieren kann.

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (2) erschien zuerst auf heise academy Blog.

]]> Alerts mit PowerShell und Teams-WebHooks (1) https://blog.heise-academy.de/alerts-mit-powershell-und-teams-webhooks-1/ Tue, 09 Jan 2024 16:33:08 +0000 https://blog.heise-academy.de/?p=6031 Aus der Historie der IT-Infrastruktur sind das Monitoring und das dazugehörige Alerting stetig gewachsen. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet – gut, dass es deutlich bessere Alternativen gibt.

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]>

Alerts mit PowerShell und Teams-WebHooks (1)

Teil eins: Ein Leitfaden zur Optimierung deiner Alarmierungs-Strategie

Von: Philip Lorenz

Vielleicht ist dir diese Situation bekannt: Aus der Historie der IT-Infrastruktur ist das Monitoring und das zugehörige Alerting stetig gewachsen, wobei verschiedene Tools für unterschiedliche Bereiche eingesetzt werden. Gerade beim Alerting haben diese Tools aber oft eines gemeinsam: Die Alarme werden per Mail versendet. Das führt nicht selten dazu, dass sich neben Einladungen zu Terminen, Abstimmungen und Fotos von der letzten Teamveranstaltung eine Menge Alert-Nachrichten aus verschiedenen Monitoring-Systemen und Skripten ansammeln.

Da die Infrastruktur stetig verändert wird und der manuelle Wartungsaufwand für diese Alerts in den Monitoring-Systemen gleichzeitig steigt, werden Anpassungen oftmals vernachlässigt. Schnell stellt sich ein Credo nach dem Motto “Oh, dieser Alert ist nicht so wichtig, er kommt jeden zweiten Sonntag – einfach ignorieren” ein. Es liegt nahe, einen separaten Ordner im eigenen Postfach zu erstellen, in den alle Alerts automatisch per Outlook-Regel verschoben werden und somit in Vergessenheit geraten.

Zugegeben, das hier dargestellte Szenario ist fast das schlimmstmögliche Beispiel für eine Alerting-Implementierung. Trotzdem ist es eine Situation, die in vielen Unternehmen vorkommt. Die aktuelle Art des Alertings ist angesichts der wachsenden Anforderungen an die Reaktionsgeschwindigkeit einer Operationsabteilung und der schnelllebigen Natur der Infrastruktur nicht mehr angemessen. Allein die Tatsache, dass die Kommunikation über Alerts zwischen den Administratoren normalerweise nicht mehr per E-Mail, sondern meistens über Teams (oder einen anderen Messenger) erfolgt, lässt Zweifel aufkommen, ob E-Mails das passende Medium für Benachrichtigungen sind. WebHooks bieten die Möglichkeit, Alerts oder andere Benachrichtigungen an einen Teams-Kanal zu senden. Hier kann jeder Abteilungsbereich seinen eigenen Teams-Kanal für das Monitoring einrichten. Der Abteilungsleiter hat alle Meldungen im Blick, ohne dass sein Postfach überquillt. Jeder kann selbst entscheiden, welche Bereiche für ihn relevant sind und diese so einstellen, dass er bei einem Vorfall benachrichtigt wird. Alerts und Benachrichtigungen können direkt kommentiert werden, wodurch die Notwendigkeit eines Medienwechsels bei der Absprache zwischen den Administratoren entfällt. In diesem Artikel lernst du, wie du mit wenig PowerShell-Code solche Teams-Alerts erstellen kannst – folgende Abbildung zeigt, wie eine solche Alerting-Nachricht aussehen kann.

Hinweis: WebHooks werden natürlich auch außerhalb von Teams verwendet. Sämtliche Messenger unterstützen mittlerweile WebHooks und können (womöglich mit kleinen Abweichungen in der Konfiguration) ähnlich bedient werden.

WebHooks

Bevor wir uns mit der Einrichtung eines WebHooks beschäftigen, eine kurze Erläuterung zu Webhooks selbst: Eine Anwendung kann sogenannte eingehende (oder auch ausgehende) WebHooks bereitstellen. Dazu bietet sie eine eindeutige URL an, die darauf wartet, Webanfragen in einem bestimmten Format zu erhalten – ähnlich wie eine API. Anwendungen und Server können so mit minimalem Konfigurationsaufwand Nachrichten austauschen. In diesem Artikel konzentrieren wir uns auf die Möglichkeit, WebHooks für Monitoring-Alerts zu nutzen.

Um den Unterschied zwischen einer REST API und einem WebHook zu verdeutlichen, stell dir vor, dass du in einem Restaurant bist. Eine REST API ist wie ein Kellner, den du rufen kannst, wenn du etwas brauchst – sei es eine neue Bestellung aufgeben oder die Rechnung anfordern. Du initiierst die Interaktion und der Kellner reagiert entsprechend. Ein WebHook hingegen ist wie ein Kellner, der dir automatisch ein neues Glas Wasser bringt, sobald er sieht, dass dein Glas leer ist. Du musst ihn nicht rufen oder ihm sagen, was zu tun ist. Er hat eine vordefinierte Aufgabe (dein Glas auffüllen, wenn es leer ist) und führt diese aus, sobald das definierte Ereignis (leeres Glas) eintritt. In diesem Sinne wartet der WebHook (der Kellner) auf ein bestimmtes Ereignis und reagiert automatisch darauf.

Teams-WebHooks mit PowerShell

Wir wollen uns nun also ein konkretes Beispiel für PowerShell-initiierte WebHooks ansehen. Mögliche Anwendungsszenarien wären dabei unter anderem:

  • Volllaufende Festplatte
  • Benachrichtigung zum Ablauf eines SSL-Zertifikats
  • Sperrung eines AD-Nutzers

In diesem Blog zeige ich dir praxisnah, wie Teams-WebHooks zum Senden von Benachrichtigungen genutzt werden können, wenn ein Benutzer-Account im ActiveDirectory gesperrt wird. Auf diese Weise kann man proaktiv handeln und die Sperrung des Benutzers bemerken, bevor die Anwendungen des Benutzers eine erneute Anmeldung verlangen und dieser ein Ticket erstellt bzw. die Support-Hotline anruft. Das Konzept ist in zwei Teile unterteilt:

  • die Teams-Konfiguration
  • das PowerShell-Skript

In den meisten Fällen fungiert PowerShell als “Klebstoff”, der die verschiedenen Anwendungen miteinander verbindet. Zur Klarstellung: Das ActiveDirectory bietet keine eingebaute Möglichkeit, WebHooks zu versenden, wenn ein Benutzer gesperrt wird – diese Aufgabe wird von PowerShell übernommen. Natürlich gibt es auch anderweitige Tools, um diesen Anwendungsfall abzubilden. Der Vorteil bei Verwendung der PowerShell liegt meiner Meinung nach in der größtmöglichen Flexibilität bei der Gestaltung des Alertings (und möglichen Folgeoperationen) und der kostenfreien Nutzung. Dennoch sollten gerade bei großen Infrastrukturen ebenfalls dedizierte Monitoring-Lösungen evaluiert werden.

Konfiguration von Teams

Zur Einrichtung von WebHooks muss ein Kanal/Channel festgelegt werden, an den die Alerts gesendet werden sollen. Anschließend kann man die Connectors des Kanals über einen Rechtsklick auf diesen öffnen. Anschließend lässt sich über „Konfigurieren“ bei „incoming WebHook“ die Einrichtung der Schnittstelle starten.

Nachdem man einen aussagekräftigen Namen vergeben und evtl. ein Icon hochgeladen hat, klickt man „Erstellen“ und erhält im Anschluss die URL, über welche wir die WebRequests im PowerShell-Script senden können. Diese URL sollte vertraulich behandelt werden, da diese public angesprochen werden kann. Ein Angreifer könnte mit dieser URL Nachrichten in deinen Teams-Channel senden (beispielsweise mit Links zu Phishing-Scripts, etc.) – und das solltest du logischerweise vermeiden.

PowerShell

Für das Senden von WebHooks an Teams wird das sogenannte JSON-Format verwendet. In unserem PowerShell-Code nutzen wird ein sogenanntes PSCustomObject, das weiter unten zu JSON konvertiert wird – PowerShell macht uns dies recht einfach. Grundsätzlich kannst du folgenden Code aber einfach kopieren und deine individuellen Werte eintragen. Wichtig ist natürlich, dass du die WebHook-URI von Teams in Zeile 1 hinterlegst.

[String]$uri = "Hier die Webhook Uri eintragen"
[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title"      = "Mein erster Alert."
    "text"       = "Hier steht die genaue Alertbeschreibung!
                    Variablen kann man natuerlich auch anfuegen: $var"
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Anschließend können wir durch Ausführen des Scripts direkt testen, ob die Kommunikation zum WebHook-Endpunkt funktioniert. Bei erfolgreicher Durchführung erhalten wir seitens der PowerShell eine „1“ als Rückgabe zurück und die Nachricht erscheint in unserem Teams:

Super, du hast erfolgreich deinen ersten WebHook an Teams gesendet! Wie versprochen, stelle ich dir nun ein Skript zur Verfügung, das dich über Teams benachrichtigt, sobald ein Benutzer im Active Directory gesperrt wird. Dafür benötigen wir natürlich einen Mechanismus, der erkennt, wenn ein Benutzer gesperrt wurde. Glücklicherweise erzeugt das Windows EventLog einen Eintrag mit der EventID 4740, sobald ein Benutzer gesperrt wird. Dieses Ereignis können wir als Auslöser verwenden, um unser Skript zu starten. Dies kann beispielsweise über den Windows Task Scheduler erfolgen. Das Script zum Auslesen des gesperrten AD-Accounts kann wie folgt aussehen:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

Setzen wir dieses nun mit dem Script zum Versenden des WebHooks zusammen und passen die Werte an, erhalten wir folgenden Code:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut  `
        | Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress  `
        | Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } `
        | Sort-Object LockoutTime -Descending `
        | Select-Object -first 1

[String]$uri = "Hier die Webhook Uri eintragen"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type"      = "MessageCard"
    "@context"   = "http://schema.org/extensions"
    "summary"    = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title"      = "User locked"
    "text"       = "`n 
    SamAccountName:     $($LockedUser.SamAccountName)
    Name:               $($LockedUser.Name)
    Mail:               $($LockedUser.EmailAddress)
    Bad Password Count: $($LockedUser.badpwdcount)
    Timestamp:          $($LockedUser.LockoutTime.ToString()) 
    "
}
 
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
 
$parameters = @{
    "URI"         = $uri
    "Method"      = 'POST'
    "Body"        = $TeamMessageBody
    "ContentType" = 'application/json'
}
 
Invoke-RestMethod @parameters

Wir erhalten damit nun folgende Nachricht in Teams, sofern ein Benutzer gesperrt wurde:

Fazit

WebHooks stellen einen modernen Ansatz für das Alert-Management dar. Sie bieten klare Vorteile gegenüber Mail-Alerts, obwohl auch diese ihre Stärken haben können (beispielsweise hinsichtlich der Dokumentation, etc.). Die PowerShell eignet sich hierbei hervorragend als Vermittler für Anwendungen, die keine eingebaute Funktion zur Versendung von WebHooks besitzen. Im nächsten Teil dieser Reihe zeige ich dir, wie du die Teams-Alert mithilfe von AdaptiveCards noch weiter gestalten kannst, indem du beispielsweise Buttons hinzufügst, mit denen du direkt per Knopfdruck auf ausgelöste Alerts reagieren kannst – das Ganze natürlich wieder an einem Praxisbeispiel demonstriert.

Teil zwei: Adaptive Cards und Zertifikats-Monitoring

Über den Autor: Philip Lorenz

Philip Lorenz ist erfahrener DevOps- und Cloud-Engineer mit Schwerpunkt auf Prozessautomatisierung. Mit Begeisterung teilt er sein Wissen in Form von Dienstleistungen und Schulungen und erstellt praxisnahe Lerninhalte rund um die Themen Automatisierung, Cloud-Computing und die Umsetzung moderner KI-Lösungen. Seine Trainings, inspiriert von realen IT-Szenarien, vermitteln anwendbares Wissen, das Teilnehmende direkt in ihre tägliche Arbeit integrieren können.


Diese Beiträge könnten dich auch interessieren:

Loading posts…

Der Beitrag Alerts mit PowerShell und Teams-WebHooks (1) erschien zuerst auf heise academy Blog.

]]> "' data-attributes='{"layout":"grid","rowGap":14,"content":{"height":"fill"},"selectedCategories":[15],"postsPerPage":3,"contentBG":{"color":"var(u002du002dbase)","styles":"background-color: #f4f2fc;"},"sliderIsAutoplay":false,"isFImgLink":true,"titleColor":"var(u002du002dcontrast)","isMetaAuthorLink":false,"metaCategoryIn":"image","metaLinkColor":"var(u002du002dcontrast)","metaIconColor":"var(u002du002dacademy-red)","metaColorsOnImage":{"color":"#fff","bg":"var(--heise-blau)"},"excerptLength":44,"readMorePosition":"bottom","readMoreLabel":"Weiterlesen","readMoreColors":{"color":"#fff","bg":"var(--academy-red)"},"readMoreHovColors":{"color":"#fff","bg":"var(--heise-blau)"},"readMorePadding":{"vertical":"12px","horizontal":"35px","side":2,"top":"12px","right":"35px","bottom":"12px","left":"35px"},"align":"wide","subLayout":"default","columns":{"desktop":3,"tablet":2,"mobile":1},"columnGap":15,"isContentEqualHight":true,"sliderHeight":"350px","postType":"post","queryPreset":"","taxonomyRelation":"AND","selectedTaxonomies":[],"selectedTags":[],"isPostsPerPageAll":false,"postsAuthors":[],"postsOrderBy":"date","postsOrder":"desc","postsSearch":"","postsOffset":0,"postsInclude":[],"postsExclude":[],"isExcludeCurrent":false,"isExcludeSticky":false,"isPagination":false,"paginationPrevLabel":"Prev","paginationNextLabel":"Next","paginationColors":{"color":"#fff","bg":"#146EF5"},"paginationHovColors":{"color":"#fff","bg":"#070127"},"paginationPadding":{"vertical":"8px","horizontal":"15px"},"paginationSpacing":"15px","loadMore":{"type":"","alignment":"center","scrollTop":{"enabled":false,"offset":50},"infinityScroll":{"offset":-100,"spinner":true,"label":"Loading..."},"button":{"label":"Load More"}},"contentAlign":"left","hoverContentBG":{"color":""},"contentPadding":{"vertical":"20px","horizontal":"25px"},"border":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"hoverBorder":{"width":"1px","color":"#0c0d3c1a","radius":"5px"},"shadow":[],"hoverShadow":[],"sliderIsLoop":true,"sliderIsTouchMove":false,"sliderAutoplayOptions":{"delay":1.5},"sliderSpeed":1.5,"sliderEffect":"slide","sliderIsPage":true,"sliderIsPageClickable":true,"sliderIsPageDynamic":true,"sliderPageColor":"#146EF5","sliderPageWidth":"15px","sliderPageHeight":"15px","sliderPageBorder":{"radius":"50%"},"sliderIsPrevNext":true,"sliderPrevNextColor":"#146EF5","tickerDirection":"up","tickerSpeed":"slow","tickerInterval":2000,"tickerHeight":"0px","tickerVisible":3,"tickerIsMousePause":true,"newsTicker":{"label":"Trending Now","theme":"theme1","type":"vertical","direction":"up","speed":3000,"animation":"slide","pauseOnHover":true},"magazine":{"subLayout":"left-image","minHeight":{"desktop":"450px","tablet":"400px","mobile":"350px"}},"elementsSort":["title","meta","excerpt"],"isFImg":true,"fImgSize":"full","fImgFitting":"cover","isTitle":true,"isTitleLink":true,"titleTypo":{"fontFamily":"Roboto","fontSize":{"desktop":"25px","tablet":"22px","mobile":"20px"},"googleFontLink":"https:\/\/fonts.googleapis.com\/css2?family=Roboto&display=swap"},"titleMargin":{"side":4,"bottom":"15px"},"isMeta":true,"isMetaAuthor":true,"metaAuthorIcon":"","isMetaDate":true,"metaDateFormat":"M j, Y","metaDateIcon":"","isMetaCategory":true,"metaCategoryIcon":"","metaTaxonomies":{"selected":[]},"isMetaReadTime":false,"metaReadTimeIcon":"","isMetaReadTimeSec":false,"metaReadTimeLabel":"Min read","isMetaComment":false,"metaCommentIcon":"","metaTypo":{"fontSize":{"desktop":"13px"},"textTransform":"uppercase"},"metaTextColor":"","metaMargin":{"side":4,"bottom":"15px"},"isExcerpt":true,"isExcerptFromContent":false,"isEllipsisOnExcerpt":false,"excerptAlign":"justify","excerptTypo":{"fontSize":{"desktop":"15px"}},"excerptColor":"","excerptMargin":{"side":4,"bottom":"10px"},"isReadMore":true,"isLinkNewTab":false,"readMoreAlign":"left","readMoreTypo":{"fontSize":{"desktop":"14px"},"textTransform":"uppercase","fontWeight":600},"readMoreBorder":{"radius":"3px"},"image":{"width":"100%","height":"60%","lazyLoad":false,"defaultImage":"","styles":{"grayScale":false,"hoverGrayScale":false,"border":{"width":"0px","style":"none"},"radius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"hoverRadius":{"top":"0px","right":"0px","bottom":"0px","left":"0px"},"shadow":[],"hoverShadow":[],"margin":{"top":"","right":"","bottom":"","left":""},"hoverAnimation":"none"}},"title":{"tag":"h3","limit":{"type":"word","value":10,"ellipsis":false},"styles":{"textAlign":"","hoverColor":""}},"meta":{"gap":"10px","separator":"","sorting":["author","date","category","readTime","comment","viewCount","taxonomy"],"date":{"timeAgo":false},"viewCount":{"isVisible":false,"icon":""},"styles":{"alignment":"","hoverColor":"","linkHoverColor":"","iconHoverColor":"","separatorColor":""}},"excerpt":{"from":"excerpt","styles":{"hoverColor":""}},"readMore":{"icon":"","iconGap":"10px","iconPosition":"right","styles":{"hoverBorder":{"radius":"3px"},"hoverAnimation":"none","shadow":[],"hoverShadow":[]}},"categoryOnImage":{"styles":{"position":"bottomLeft","padding":{"top":"3px","right":"8px","bottom":"3px","left":"8px"},"radius":{"top":"3px","right":"3px","bottom":"3px","left":"3px"},"margin":{"top":"0px","right":"0px","bottom":"10px","left":"10px"}}},"gbBlockCondition":"","gbBlockConditionInvert":false,"currentPostId":8886}' >
Loading posts…