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スコープ付きトークンと交換する必要があります。 |
| 開発者向けツールまたはインタラクティブユーティリティ |
ActiveDirectoryInteractive、ActiveDirectoryDeviceCode、ActiveDirectoryAzCliまたは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を使用します。以下の認証情報ソースを順番に試します:
- 環境変数(
AZURE_TENANT_ID、AZURE_CLIENT_IDなど)。 - Kubernetesのワークロード識別子。
- マネージド ID。
- Azure CLI の資格情報
- 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
ActiveDirectoryMSI は ActiveDirectoryManagedIdentity の別名です。
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
ActiveDirectoryApplication は ActiveDirectoryServicePrincipal の別名です。
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_ID、AZURE_CLIENT_ID、AZURE_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
クライアント認証の区間は password、 clientcertpath、または clientassertionを使えますが、常に userassertion が必要です。
ActiveDirectoryIntegrated
高度な統合認証ワークフローをサポートします。 このモードはトークンプロバイダーを介したカスタムトークン取得ロジックを必要とします。
このモードはWindowsでのみ使用してください。 LinuxやmacOSでは、認証フローにカスタムトークンプロバイダーを使いましょう。
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryIntegrated&encrypt=true&TrustServerCertificate=false
カスタムトークンプロバイダー
組み込みの fedauth タイプがあなたのシナリオに合わない場合は、以下のトークンプロバイダーAPIのいずれかを使って独自のトークン取得ロジックを提供してください。
NewSecurityTokenConnector(推奨)
事前に取得済みの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。
ActiveDirectoryPasswordとActiveDirectoryInteractiveに必須です。 |
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に設定して証明書ベースの認証チェーンを送信します。 |