Często chcielibyśmy po prostu utworzyć użytkownika bazy danych i użyć prostego uwierzytelniania SQL – ale nie zawsze jest to możliwe, zwłaszcza gdy mamy do czynienia z mocno ograniczonymi danymi. W takich przypadkach jesteśmy zmuszeni korzystać z AD authentication, a żeby było jeszcze trudniej, często musimy uzyskać technical user do przetwarzania zadań cyklicznych itp. Nie jest to bardzo skomplikowane, ale proces może nie być całkowicie intuicyjny.
Odwiedź naszą Data Engineering Consultancy, aby znaleźć rozwiązania dopasowane do Twojej firmy.
Rozwiązanie
Aby skonfigurować Azure SQL authentication z Azure Active Directory (AD), pierwszym krokiem jest utworzenie app registration w Azure Active Directory. Ta app registration będzie pełnić rolę „technical user” i pozwoli nam na bezpieczne uwierzytelnianie. Poniżej znajdziesz szczegółowy przewodnik krok po kroku:
Krok 1: Przejdź do Azure Active Directory
Zaloguj się do Azure Portal.
W menu po lewej stronie znajdź i kliknij Azure Active Directory w sekcji Azure Services. Tutaj zarządzasz wszystkimi aspektami katalogu, w tym app registrations.
Krok 2: Przejdź do App Registrations
Będąc w Azure Active Directory, znajdź opcję App Registrations w menu po lewej.
Kliknij App Registrations, aby zobaczyć listę istniejących rejestracji lub utworzyć nową.
Krok 3: Utwórz nową App Registration
W sekcji App Registrations kliknij przycisk New Registration u góry ekranu.
Wypełnij wymagane dane:
- Name: Wpisz nazwę aplikacji (np. "SQLAuthApp").
- Supported Account Types: Wybierz Single Tenant, jeśli aplikacja będzie używana tylko w Twojej organizacji.
- Redirect URI: Opcjonalne, można zostawić puste.
Po wypełnieniu kliknij Register, aby utworzyć app registration.
Krok 4: Pobierz właściwości aplikacji
Po utworzeniu app registration będziesz potrzebować kilku kluczowych właściwości:
- Application (client) ID: Unikalny identyfikator aplikacji.
- Directory (tenant) ID: Identyfikator Twojego Azure AD tenant.
- Client Secret: Utworzysz go w następnym kroku.
Krok 5: Utwórz Client Secret
Przejdź do sekcji Certificates & Secrets w swojej app registration.
Kliknij New Client Secret, aby wygenerować secret key dla aplikacji.
Podaj opis (np. "SQLAuthSecret") i ustaw okres ważności (np. 6 miesięcy, 1 rok).
Kliknij Add, aby wygenerować secret.
Skopiuj wygenerowaną wartość i przechowuj ją w bezpiecznym miejscu, np. w Azure Key Vault – nie będzie już ponownie wyświetlona.
Krok 6: Przyznaj uprawnienia
Przejdź do sekcji API Permissions w app registration.
Kliknij Add a Permission i wybierz Azure SQL Database z listy API.
Wybierz odpowiednie uprawnienia (np. user_impersonation) i udziel admin consent, jeśli to wymagane.
Krok 7: Skonfiguruj Azure SQL
Przejdź do swojej instancji Azure SQL w Azure Portal.
Dodaj app registration jako external user na serwerze SQL.
Przyznaj odpowiednie role i uprawnienia, np. db_datareader lub db_datawriter, w zależności od potrzeb.
Po wykonaniu tych kroków masz utworzoną app registration w Azure Active Directory, która może być używana jako technical user do bezpiecznego uwierzytelniania z Azure SQL. Takie ustawienie zapewnia ochronę bazy danych i umożliwia płynną integrację z aplikacjami.

Następnie wybierz Rejestracje aplikacji w menu po lewej stronie:

Kliknij Nowa rejestracja w górnej części ekranu:

Wpisz nazwę aplikacji, zaznacz Single Tenant, a na koniec kliknij przycisk „Zarejestruj się”.
Po utworzeniu aplikacji będziemy potrzebować niektórych jej właściwości do dalszej konfiguracji:

