go-mssqldb を使用した Microsoft Entra ID 認証

go-mssqldbドライバーはazureadパッケージを通じたMicrosoft Entra ID認証をサポートしています。 このパッケージは、Microsoft Entra ID 資格情報のサポートを追加した標準の sqlserver ドライバーをラップする、azuresql という名前の別個のドライバーを登録します。

注意事項

すべての組み込み fedauth 認証方法は、 azuresql ドライバー名( sqlserver名ではなく)を必要とします。 sql.Open("sqlserver", ...)パラメータを持つfedauthを使うと、認証は静かに失敗しますLogin failed for user ''azureadパッケージをインポートし、以下の例のようにazuresqlを使用します。

fedauthフローを選択してください

以下の表を使って、ホスティング環境と認証情報のソースに適したフローを選択してください:

もし…から接続する必要がある場合は まずは... 次の場合に使用...
ローカル開発 ActiveDirectoryDefault Azure CLIやAzure DeveloperのCLI認証情報を、ローカルでサービスプリンシパルやマネージドIDを設定しずに再利用したい場合、
管理されたアイデンティティを持つAzureホストアプリ ActiveDirectoryManagedIdentity 予測可能な本番環境にしたいのが望ましく、チェーンに他のローカル認証情報ソースは含めたくありません。
Azure DevOps の CI/CD パイプライン ActiveDirectoryAzurePipelines あなたのパイプラインはすでにAzureサービス接続を使っており、SYSTEM_ACCESSTOKENを露出させています。
Kubernetes での Azure Workload Identity ActiveDirectoryWorkloadIdentity ポッドに OIDC トークン ファイルが提供され、クライアント シークレットの代わりにワークロード ID を使用したい場合。
秘密または証明書を持つサービスプリンシパル ActiveDirectoryServicePrincipal アプリはアプリ登録として認証され、クライアントのシークレットや証明書を管理します。
すでにアクセストークンがあるツール ActiveDirectoryServicePrincipalAccessToken または カスタムトークンプロバイダー アプリはドライバー外のトークンを取得し、更新します。
上流のウェブAPIからの委託ユーザートークン ActiveDirectoryOnBehalfOf 中間層サービスでは、ユーザートークンをSQLスコープ付きトークンと交換する必要があります。
開発者向けツールまたはインタラクティブユーティリティ ActiveDirectoryInteractiveActiveDirectoryDeviceCodeActiveDirectoryAzCliまたはActiveDirectoryAzureDeveloperCli サインインするユーザーがその場にいる場合、または既存のローカル CLI セッションを再利用する場合。
統合認証要件を処理するWindows専用アプリ ActiveDirectoryIntegrated (上級) 統合シナリオ向けにカスタムトークン取得ロジックを提供します。

もしローカル開発とAzureホスティングで接続文字列を共有しているなら、ActiveDirectoryDefaultが良い出発点になります。 本番環境では、認証情報チェーンの遅延を避けるために ActiveDirectoryManagedIdentity または ActiveDirectoryServicePrincipal を使いましょう。

azureadパッケージをインストールしてください

azureadドライバーを登録するazuresqlサブパッケージをダウンロードしてください:

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

azuresqlドライバーを使ってください

azureadパッケージ(ベースのgo-mssqldbパッケージの代わりに、または追加)をインポートし、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")
    // ...
}

以下の例はすべてAzure SQLを対象としています。 encrypt=true&TrustServerCertificate=falseを接続文字列に残しておき、ドライバーがサーバー証明書を検証します。

Fedauthの認証情報の種類

fedauth接続パラメータを以下のいずれかの値に設定します。 ほとんどのタイプはazidentityパッケージのAzure Identity認証にマッピングされます。 ActiveDirectoryServicePrincipalAccessToken カスタムトークンプロバイダーAPIは、呼び出し元が提供するトークンを使用します。

ActiveDirectoryDefault

azidentity.DefaultAzureCredentialを使用します。以下の認証情報ソースを順番に試します:

  1. 環境変数(AZURE_TENANT_IDAZURE_CLIENT_IDなど)。
  2. Kubernetesのワークロード識別子。
  3. マネージド ID。
  4. Azure CLI の資格情報
  5. Azure Developer CLI の資格情報
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false

