Sandro Reiter

vCard und IT-Blog

ADFS: Certificate-Binding wird nicht korrekt ersetzt

Neben der klassischen Kombination aus Benutzername und Passwort zur Authentifizierung beherrschen die Active Directory Federation Services (ADFS) auch die Anmeldung per Nutzerzertifikat.

Hierzu wird von Microsoft empfohlen, dem ADFS Service-Communications-Certificate den alternativen DNS-Namen (SAN) certauth.adfs.meinedomäne.tld hinzuzufügen.

Während der ADFS-Konfiguration wird dieser Endpunkt entsprechend erstellt und das Zertifikat auf Port 443 gebunden.

Enthält das Zertifikat diesen SAN nicht, wird die zertifikatsbasierte Authentifizierung auf Port 49443 und den Service-Namen (adfs.meinedomäne.tld) gebunden.

 

So weit, so gut:

In einem Kundenszenario hatte ich nun den Fall, dass das Service-Communications-Zertifikat ersetzt werden musste. Gesagt, getan:
Zertifikat angefordert, PFX importiert und per PowerShell ersetzt

#replace adfs sts certificate, prequisite: certificate pfx has to be installed
Set-AdfsSslCertificate -Thumbprint "FC85DDB0FC58E63D8CB52654F22E4BE7900FE349"

Auf den Web Application Proxy (WAP) – Maschinen habe ich die Schritte zur Ersetzung des Zertifikats ebenfalls durchgeführt.

Die Umgebung lief bis zu dem Tage, als das alte Zertifikat abgelaufen ist, fehlerfrei. An dem Tag, nach dem das alte Zertifikat ungültig wurde, war der ADFS von extern nicht mehr erreichbar.

 

Der WAP meldete, das der ADFS-Services „unavailable“ wäre mit dem Fehler-Code „503“. Eine Re-Konfiguration des WAP endete mit dem Fehler:

“An error occurred while attempting to establish a trust relationship with the Federation Server.

Nach diversen Netzwerk-/Firewall-Tests blieb die Vermutung das es am ADFS selbst liegt…

Eine Überprüfung der Bindings mit

#show adfs ssl bindings
Get-AdfsSslCertificate

bestätigte den Verdacht

HostName                           PortNumber  CertificateHash
--------                           ----------  ---------------
localhost                             443      FC85DDB0FC58E63D8CB52654F22E4BE7900FE349
adfs.meinedomäne.tld                  443      FC85DDB0FC58E63D8CB52654F22E4BE7900FE349
adfs.meinedomäne.tld                  49443    FC85DDB0FC58E63D8CB52654F22E4BE7900FE349
certauth.adfs.meinedomäne.tld         443      3F65896B1E2102515FC7942BD1FC6D9F3603C04A

 

Das Zertifikat für die zertifikatsbasierte Authentifizierung wurde nicht aktualisiert.
Der WAP lief nun in den Fehler, auf ein abgelaufenes Zertifikat zu treffen.

 

Auf dem primären ADFS-Node muss also zusätzlich noch das certauth-Zertifikat ersetzt werden. Das gelingt per PowerShell wie folgt:

#replace adfs sts alternate certificate, prequisite: certificate pfx has to be installed
Set-AdfsAlternateTlsClientBinding -Thumbprint "FC85DDB0FC58E63D8CB52654F22E4BE7900FE349"

Die anschließende erneute Überprüfung der Bindings mit

#show adfs ssl bindings
Get-AdfsSslCertificate

bestätigt die Änderung.

Alle ADFS-Domains nutzen nun das neue, gültige Zertifikat.
Jetzt noch die Web Application Proxies re-konfigurieren, was nun fehlerfrei durchlaufen sollte. Check.

