Azure PowerShell authenticate mit Azure Active Directory ohne popup-Fenster - Add-AzureAccount vs. Management Certificates

 

Hallo @all,

wenn man in Azure viel automatisiert, dann wird man früher und später eine Aufgabe lösen müssen. “Wie bekommt man die PowerShell Skripte secure & automatisch zur Ausführung ohne das Klartext-Passwörter verwendet werden für den Zugriff auf die Azure Subscription oder für den Zugriff auf Virtuelle Maschinen via Remote-PowerShell.”

Traditionell verwendet man in Azure die Management Zertifikate für den Zugriff auf Azure Subscriptions. Das ist Secure und gebunden mit einem Zertifikat für den User. Doch warum muss man User und Zertifikate pflegen, wenn man nur den Zugriff auf eine Ressource sicherstellen möchte. Kommt noch der Zugriff auf Virtuelle Maschinen hinzu, dann nutzt man in der Regel ein Active Directory. Also bläht sich das Management von IT Ressourcen auf und die Komplexität nimmt zu, indem man Zertifikate und AD zusammen pflegen muss.

Warum?  

Es geht genauso sicher und dennoch einfacher. Zudem gibt es einige Ressourcen in Azure die nicht mehr mit Management Zertifikaten unterstützt werden.

D.h. Azure Management Certificates sind Old-School

D.h. Befehle wie Get-AzurePublingingSettingsFile und import-AzurePublishingSettingsFile gehören für mich der Vergangenheit an.
https://blogs.technet.com/b/patrick_heyde/archive/2012/07/10/windows-azure-und-powershell-how-to.aspx

Die Frage ist nun: Wie sieht die Alternative aus? Einfacher und genauso sicher!

Ich verwendet dafür mein Azure Active Directory in der Azure Subscription. Dort habe ich einen Benutzer eingetragen. Man kann Azure AD Connect verwenden und das Lokale Windows AD mit dem Azure AD synchronisieren oder einfach einen User von Hand in das Azure AD eintragen. Auf diese Weise verwendet man die User Credentials in der Azure Subscription. Wenn man das Azure AD mit lokalem AD synchronisiert dann kann man sogar Single Sign On verwendet und nutzt die lokalen LogOn Credentials.

Am Ende ist nur eines wichtig. Man hat einen User Account im Azure AD zur Verfügung.

image

Nun kann man via PowerShell die Authentifizierung gegen das Azure AD verwenden. Was muss man dafür tun? Nichts Smile weil Windows automatisch das AzureAD auflösen kann.

Damit man loslegen kann, sollte man den Azure AD User in der Azure Subscription berechtigen, also als Co-Administrator hinterlegen.

image

Und so geht es weiter, in Powershell verwendet man den Benutzernamen und das Passwort, indem man in der PowerShell Add-AzureAccount ausführt. Normalerweise öffnet sich dann ein Fenster, man gibt den Benutzernamen und das Password ein und erhält in der PowerShell Console die Credentials.

Die Option 1 ist jetzt wenig Secure, da das Passwort im Klartext im Skript hinterlegt ist.  Es soll einfach den ersten Einstieg verdeutlichen.

# Option 1:
$username = patrick@phclouddomain.onmicrosoft.com # Azure AD User Account
$password = ConvertTo-SecureString "meinPassword123" -AsPlainText -Force

$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

Add-AzureAccount -Credential $cred

Get-AzureVM

Auf diese Weise hat die PowerShell Console Zugriff auf meine Azure Subscription bekommen und kann jetzt VMs aufbauen, Konfigurationen anpassen etc.

Als nächsten Schritt möchte man das Passwort nicht mehr im Klartext hinterlegen. D.h. den Secure-String verwenden, also ein verschlüsseltes Passwort kommt zum Einsatz.

Option 2:

Das Passwort abzusichern und nicht für jedem zugänglich zu machen:

read-host -assecurestring | convertfrom-securestring | out-file C:\temp\securestring.txt

Mit dieser Zeile erstellt man einmalig einen SecureString für sein Passwort. Es ist hinterlegt in einer Textdatei, es ist möglich dass man auch ein anderes Speichermedium verwendet wie eine Datenbank oder Windows AD User-Feld.

image

Um sich zu Authentifizieren benötigt man Zugriff auf die Datei, d.h. meine Windows logon Credential kann ein Mittel sein um den Zugriff auf die Datei zu begrenzen. Danach passiert der Rest automatisch ohne viel Aufwand:

$pass = Get-Content C:\temp\securestring.txt | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "patrick@phclouddomain.onmicrosoft.com",$pass

Add-AzureAccount -Credential $mycred

Get-AzureVM

image

Auf diese Weise kann man die Komplexität aus der Umgebung reduzieren bei gleichbleibender Security und einem hohem Automatisierungsgrad.

Viel Spaß damit,

Liebe Grüße

Patrick