Microsoft Entra ID autentizace pomocí go-mssqldb

Ovladač go-mssqldb podporuje autentizaci Microsoft Entra ID prostřednictvím balíčkuazuread. Tento balíček registruje samostatný ovladač s názvem azuresql, který obaluje standardní ovladač sqlserver a přidává podporu přihlašovacích údajů Microsoft Entra ID.

Caution

Všechny vestavěné fedauth autentizační metody vyžadují název ovladače azuresql (nikoli sqlserver). Pokud použijete sql.Open("sqlserver", ...) s parametremfedauth, autentizace tiše selže s .Login failed for user '' Importujte azuread balíček a použijte azuresql tak, jak je ukázáno v následujícím příkladu.

Vyberte fedauthův tok

Použijte následující tabulku k výběru vhodného toku pro vaše hostitelské prostředí a zdroj přihlašovacích údajů:

Pokud potřebuješ spojit z... Začni s... Použijte, když...
Místní rozvoj ActiveDirectoryDefault Chcete znovu použít přihlašovací údaje Azure CLI nebo Azure Developer CLI bez nutnosti lokálně konfigurovat principal služby nebo spravovanou identitu.
Aplikace hostovaná v Azure s řízenou identitou ActiveDirectoryManagedIdentity Chcete předvídatelnou výrobní konfiguraci a nechcete mít v řetězci další místní zdroje kvalifikace.
A CI/CD pipeline in Azure DevOps ActiveDirectoryAzurePipelines Váš kanál už používá připojení ke službě Azure a zpřístupňuje SYSTEM_ACCESSTOKEN.
Kubernetes s Azure Workload Identity ActiveDirectoryWorkloadIdentity Váš pod obdrží soubor s tokenem OIDC a místo tajného klíče klienta chcete použít identitu úlohy.
Hlavní představitel služby s tajemstvím nebo certifikátem ActiveDirectoryServicePrincipal Vaše aplikace se ověřuje pomocí registrace aplikace a vy spravujete tajný klíč klienta nebo certifikát.
Nástroj, který už má přístupový token ActiveDirectoryServicePrincipalAccessToken nebo poskytovatel vlastních tokenů Vaše aplikace získává a obnovuje tokeny mimo řidiče.
Delegovaný uživatelský token z upstream webového API ActiveDirectoryOnBehalfOf Musíte vyměnit uživatelský token za SQL zaměřený token ve střední službě.
Nástroj pro vývojáře nebo interaktivní nástroj ActiveDirectoryInteractive, ActiveDirectoryDeviceCode, ActiveDirectoryAzClinebo ActiveDirectoryAzureDeveloperCli Člověk je přítomen k přihlášení nebo chcete znovu použít stávající lokální CLI relaci.
Aplikace pouze pro Windows, která spravuje požadavky na integrovanou autentizaci ActiveDirectoryIntegrated (pokročilé) Poskytujete vlastní logiku získávání tokenů pro integrované scénáře.

Pokud sdílíte jeden připojovací řetězec napříč lokálním vývojem a Azure hostingem, ActiveDirectoryDefault je to dobrý výchozí bod. Pro produkční prostředí použijte ActiveDirectoryManagedIdentity nebo ActiveDirectoryServicePrincipal, abyste se vyhnuli latenci řetězce přihlašovacích údajů.

Nainstalovat balíček AzureR

Stáhněte si subbalíčekazuread, který registruje ovladač:azuresql

go get github.com/microsoft/go-mssqldb/azuread

Použijte ovladač AzureSQL

Importujte azuread balíček (místo nebo navíc k základnímu go-mssqldb balíčku) a otevřete spojení pomocí názvu ovladače azuresql :

import (
    "database/sql"

    _ "github.com/microsoft/go-mssqldb/azuread"
)

func main() {
    db, err := sql.Open("azuresql",
        "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")
    // ...
}

Všechny následující příklady cílí na Azure SQL. Udržujte encrypt=true&TrustServerCertificate=false v připojovací řetězec, aby ovladač ověřoval serverový certifikát.