Die ADFS-Testseite (https://adfs.meinedomäne.tld/adfs/ls/IdpInitiatedSignon.aspx) war von extern wieder aufrufbar. Die Anmeldung der Nutzer war ebenso wieder möglich.

 

Warum dieses Verhalten beim Ersetzen des Zertifikats auftritt, erschließt sich mir nicht. Schließlich wird das Zertifikat bei der initialen ADFS-Einrichtung auch explizit auf diese Sub-Domain gebunden, also warum dann das neue Cert (mit den gleichen SANs) nicht auch für die zertifikatsbasierte Authentifizierung aktualisieren? Feature oder Bug?

Office 365: Das Periodensystem der Produkte

Die Palette an Produkten welche in Microsofts Office 365 Plattform enthalten sind, scheint bereits heute unendlich zu sein. Dennoch wächst und verändert sich das Angebot ständig weiter. Produkte kommen dazu, weniger Beliebte fliegen raus oder Dienste werden zusammengelegt beziehungsweise durch Neue ersetzt.

Ein tolles und gelungenes Beispiel für eine Kombinierung von Diensten und der Ersetzung einer Altlast ist Microsoft Teams! Teams ersetzt Skype for Business, zumindest die in Office 365 betriebene Cloud-Version. Teams vereinigt zudem auch SharePoint-Seiten und -bibliotheken, Audio- und Videokonferenzen, die Office Online Apps und vieles mehr an einer zentralen Stelle in einer einheitlichen Ansicht.

Ich möchte hier aber gar keinen Beitrag über Teams schreiben, vielleicht ein anderes Mal.

 

Kommen wir zum Thema:

Jeder wird sich wohl noch an das

Periodensystem der Elemente

aus dem Chemie- und Physikunterricht erinnern können.

Ich gebe Euch ein wesentlich interessanteres Informationsmedium an die Hand: Jeder möchte den maximalen Nutzen für sich aus Office 365 ziehen.
Das geht aber nur, wenn man in all den Funktionen nicht untergeht und sich einen Überblick verschaffen kann. Die Kollegen von jumpto365 machen sich die Mühe und haben das Periodensystem für Office 365 erstellt und halten es aktuell.

Nachfolgend findet Ihr das interaktive Periodensystem mit der Bitte sich damit vertraut zu machen – nächste Woche schreiben wir eine Leistungskontrolle dazu! 😉

Azure AD: UPN eines Hybrid-Users ändern

Als wir vor Kurzem einen neuen Kollegen eingestellt haben, wünschte dieser sich einen kürzeren Anmeldenamen (UPN) für Office 365 und Co.
Da ich natürlich vorbildlich bereits vor seinem Dienstantritt das Active Directory-Konto erstellt habe, änderte ich einfach den UPN am AD-Objekt und auch die neue Adresse im ProxyAdresses-Attribut wurde veröffentlicht und als primär festgelegt.

Als nach mehrfachen automatischen AAD Connect Synchronisationen der kosmetische Eingriff noch nicht geglückt war, habe ich eine manuelle Synchronisation angestoßen…

Start-ADSyncSyncCycle -PolicyType Delta

… allerdings ebenfalls ohne Erfolg.

 

Ich musste ein wenig in meinem Gedächtnis kramen – denn genau diese Änderung habe ich bereits an meinem eigenen Benutzerkonto durchgeführt – Déjà-vu! Mir fiel wieder ein, was ich schon mal vergessen habe.

Es ist natürlich richtig und wichtig den UPN und die neue Mail-Adresse im OnPremises AD zu ändern. Wenn das Konto aber bereits synchronisiert ist und in Azure AD angelegt, muss der UPN auch nochmal auf Azure AD-Seite geändert werden. Das gelingt ganz einfach wie folgt:

#connect to Azure AD tenant
Connect-AzureAD

#change UPN to default tenant-domain
Set-AzureADUser -ObjectId user@contoso.com -UserPrincipalName user@contoso.onmicrosoft.com

#set the UPN like the UPN in OnPrem AD
Set-AzureADUser -ObjectId user@contoso.onmicrosoft.com -UserPrincipalName mrright@contoso.com

 

Nachdem das nun erledigt ist, gilt der neue UPN in beiden IDPs – sowohl im Active Directory als auch Azure AD.

 

Famous last words: Wenn der UPN geändert wird, ändert sich auch die SIP-Adresse des jeweiligen Benutzers. Diese Adresse wird u.a. im Skype for Business-Verzeichnisdienst verwendet. Das wiederum hat die Folge, das bereits bestehende Kontakte den Benutzer mit neuem UPN erneut zur Kontaktliste hinzufügen müssen.

Azure: Ein Blick hinter die Kulissen

Wer wollte schon immer einmal Mäuschen spielen und mehr über Microsofts Cloud Plattform Azure erfahren? Einen spannenden Einblick über den Milliarden-Invest von Microsoft bietet das nachfolgende Video aus der zweiten Jahreshälfte 2016.

 

Seitdem stehen die Uhren bei Microsoft natürlich nicht still. Zum heutigen Zeitpunkt steht die Cloud Plattform auf 54 globalen Rechenzentren zur Verfügung, 10 davon befinden sich derzeit in der Bauphase bzw. Fertigstellung – 2 davon auch in Deutschland!

Persönliche Besuche in den Mega-Rechenzentren sind nahezu unmöglich zu bekommen. Wer trotzdem einmal hinter die Kulissen schauen möchte, dem kann ich einen virtuellen Rundgang sehr empfehlen: Tour starten.

Azure Automation: Anfordern eines Ad-Hoc SAS Tokens

Wer mit Azure Storage arbeitet, kommt über kurz oder lang nicht daran vorbei die Verarbeitung von Dateien zu automatisieren. Was über die Web-UI so einfach geht, ist via PowerShell nicht ganz so trivial.

In einem Container mit dem AccessLevel „private“ wird ein SAS Token benötigt um auf die Dateien zuzugreifen und mit diesen zu arbeiten.

Wie genau dieser Token in einem Azure Automation PowerShell RunBook angefordert werden kann, zeigt das folgende Skript:

#define parameter
Param(
    [Parameter(Mandatory=$True)]
    [string]$AzureAutomationAccount,

    [Parameter(Mandatory=$True)]
    [string]$FileWebUrl,

    [Parameter(Mandatory=$True)]
    [string]$StorageAccountName,

    [Parameter(Mandatory=$True)]
    [string]$StorageResourceGroup,

    [Parameter(Mandatory=$True)]
    [string]$StorageContainerName,

    [Parameter(Mandatory=$True)]
    [string]$BlobName,

    [Parameter(Mandatory=$false)]
    [ValidateSet("r","rw","rcw","rwcd")] 
    [string]$AccessRights = "r",
    
    [Parameter(Mandatory=$false)]
    [int]$TokenLifeTime = 2
)

#get credentials from Azure Automation vault
$myCredential = Get-AutomationPSCredential -Name $AzureAutomationAccount

#sign in to AzureRM
Login-AzureRmAccount -Credential $myCredential

#get current utc time for sas token starttime and expiration
$TokenStartTime = Get-Date
$TokenStartTime = $TokenStartTime.ToUniversalTime()
$TokenEndTime = $TokenStartTime.AddHours($TokenLifeTime)

#get storageaccount key, set context to container and request adhoc SAS token
$StorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $StorageResourceGroup -AccountName $StorageAccountName).Value[0]
$StorageContext = New-AzureStorageContext $StorageAccountName -StorageAccountKey $StorageAccountKey
$SASKey = New-AzureStorageBlobSASToken -Protocol HttpsOnly -Container $StorageContainerName -Blob $BlobName -Context $StorageContext -Permission $AccessRights -StartTime $TokenStartTime -ExpiryTime $TokenEndTime