Będziemy również potrzebować tajemnicy, która zostanie użyta do uwierzytelniania naszej aplikacji. Aby stworzyć nowy sekret, przejdźmy do naszej aplikacji i wybierz „Certyfikaty i tajemnice”:

Następnie kliknij „Nowy sekret klienta”, a po jego utworzeniu przechowuj go w bezpiecznym miejscu, potencjalnie skarbcu kluczy.

Po uzyskaniu powyższych informacji możemy rozpocząć konfigurowanie połączenia z naszą instancją Azure SQL.
W tym momencie mamy na to kilka sposobów. Możemy spróbować użyć naszej aplikacji, nadać jej uprawnienia dla instancji Azure SQL, utworzyć użytkownika zewnętrznego na serwerze SQL, ale często jest to niemożliwe ze względu na ograniczenia administracyjne w środowisku Azure.
Spróbujmy bardziej uniwersalny sposób, który jest prawie tak prosty jak drugi — wygeneruj token dostępu i używaj go do logowania.
Aby wygenerować token użyjemy biblioteki MSAL dla Pythona (ADAL wkrótce zostanie pominięty).
Musimy wywołać instancję obiektu ConfidencialClientApplication z biblioteki msal.
Konstruktor klasy potrzebuje pewnych parametrów:
client_id — to jest nasz identyfikator głównego usługi (ID aplikacji)
Ten blok zawiera nieoczekiwaną lub nieprawidłową zawartość.ResolvePrzekształć to HTMLAuthority — jest to identyfikator URI składający się z łącza api: https://login.microsoftonline.com/ i identyfikator najemcy (identyfikator katalogu naszej aplikacji)
client_credential — wcześniej utworzony sekret klienta aplikacji
Po zebraniu wszystkich informacji tworzymy aplikację:
app = msal.confidencialClientApplication (client_id=servicePrincipalID, authority=organ, client_credential=ServicePrincipalPwd,)
I użyj metody aquire_token_silent:
wynik = app.aquire_token_silent (zakres = [zakres], konto = brak)
Ten blok zawiera nieoczekiwaną lub nieprawidłową zawartość.ResolvePrzekształć do HTMLGdzie zakres jest: https://database.windows.net//.default (z podwójnym „//” - nie pomyłka)
Metoda cicha może nie działać, w takim przypadku wybierz inną:
jeśli nie wynik: result = app.aquire_token_for_client (zakres)
Następnie sprawdź, czy otrzymaliśmy token w odpowiedzi, i zapisz go:
jeśli „access_token” w wyniku: SQLazureAccessStoken = wynik ["access_token"]
Jesteśmy prawie gotowi do połączenia z JDBC. Wystarczy utworzyć identyfikator URI:
JDBCurl = „jdbc:sqlserver: //ourserver.database.windows.net:1433; baza danych = nasza baza danych; szyfruj = true; TrustServerCertificate=false; HostNameInCertificate=*.database.windows.net; loginTimeOut=30; uwierzytelnianie = ActiveDirectoryPassword”
i właściwości połączenia:
connectionProperties = {„AccessToken”: SQLazureAccessTok, „sterownik”: „com.microsoft.sqlServer.jdbc.sqlServerDriver”, „HostNameInCertificate”: „*.database.windows.net”, „encrypt”: „true”, „ServerCertificate”: „false”, „driver”: „com.microsoft.sqlserver.jdbc.LServerDriver"}
I jesteśmy gotowi iść:
jdbc_db = spark.read.format („com.microsoft.sqlserver.jdbc.spark”)\ .option („url”, „jdbc:sqlserver: //ourserver.database.windows.net”)\ .option („dbtable”, „(WYBIERZ* Z mytablespace.mytable) a”)\ .option („Nazwa bazy danych”, "ourNazwa bazy danych”, "ourNazwa bazy danych”, "our_db database”)\ .option („AccessToken”, SQLazureAccessToken)\ .option („szyfruj”, „true”)\ .option („HostNameInCertificate”, „*.database.windows.net”)\ .load ()
Niezawodne dag i local development z airflow i docker