/images/avatar.png

Work and live with IT

Ist diese IP Adresse Teil des Office 365 Adressbereiches?

Bei der Analyse von Firewall Logs in Office 365 Projekten kommt es immer wieder zu der Fragestellung: Ist diese geblockte IP Adresse Teil des Office 365 Adressbereichs?

Dank PowerShell und der von Microsoft veröffentlichten Information im JSON Format ist die Antwort nur ein paar Zeilen Code entfernt.

Damit ihr das Rad nicht neu erfinden müsst teile ich hier mein Skript “Test-IsO365IpAddress.ps1”. Dem Skript wird einfach die fragliche IP Adresse und optional der TCP/UDP Port übergeben. Es lädt die aktuelle Liste der Adressbereiche von Microsoft und prüft ob die IP Adresse Teil eines der dort enthaltenen IP Netze ist. Ist dies der Fall werden alle Service die dieses Netz nutzen ausgegeben.

SCHANNEL Einstellungen des Azure Windows Marketplace image geändert

Vor ein paar Wochen habe ich bemerkt, dass das Azure Marketplace Image für Windows 2016 Server zusätzliche Registry Einstellungen erhalten hat. Diese Einstellungen unterscheiden sich von einem manuell installierten und aktualisierten Windows 2016 Server!

Diese neuen Registryschlüssel deaktivieren die folgenden Ciphers und Protokolle:

  • Ciphers
    • RC4 128/128
    • RC4 40/128
    • RC4 56/128
  • Protokolle
    • SSL 2.0 Client
    • SSL 3.0 Client/Server

Vorab: Diese neuen Einstellung betreffen veraltete Cipher Suites und Protkolle und sollten in jeder gehärteten Umgebung schon seit Jahren deaktiviert sein. Ein Teil der Einstellungen ist sogar obsolet, da Sie nur die Standardeinstellungen von Windows 2016 abbilden.

Report des Log Analytics Workspace für alle Azure VMs

Manchmal möchte man nur wissen, an welchen Log Analytics Workspace (OMS für die älteren Leute da draußen) eine VM ihre Log Daten sendet. Oder sogar alle von euren Azure VMs auf einmal?

Mit dem folgenden Skript ist diese Aufgabe kinderleicht. Und dank RamblingCookieMonster und seinem PSExcel Modul kannst du das Ergebnis direkt an alle Excelliebhaber versenden.

ReportLogAnalyticsWorkspacePerVM.ps1