#join file-uri and SAS token to full download uri
$FullUri = "$FileWebUrl$SASKey"

 

Sobald das Skript in einem RunBook hinterlegt ist, können die Parameter übergeben und das Snippet im Azure Automation Kontext ausgeführt werden.

 

Das Skript verarbeitet die Datei nicht, sondern fordert nur den Token an. Die komplette URL (Blob+Token), welche am Ende als Variable ($FullUri) bereitsteht, kann für Dateioperationen, bspw. der Import des Dateiinhalts in eine Variable, verwendet werden solange der SAS-Token gültig ist.

#import csv content into variable
$content = ConvertFrom-Csv -Delimiter ";" (Invoke-WebRequest -Uri $FullUri).ToString()

Citrix Cloud: Verwaiste Managed-Disks in Azure

Vor Kurzem habe ich in einem Kunden-Tenant eine ungewöhnlich hohe Anzahl an verwalteten Datenträgern entdeckt (>8000). Die Datenträger stammten alle von Worker-VMs welche durch den MCS in der Citrix Cloud erstellt wurden.

Auf der Suche nach der Ursache des Problems bin ich nicht wirklich fündig geworden und habe während meiner Recherche ebenfalls den Citrix Support hinzugezogen, von dem ich eine spannende Antwort erhalten habe.

 

On, or about, 3/21/2018, Citrix was notified that customers in certain Azure regions were unable to use the products listed earlier. Preliminary investigations showed that the Azure infrastructure was rejecting booting VMs which did not have an identity disk of at least 1GB in size. As a result of this denial, the cloned OS (system) disk may be left around as an “orphaned” disk in your Azure subscription, leading to an unexpected large number of disks in your storage resource groups.

 