Typy oprávnění Fedauth

Nastavte fedauth parametr spojení na jednu z následujících hodnot. Většina typů odpovídá přihlašovacím údajům Azure Identity z balíčku azidentity. ActiveDirectoryServicePrincipalAccessToken a API pro poskytovatele tokenů na míru používají tokeny dodané volajícím.

ActiveDirectoryDefault

Používá azidentity.DefaultAzureCredential, která zkouší následující zdroje přihlašovacích údajů v pořadí:

  1. Proměnné prostředí (AZURE_TENANT_ID, AZURE_CLIENT_ID, a tak dále).
  2. Identita úlohy pro Kubernetes.
  3. Spravovaná identita
  4. Azure CLI přihlašovací údaje.
  5. Azure Developer CLI přihlašovací údaje.
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false

Tento typ používejte pro lokální vývoj, protože automaticky zachytává přihlašovací údaje pro Azure CLI. V produkčním prostředí použijte přímo ActiveDirectoryManagedIdentity nebo ActiveDirectoryServicePrincipal. DefaultAzureCredential Prochází každý zdroj přihlašovacích údajů při prvním připojení, což přidává latenci, kterou produkční zátěže nepotřebují.

ActiveDirectoryManagedIdentity

Autentizuje se systémově přiřazenou nebo uživatelem přiřazenou spravovanou identitou. Pro uživatelem přiřazenou identitu uveďte ID klienta v parametru user id :

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryManagedIdentity&encrypt=true&TrustServerCertificate=false

S uživatelem přiřazenou identitou:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryManagedIdentity&user id=<client-id>&encrypt=true&TrustServerCertificate=false

Note

ActiveDirectoryMSI je alias pro ActiveDirectoryManagedIdentity.

ActiveDirectoryServicePrincipal

Ověřuje se jako instanční objekt služby (registrace aplikace) pomocí ID klienta a tajného klíče klienta:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryServicePrincipal&user id=<client-id>&password=<client-secret>&encrypt=true&TrustServerCertificate=false

Pro ověřování instančního objektu služby pomocí certifikátu použijte clientcertpath=<path-to-certificate> společně s password=<certificate-password>.

Note

ActiveDirectoryApplication je alias pro ActiveDirectoryServicePrincipal.

ActiveDirectoryServicePrincipalAccessToken

Používá předem získaný přístupový token instančního objektu služby, který vaše aplikace předává přímo v připojovacím řetězci:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryServicePrincipalAccessToken&password=<access-token>&encrypt=true&TrustServerCertificate=false

Tento postup používejte pouze tehdy, když vaše aplikace již získá a obnoví přístupový token mimo ovladač. Pro většinu scénářů služby preferujte ActiveDirectoryServicePrincipal nebo poskytovatele vlastních tokenů.

ActiveDirectoryPassword

Important

Možnost ověřování ActiveDirectoryPassword (ověřování hesla Microsoft Entra ID) je v ovladačích MICROSOFT SQL zastaralá. Tento tok ověřování s vysokým rizikem není kompatibilní s povinným Microsoft Entra vícefaktorovým ověřováním (MFA) a nemusí fungovat v tenantech, ve kterých se vynucuje vícefaktorové ověřování. Naplánujte migraci na jinou metodu ověřování Microsoft Entra.

Ověřování heslem v Microsoft Entra ID je založeno na grantu OAuth 2.0 Resource Owner Password Credentials (ROPC), který umožňuje aplikaci přihlásit uživatele tím, že přímo pracuje s jeho heslem.

Microsoft doporučuje nepoužívat tok ROPC, protože není kompatibilní s vícefaktorovým ověřováním. Ve většině scénářů jsou k dispozici a doporučeny bezpečnější alternativy. Tento tok vyžaduje vysokou míru důvěryhodnosti v aplikaci a nese rizika, která nejsou přítomna v jiných tocích. Tento tok používejte pouze tehdy, pokud bezpečnější toky nejsou proveditelné. Microsoft odchází od tohoto vysoce rizikového toku ověřování, aby chránil uživatele před škodlivými útoky. Další informace najdete v tématu Plánování povinného vícefaktorového ověřování pro Azure.