#region Report: All VMs including the status, and OMS workplace
$Subscriptions = Get-AzureRmSubscription | Where-Object { $_.Name -in ("SUB01","SUB02") }
$OmsWorkspaces = @()
ForEach ($Subscription in $Subscriptions) {
    $SubscriptionName = $Subscription.Name
    Set-AzureRmContext -SubscriptionName "$SubscriptionName" | Out-Null
    $OmsWorkspaces += Get-AzureRmOperationalInsightsWorkspace
}
$Report = ForEach ($Subscription in $Subscriptions) {
    $SubscriptionName = $Subscription.Name
    Set-AzureRmContext -SubscriptionName "$SubscriptionName" | Out-Null
    $RGs = Get-AzureRMResourceGroup
    foreach ($RG in $RGs) {
        $VMs = Get-AzureRmVM -ResourceGroupName $RG.ResourceGroupName
        foreach ($VM in $VMs) {
            # Query OMS Workspace
            $VM = Get-AzureRmVM -ResourceGroupName $RG.ResourceGroupName -Name $VM.Name
            $ExtensionName = $VM.Extensions | Where-Object { $_.VirtualMachineExtensionType -in ("MicrosoftMonitoringAgent", "OmsAgentForLinux") } | Select-Object -ExpandProperty Name -First 1
            if ( $ExtensionName ) {
                $ExtensionInformation = Get-AzureRmVMExtension -ResourceGroupName $VM.ResourceGroupName -VMName $VM.Name -Name $ExtensionName
                $OmsWorkspaceId = ($ExtensionInformation.PublicSettings | ConvertFrom-Json).workspaceId
                if ( $OmsWorkspaceId ) {
                    $OmsWorkspace = $OmsWorkspaces | Where-Object { $_.CustomerId -eq $OmsWorkspaceId }
                    $OmsWorkspaceName = "$($OmsWorkspace.Name)"
                } else {
                    $OmsWorkspaceName = "n/a"
                    $OmsWorkspaceId = "n/a"
                }
            } else {
                $OmsWorkspaceName = "n/a"
                $OmsWorkspaceId = "n/a"
            }
            # VM Status (running/deallocated/stopped)
            $VMDetail = Get-AzureRmVM -ResourceGroupName $RG.ResourceGroupName -Name $VM.Name -Status
            $VMStatusDetail = $VMDetail.Statuses.DisplayStatus -match "^VM .*$"
            New-Object psobject -Property @{
                "VMName"           = $VM.Name
                "OSType"           = $VM.StorageProfile.OSDisk.OSType
                "ResourceGroup"    = $RG.ResourceGroupName
                "VMStatus"         = "$VMStatusDetail"
                "SubscriptionName" = $SubscriptionName
                "OmsWorkspaceName" = $OmsWorkspaceName
                "OmsWorkspaceId"   = $OmsWorkspaceId
            }
            Remove-Variable -Name OmsWorkspaceId -ErrorAction SilentlyContinue
            Remove-Variable -Name ExtensionName -ErrorAction SilentlyContinue
        }
    }
}
# Export as XLSX file
Import-Module PSExcel
$Filename = "LogAnalytics_Report_" + (Get-Date).ToString("yyyy-MM-dd_HHmmss")
$Report | Export-XLSX -Path "~/$Filename.xlsx" -Table -Autofit

Azure Log Analytics - RegEx Groß-Kleinschreibung ignorieren

Bei der Suche in Log Analytics kann matches regex sehr hilfreich sein. Im Standard ist die Regular Expression Case Sensitive. Um dies zu ändern muss der Paramter i übergeben werden.

Hier eine Beispielabfrage, mit der die IIS Logs nach Logs von einem bestimmten Computer durchsucht werden.

W3CIISLog
| where ( Computer matches regex "(?i)MyCoMpUtEr" )
// (?i) = Case insensitive

AzureRM.Network 0.9 macht Probleme mit Azure Automation

Solltet Ihr Azure Automation nutzen und das Modul AzureRM.Network in einer der Versionen von 0.9.0 bis min. 0.10.0 nutzen, kann es zu Problemen bei der Ausführung von Azure Automation Runbooks kommen.

Sollten die verwendeten Runbooks insgesamt etwas aufwändiger sein, kann es durch diese Version zu hoher Memory Auslastung kommen. Sollten über 400 MB RAM verwendet werden, endet das Runbook nach drei Versuchen im Status “Suspended”.

Fehler

The runbook job was attempted 3 times, but it failed each time. Common reasons that runbook jobs fail can be found here:
https://docs.microsoft.com/en-us/azure/automation/automation-troubleshooting-automation-errors

Eine freie IP Adresse in Azure finden

Ob bei automatisiertem Deployment oder beim Erstellen eines Load Balancer in Azure. Eine freie IP Adresse zu finden ist leider mit den vorhandenen cmdlets nicht ohne weiteres möglich.

Test-AzureRmPrivateIPAddressAvailability

Eine beliebte Variante ist die Nutzung des cmdlets Test-AzureRmPrivateIPAddressAvailability. Es liefert bei der Angabe des Netzwerks und einer IP Adresse den Wert TRUE oder FALSE zurück. Manche Menschen fangen jetzt an jede Netzwerkadresse in einem Subnets zu testen, bis eine freie IP Adresse mittels TRUE bestätigt wird.