Was zusammenfassend bedeutet, das Azure VMs am Starten gehindert hat, wenn diese nicht mindestens eine 1 GB große „Identity disk“ besaßen. Als Resultat hinterließ der MCS eine besitzlose Managed Disk. Je nachdem, wann man dieses Problem bemerkt hat und wie viele Worker provisioniert sind, wurden entsprechend viele Datenträger in Azure hinterlassen.

 

On, or about, 4/6/2018, the Azure infrastructure began reporting the size of the identity disks as 1GB, thereby allowing your workloads to boot successfully thereafter. This temporary outage may have gone unnoticed but you may still be affected. While our investigation is still underway, we felt it was important that we reach out to you today in order for you to remove these unwanted orphaned disks from your Azure subscription to avoid overage charges.

 

Der Fehler wurde, relativ zeitnah, behoben und der Start der Maschinen ist wieder, so wie man es eigentlich erwartet, möglich.

 

Citrix legt betroffenen Kunden nahe, die verwaisten Datenträger aus Azure zu entfernen. Vorher sollte man sich aber an den Azure Support wenden um die dadurch entstandenen Kosten gutschreiben zu lassen. Das notwendige Support-Ticket ist am besten gleich aus dem betroffenen Azure Tenant zu erstellen.

Azure: S2S-VPN und die IPSec-Policy

Wer kennt es nicht: Eingefleischte Netzwerkadmins, womöglich sogar angestellt bei einem Rechenzentrums-Dienstleister, die alles rund um die Cloud als total unsicher und sowieso überflüssig einschätzen (und in Wahrheit vermutlich nur Angst um den Ast haben, auf dem sie sitzen) meckern über alles wo Microsoft dran steht oder drin ist.

Da ist es doch ein willkommener Aufhänger, wenn eine VPN Verbindung zu Azure nicht die Anforderungen abbilden kann, welche das NOC gern hätte.

Aber falsch gedacht! Was viele nicht wissen: Es ist möglich die Site-to-Site IPSec-Richtlinie einer VPN-Verbindung mithilfe des Azure CLI und des AzureRM PowerShell-Moduls an die gewünschten Anforderungen anzupassen.

 

Um die Richtlinie zu konfigurieren, müssen wir uns zunächst in den Azure Resource Manager einloggen, das gelingt uns wie folgt:

$credentials = Get-Credential

Login-AzureRmAccount -Credential $credentials

$subscriptionId = ( Get-AzureRmSubscription | Out-GridView -Title "Select an Azure Subscription ..." -PassThru).SubscriptionId
Select-AzureRmSubscription -SubscriptionId $subscriptionId

 

Anschließend können wir mit dem nachfolgenden Skript die Parameter der IPSecPolicy festlegen und damit die VPN Verbindung zum VPN-Gateway auf „der anderen Seite“ aufbauen.

$rg = "GatewayResourceGroup"

$policy = New-AzureRmIpsecPolicy -IkeEncryption AES256 -IkeIntegrity SHA1 -DhGroup DHGroup2 -IpsecEncryption AES256 -IpsecIntegrity SHA1 -PfsGroup None -SALifeTimeSeconds 27000 -SADataSizeKilobytes 1024000

$vpngw = Get-AzureRmVirtualNetworkGateway -Name "GW1"  -ResourceGroupName $rg
$localvpngw = Get-AzureRmLocalNetworkGateway  -Name "Local-GW1" -ResourceGroupName $rg

New-AzureRmVirtualNetworkGatewayConnection -Name "MyConnection" -ResourceGroupName $rg -VirtualNetworkGateway1 $vpngw -LocalNetworkGateway2 $localvpngw -Location "Azure Region" -ConnectionType IPsec -IpsecPolicies $policy -SharedKey 'PSK' -RoutingWeight 0

Welche Werte von Azure unterstützt werden, können wir unter folgendem Link in den Microsoft Docs nachlesen:

https://docs.microsoft.com/de-de/azure/vpn-gateway/vpn-gateway-ipsecikepolicy-rm-powershell

 

Um zu prüfen, ob die Einstellungen korrekt übernommen wurden, führen wir  folgendes Code-Snippet aus:

$rg = "GatewayResourceGroup"
$con = Get-AzureRmVirtualNetworkGatewayConnection -Name "MyConnection" -ResourceGroupName $rg

Write-Output $con.IpSecPolicies

 

Nach ein paar Augenblicken und korrekter Konfiguration auf beiden Seiten, steht der VPN Tunnel.