Pokud je při přihlašování přítomen uživatel, použijte ověřování ActiveDirectoryInteractive nebo ActiveDirectoryIntegrated, aby byla auditní stopa přiřazena přihlášenému uživateli a aby se uplatnily zásady podmíněného přístupu.

V případě bezobslužných scénářů mezi službami postupujte podle pokynů k účtu služby Microsoft Entra:

  • Pokud vaše aplikace běží na Azure infrastruktuře, použijte ActiveDirectoryMSI (nebo ActiveDirectoryManagedIdentity v některých ovladačích). Spravované identity eliminují režii při údržbě a obměně tajných kódů a certifikátů.
  • Pokud spravovaná identita není dostupná (například aplikace běží mimo Azure), použijte ActiveDirectoryServicePrincipal. Pokud ho ovladač podporuje, upřednostňujte klientský certifikát před tajným klíčem klienta. S certifikátem zůstane privátní klíč v klientovi a do Microsoft Entra k ověření klienta se odešle jenom podepsaný kontrolní výraz. Pokud je klíč uložen v hardwaru (například v modulu TPM nebo HSM) nebo je označen jako neexportovatelný, nelze jej zkopírovat jako textový řetězec tak, jako to lze u tajného klíče klienta.
  • Nepoužívejte Microsoft Entra uživatelský účet jako účet služby.

Autentizuje se uživatelským jménem a heslem Microsoft Entra:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryPassword&user id=<user>@mydomain.com&password=<password>&applicationclientid=<app-id>&encrypt=true&TrustServerCertificate=false

Parametr applicationclientid je pro tento tok vyžadován.

ActiveDirectoryInteractive

Otevře uživateli interaktivní přihlašovací výzvu v prohlížeči. Vhodné pro nástroje místního rozvoje:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryInteractive&user id=<user>@mydomain.com&applicationclientid=<app-id>&encrypt=true&TrustServerCertificate=false

Parametr applicationclientid je pro tento tok vyžadován.

ActiveDirectoryDeviceCode

Zobrazuje kód zařízení, který uživatel zadá na .https://microsoft.com/devicelogin Užitečné pro prostředí bez prohlížeče:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDeviceCode&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzCli

Používá token z přihlášené Azure CLI relace:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzCli&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzureDeveloperCli

Používá token z přihlášené relace Azure Developer CLI (azd)

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzureDeveloperCli&encrypt=true&TrustServerCertificate=false

ActiveDirectoryEnvironment

Čte přihlašovací údaje z proměnných prostředí. Knihovna Azure Identity kontroluje proměnné jako AZURE_TENANT_ID, AZURE_CLIENT_ID, a AZURE_CLIENT_SECRET:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryEnvironment&encrypt=true&TrustServerCertificate=false

ActiveDirectoryWorkloadIdentity

Ověřuje se pomocí federace identit úloh. Použijte tuto metodu v Kubernetes podech s konfigurovanou Azure Workload Identity.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryWorkloadIdentity&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzurePipelines

Autentizuje pomocí připojení služby Azure Pipelines. Zadejte parametry pipeline do připojovací řetězec, nebo nechte ovladač číst chybějící hodnoty z proměnných prostředí Azure Pipelines.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzurePipelines&user id=<client-id>@<tenant-id>&serviceconnectionid=<service-connection-id>&systemtoken=<system-access-token>&encrypt=true&TrustServerCertificate=false

Nastavte parametry podle požadavků ovladače:

Parameter Description
user id ID klienta hlavního servisu, volitelně následované .@tenant-id
serviceconnectionid ID připojení služby z Azure DevOps.
systemtoken Přístupový token systému pipeline ($(System.AccessToken)).

ActiveDirectoryClientAssertion

Autentizuje se pomocí klientské aserce (podepsaného JWT tokenu) místo klientského tajemství. Uveďte podepsaný JWT v parametru clientassertion :

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryClientAssertion&user id=<client-id>@<tenant-id>&clientassertion=<jwt-token>&encrypt=true&TrustServerCertificate=false

