Mein erstes Azure Data Studio Notebook – Aufsetzen von Aliasen, SPNs und Kerberos Delegierung

Hallo alle miteinander,

endlich habe ich mir mal wieder die Zeit genommen ein klein wenig zu schreiben. Heute geht es um mein erstes kleines Azure Data Studio Notebook, welches ich erstellt habe.

Großartig erklären, was es mit dem Notebook im ADS auf sich hat, brauche ich an der Stelle nicht. Ich bin so frei und verweise einfach auf den Blog Post vom Björn Peters aus Hamburg. Björn hatte schon vor langer Zeit Notebooks für sich entdeckt.

Das Schöne ist, dass so ein Jupyter Notebook im ADS nicht nur SQL-Kernel beherrscht, wo Ihr T-SQL Skripte und deren Ergebnisse zusammenfassen könnt. Es ist auch ein Powershell-Kernel mit an Bord.

Und daher ist mein 1. Notebook ist ein Powershell Notebook geworden. Ok, dazu kommt noch die Inspiration durch Rob Sewell ( t | b ), der extrem viel mit Notebooks macht und Jess Pomfret (t | b) durch den Artikel die morgendliche Checkliste in ein ADS Notebook zu packen. Besten Dank an der Stelle nochmal.

Doch wie bin ich überhaupt dazu gekommen, so ein Notebook zu erstellen? Nun, in meiner Rolle als DBA habe ich dann und wann auch mal mit Kerberos Themen zu tun. Das klassische Beispiel ist: Ein Anwender greift von seinem Rechner auf einen Server mit SQL-Server Reporting Services zu. Die Reports verweisen mit der Datenquelle auf einen MS SQL Datenbankserver. Dabei ist die Datenquelle so konfiguriert, dass die Windows Anmeldeinformation des Anwenders genutzt werden soll. Also haben wir den „klassischen“ Doppel Hopp (Double-Hop). Damit so etwas in einem Netzwerk mit Active Directory ordentlich funktioniert, brauchen wir sauber registrierte Service Principal Names, ein oder mehrere Servicekonten, welche auf den oder die SPNs die Anmeldeinformationen weiterreichen können, usw.

An und für sich ist so ein Setup relativ simpel. Aber wenn man, so wie ich, noch die Anforderung erhält, dass auch ein DNS-Alias mit konfiguriert werden soll und man die diversen Dienste (SQL Server, Analysis Services…) unter dedizierten Dienstekonten betreibt, dann muss man doch immer wieder überlegen, was wo wie konfiguriert werden muss. Im weiteren Verlauf dieses Artikels halte ich alles relativ einfach. Im Notebook selbst sieht man dann schon, wie flexibel man das alles einsetzen kann.

Also kurz meine eigentliche Aufgabe (etwas kondensiert) erläutert: für eine Webapplikation wurden spezifische Aliase im DNS angefragt, um etwas mehr Flexibilität zu haben bei etwaigen Umzügen etc. pp. Also so etwas wie SQL-MYAPP-DB-P. DOMAIN.LOCAL und SQL-MYAPP-AS-P. DOMAIN.LOCAL für eine Verbindungszeichenfolge zum Datenbankserver und einmal für die Analysis Services (ok, ist derzeit der gleiche Server, aber ggf. wird der Dienst ja mal umgezogen).

Der erste Teil meines Notebooks macht genau das, ein oder mehrere Aliase für einen Server im DNS registrieren. Ich habe direkt mehrere Zellen erstellt, um auch die Anforderung abzudecken, dass man ggf. verschiedene Aliase anlegen möchte für Produktion, Test oder Entwicklung. Kommt aber immer auf die jeweilige Umgebung und Namenskonvention an. Your mileage may vary wie man so schön sagt.