このタイプはローカル開発に使うと、Azure CLIの認証情報を自動取得します。 制作時には ActiveDirectoryManagedIdentity または直接 ActiveDirectoryServicePrincipal を使いましょう。 DefaultAzureCredential 最初の接続で各認証情報のソースを歩いて確認するため、本番作業には不要な遅延が生じます。

ActiveDirectoryManagedIdentity

システム割り当てまたはユーザー割り当ての管理IDで認証します。 ユーザー割り当てのアイデンティティについては、 user id パラメータにクライアントIDを入力してください。

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

ユーザー割り当てのアイデンティティの場合:

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

Note

ActiveDirectoryMSIActiveDirectoryManagedIdentity の別名です。

ActiveDirectoryServicePrincipal

クライアントIDとクライアントシークレットでサービスプリンシパル(アプリ登録)として認証します:

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

証明書ベースのサービスプリンシパル認証では、 clientcertpath=<path-to-certificate>password=<certificate-password>を組み合わせて使用してください。

Note

ActiveDirectoryApplicationActiveDirectoryServicePrincipal の別名です。

ActiveDirectoryServicePrincipalAccessToken

アプリケーションが接続文字列で直接渡す、事前に取得したサービス プリンシパルのアクセス トークンを使用します:

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

このフローは、アプリケーションがすでにドライバ外でアクセストークンを取得し更新している場合にのみ使用してください。 ほとんどのサービス間通信のシナリオでは、 ActiveDirectoryServicePrincipal またはカスタムトークンプロバイダーを優先します。

ActiveDirectoryPassword

Important

Microsoft SQL ドライバーでは、ActiveDirectoryPassword 認証オプション (Microsoft Entra ID パスワード認証) は非推奨です。 このリスクの高い認証フローは、必須のMicrosoft Entra多要素認証 (MFA) と互換性がありません。MFA が適用されているテナントでは機能しない可能性があります。 別のMicrosoft Entra認証方法への移行を計画します。

Microsoft Entra IDパスワード認証は、OAuth 2.0 リソース所有者パスワード資格情報 (ROPC) の付与に基づいています。これにより、アプリケーションは自分のパスワードを直接処理してユーザーにサインインできます。

MICROSOFTでは、MFA と互換性がないため、ROPC フローを使用しないことをお勧めします。 ほとんどのシナリオでは、より安全な代替手段が利用でき、推奨されます。 このフローには、アプリケーションに対する高度な信頼が必要であり、他のフローに存在しないリスクが伴います。 このフローは、より安全なフローが実行できない場合にのみ使用します。 Microsoft は、悪意のある攻撃からユーザーを保護するために、この危険度の高い認証フローから離れています。 詳細については、「 Azure の必須多要素認証の計画」を参照してください。

ユーザーがサインイン時に存在する場合は、ActiveDirectoryInteractive 認証または ActiveDirectoryIntegrated 認証を使用して、サインインしているユーザーポリシーと条件付きアクセス ポリシーに監査証跡属性が適用されるようにします。

サービス間の無人シナリオの場合は、Microsoft Entra サービス アカウントのガイダンスに従ってください。

  • アプリケーションがAzureインフラストラクチャで実行されている場合は、ActiveDirectoryMSI (または一部のドライバーでは ActiveDirectoryManagedIdentity) を使用します。 マネージド ID により、シークレットと証明書の保守とローテーションのオーバーヘッドが排除されます。
  • マネージド ID が使用できない場合 (たとえば、アプリケーションはAzure外で実行されます)、ActiveDirectoryServicePrincipal を使用します。 ドライバーでサポートされている場合は、クライアント シークレットよりもクライアント証明書を優先します。 証明書を使用すると、秘密キーはクライアント上にとどまり、署名されたアサーションのみがクライアントを認証するためにMicrosoft Entraに送信されます。 キーがハードウェア (TPM や HSM など) に格納されている場合、または非エクスポートとしてマークされている場合、クライアント シークレットのように文字列としてコピーすることはできません。
  • Microsoft Entra ユーザー アカウントをサービス アカウントとして使用しないでください。

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

このフローには applicationclientid パラメータが必要です。

ActiveDirectoryInteractive

ユーザー向けにブラウザベースのインタラクティブなサインインプロンプトを開きます。 ローカル開発ツールに適しています:

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