ActiveDirectoryOnBehalfOf

Autentizuje pomocí toku On-Behalf-Of (OBO). Ovladač vymění upstream uživatelský token za nový token zaměřený na SQL Server.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryOnBehalfOf&user id=<client-id>@<tenant-id>&password=<client-secret>&userassertion=<user-token>&encrypt=true&TrustServerCertificate=false

Klientská autentizační část může použít password, clientcertpath, nebo clientassertion, ale userassertion je vždy vyžadována.

ActiveDirectoryIntegrated

Podporuje pokročilý workflow s integrovanou autentizací. Tento režim vyžaduje vlastní logiku získávání tokenů prostřednictvím poskytovatele tokenů.

Tento režim používejte pouze na Windows. Na Linuxu a macOS používejte pro autentizační tok vlastního poskytovatele tokenů.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryIntegrated&encrypt=true&TrustServerCertificate=false

Poskytovatel vlastních tokenů

Pokud žádný z vestavěných fedauth typů neodpovídá vašemu scénáři, použijte jedno z těchto API poskytovatelů tokenů, které vám zajistí vlastní logiku získávání tokenů:

Použijte toto API, pokud máte předem získaný přístupový token OAuth2:

import (
    "context"
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewSecurityTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    func(ctx context.Context) (string, error) {
        // Return a pre-acquired OAuth2 access token.
        return myTokenProvider(ctx)
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

NewAccessTokenConnector (zjednodušené API)

Použijte toto API pro jednodušší získávání tokenů bez zpracování kontextu.

import (
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewAccessTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    func() (string, error) {
        // Return a pre-acquired OAuth2 access token.
        return mySimpleTokenProvider()
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

NewActiveDirectoryTokenConnector (Vlastní pracovní postupy ADAL)

Použijte toto API pro vlastní workflow získávání tokenů Azure AD, pokud ani vestavěné fedauth režimy, ani SecurityToken API neodpovídají vaší situaci:

import (
    "context"
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewActiveDirectoryTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    mssql.FedAuthADALWorkflowPassword,
    func(ctx context.Context, serverSPN, stsURL string) (string, error) {
        // Custom ADAL workflow using server-provided SPN and STS URL.
        return myCustomADALFlow(ctx, serverSPN, stsURL)
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

Tento přístup je užitečný, když potřebujete integrovat s vlastním poskytovatelem identity, implementovat cachování tokenů nebo zpracovat typ přihlašovacích údajů, který balíček nepokrývá azuread . Většina aplikací by měla používat NewSecurityTokenConnector s předem získaným tokenem.

Běžné možnosti kvalifikace

Tyto parametry platí pro více typů fedauth:

Parameter Description
applicationclientid ID klientské aplikace. Vyžaduje se pro ActiveDirectoryPassword a ActiveDirectoryInteractive.
clientcertpath Cesta k souboru klientského certifikátu PEM nebo PFX pro instanční objekt služby založený na certifikátu nebo ověřování On-Behalf-Of.
clientassertion Podepsal jsem JWT tvrzení pro ActiveDirectoryClientAssertion nebo On-Behalf-Of autentizaci.
serviceconnectionid ID připojení služby Azure Pipelines.
systemtoken Token systémového přístupu Azure Pipelines
userassertion Upstream uživatelský token pro ActiveDirectoryOnBehalfOf.
tokenfilepath Cesta k souboru tokenu OIDC pro ActiveDirectoryWorkloadIdentity v Kubernetes.
additionallyallowedtenants Čárkami oddělený seznam dalších ID tenantů, která se mají povolit, pokud je vyžadováno víceklientské ověřování.
disableinstancediscovery Nastavte na true pro zakázání objevování instance; použijte pouze pokud ovládáte autoritní URL.
sendcertificatechain Nastavte na hodnotu true, aby se odesílal řetězec certifikátů pro ověřování pomocí certifikátů.