#'CNAME/Alias erstellen
#'''''''''''''''''''''''''
# install-module dnsserver
<# Reminder
https://docs.microsoft.com/en-us/powershell/module/dnsserver/?view=win10-ps
DnsServer Module can be obtained either by installing DNS Server role or adding the DNS Server Tools part of Remote Server Administration Tools (RSAT) feature.
#>
$domain = 'domain.local'
$AliasName = 'SQL-MyApp.domain.local'
$targetServer = 'MyTgtServer'
$target = $targetServer + '.' + $domain
$target
$DNSSrv = 'MyDNS.Domain.local'
Add-DnsServerResourceRecordCName Name $AliasName HostNameAlias $target ZoneName $domain Verbose ComputerName $DNSSrv WhatIf

view raw
createAlias.ps1
hosted with ❤ by GitHub

Mit einem Alias ist es jedoch nicht getan, denn man braucht als nächstes auch passende ServicePrincipalNames für die jeweiligen Dienstekonten. Das Konto, unter dem der SQL-Server Dienst betrieben wird, braucht also zum Beispiel den Eintrag MSSQLSvc/SQL-MYAPP-DB-P. DOMAIN.LOCAL

Der eigentliche Befehl, um einen SPN Eintrag zu tätigen ist dabei nur ein Einzeiler. Aber wenn man das Ganze öfter wiederverwenden oder so ein Notebook vielleicht auch als Dokumentation nutzen will, dann nutzt man halt diverse Variablen. Ich bin, was das angeht, auch eher so der PowerShell Spaghetticode Schreiber, wie ihr seht:

#SPN SETZEN DB Service
$MeinServiceKto = "MyServiceAccount"
#Variablen fuer Alias, Environment, Dienst
$AliasApp = "MyApp"
$TargetEnv = "P"
$Svc = "MSSQLSvc"
$domain = 'domain.local'
$MeinServiceKonto = $MeinServiceKto + $TargetEnv
$MeinServiceKonto
$DBSPNs2Add = @()
$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain+':1433' #still a bit static
$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain #still a bit static
$DBSPNs2Add
$mySvcAcc = Get-ADServiceAccount Identity $MeinServiceKonto
$mySvcAcc.DistinguishedName
#SPN hinzufügen
Set-ADObject Identity $mySvcAcc Add @{"ServicePrincipalName"=$DBSPNs2Add} Verbose WhatIf

view raw
createSPN.ps1
hosted with ❤ by GitHub

Und dann kommt der letzte Teil, wo man eventuell auf die Hilfe der Kollegen angewiesen ist. Ihr müsst ja wissen welches das oder die Konten sind, welche(s) am Ende die Anmeldeinformationen weiterreichen soll(en). In meinem Fall war es z.B. das Konto eines Application Pools in den Internet Information Services.

Da im vorangegangenen Code Block ja die Variable $DBSPNs2Add ja die benötigte Info enthält, nutze ich diese einfach weiter in meinem Skript bzw. in meinem Notebook.

$Account = "MyNormalSvcAccount"
$mySvcAcc = Get-ADUser Identity $Account
Set-ADObject Identity $mySvcAcc Add @{"msDS-AllowedToDelegateTo"=$DBSPNs2Add } Verbose

view raw
setDelegation.ps1
hosted with ❤ by GitHub

Das komplette Notebook findet Ihr auf GitHub:

https://github.com/DiHo78/ADSNotebooks/blob/master/ActiveDirectory_stuff/DelegationSetupNotebook.ipynb

Ihr könnt es Euch hier aber auch einfach einmal angucken:


Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Am Ende des Notebooks habe ich auch wieder mehr als eine Code Zelle. Je nachdem, ob man für ein normales Dienstkonto, ein (group)ManagedServiceAccount oder ein Computerkonto die Delegierung setzen möchte.

Vielen Dank fürs Lesen.

Über Dirk Hondong

A MS server and ms sql server admin guy from germany. want to improve my skills a little bit, sharing my daily experience
Dieser Beitrag wurde unter SQL Server, SQL Server Administration, PowerShell, Azure Data Studio, Jupyter Notebook abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s