このフローには applicationclientid パラメータが必要です。

ActiveDirectoryDeviceCode

https://microsoft.com/devicelogin時にユーザーが入力できるデバイスコードを表示します。 ブラウザがない環境で有用:

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

ActiveDirectoryAzCli

サインイン済みのAzure CLIセッションのトークンを使用します:

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

ActiveDirectoryAzureDeveloperCli

サインインAzure開発者CLI(azd)セッションのトークンを使用します:

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

Active Directory 環境

環境変数から認証情報を読み取る。 Azure Identityライブラリは、AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRETなどの変数を検査します。

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

ActiveDirectoryWorkloadIdentity

ワークロードのアイデンティティフェデレーションを用いて認証します。 このメソッドはAzure Workload Identityを設定したKubernetesポッドで使えます。

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

ActiveDirectoryAzurePipelines

Azure Pipelines サービス接続を使って認証します。 パイプラインパラメータを接続文字列に含めるか、ドライバーに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

ドライバーの要求に応じてパラメータを設定してください:

パラメーター Description
user id サービスプリンシパルクライアントID、オプションで @tenant-idを付けることも可能です。
serviceconnectionid Azure DevOps のサービス接続 ID
systemtoken パイプラインシステムアクセストークン($(System.AccessToken))。

ActiveDirectoryClientAssertion

クライアントシークレットの代わりに、クライアントアサーション(署名済みJWTトークン)を用いて認証します。 clientassertionパラメータに符号付きJWTを提供します。

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

ActiveDirectoryOnBehalfOf

On-Behalf-Of(OBO)フローを使って認証します。 ドライバーは上流のユーザートークンを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

クライアント認証の区間は passwordclientcertpath、または clientassertionを使えますが、常に userassertion が必要です。

ActiveDirectoryIntegrated

高度な統合認証ワークフローをサポートします。 このモードはトークンプロバイダーを介したカスタムトークン取得ロジックを必要とします。

このモードはWindowsでのみ使用してください。 LinuxやmacOSでは、認証フローにカスタムトークンプロバイダーを使いましょう。

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

カスタムトークンプロバイダー

組み込みの fedauth タイプがあなたのシナリオに合わない場合は、以下のトークンプロバイダーAPIのいずれかを使って独自のトークン取得ロジックを提供してください。

事前に取得済みのOAuth2アクセストークンがある場合は、このAPIを使ってください:

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(簡易API)

このAPIを使って、コンテキスト処理なしでトークン取得をより簡単に行えます。

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 (カスタム ADAL ワークフロー)

組み込みのfedauthモードもSecurityToken APIもあなたのシナリオに合わない場合は、カスタムAzure ADトークン取得ワークフローにこのAPIをご利用ください:

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)

この方法は、カスタムアイデンティティプロバイダーとの統合、トークンキャッシュの実装、または azuread パッケージでカバーされていない認証情報タイプの処理が必要な場合に役立ちます。 ほとんどのアプリケーションは、事前に取得済みのトークンで NewSecurityTokenConnector を使うべきです。

一般的な資格取得オプション

これらのパラメータは複数のFedAuthタイプに適用されます:

パラメーター Description
applicationclientid クライアントアプリケーションID。 ActiveDirectoryPasswordActiveDirectoryInteractiveに必須です。
clientcertpath 証明書ベースのサービスプリンシパルまたはOn-Behalf-Of 認証のためのPEMまたはPFXクライアント証明書ファイルへのパス。
clientassertion ActiveDirectoryClientAssertion または On-Behalf-Of 認証用の署名付き JWT アサーション
serviceconnectionid Azure Pipelines のサービス接続 ID。
systemtoken Azure Pipelines システム アクセス トークン
userassertion ActiveDirectoryOnBehalfOfのアップストリームユーザートークン。
tokenfilepath Kubernetesの ActiveDirectoryWorkloadIdentity のOIDCトークンファイルへのパス。
additionallyallowedtenants マルチテナント認証が必要な場合に許可するための追加のテナントIDをカンマ区切ってリスト。
disableinstancediscovery インスタンスの検出を無効にするために true に設定してください。権限URLを管理している場合にのみ使用してください。
sendcertificatechain trueに設定して証明書ベースの認証チェーンを送信します。