SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Active Directory を利用した SQL Database v12 への接続

3 comments

Preview: Azure AD authentication で紹介されていますが、SQL Database の接続時の認証に、Azure Active Directory (Azure AD) のユーザーが使用できるようになりました。

詳細については Connecting to SQL Database By Using Azure Active Directory AuthenticationAzure Active Directory Authentication – troubleshooting potential connectivity issues で解説されていますので、そちらを見ていただければと思います。

ざっと触ってみたので軽くまとめてみようかと。

Azure AD を使用した認証ができるのは SQL Databas v12 となり、v11 では使用することはできないようです。

■Azure AD に接続するための認証

以前投降した、SQL Server 2016 CTP 2.1 の SSMS の認証方式の追加についてのメモ で触れていたのですが、Azure AD のユーザーを使用した認証は、SQL Server 2016 の SSMS で使用することのできる、

  • Active Directory 統合認証 (Active Directory Integrated Authentication)
  • Active Directory パスワード認証 (Active Directory Password Authentication)

の 2 種類の認証方式を使用して実施することができます。

接続を行うためには、

  • ADO .NET 4.6
  • ADALSQL

が必要になりますので、すべての環境で使用できるというわけではないようです。

.NET Framework 4.6 では、 SqlAuthenticationMethod Enumeration が追加されており、認証方式として、「ActiveDirectoryIntegrated」「ActiveDirectoryPassword」が使用できるようになっています。

また、.NET Framework 4.6 だけでなく、ADASQL が必要となりますので、Microsoft SQL Server 用の Microsoft Active Directory 認証ライブラリ をインストールする必要があります。

SQL Server 2016 の SSMS をインストールした環境では ADASQL も導入されていますので、SSMS をインストールしていない環境では、個別に SQL Server 用の Active Directory Authentication Library (ADAL) をインストールする必要があります。

実行環境としては上記が整って入れば接続することが可能です。

 

■Azure 側の作業

Azure AD を使用した認証を行うためには、Azure 側でいくつかの作業をする必要があります。

SQL Database の認証に使用できる Azure AD ですが、SQL Database のサーバーが含まれているサブスクリプションで使用されているディレクトリになります。

 

サブスクリプションでどのディレクトリが使用されているかはクラシックポータルの「設定」→「サブスクリプション」の「ディレクトリ」から確認することができます。

新規に Azure AD を作成した場合などは、「ディレクトリの編集」で対応する Azure AD を切り替えることもできるようですね。今回初めて使用しました。

image

サブスクリプションで使用する Azure AD が確認できたら Azure ポータルから、対象の SQL Database のサーバーを開き、「すべての設定」→「Active Drectory admin (プレビュー)」から、プレビュー機能を有効にします。

Azure AD で認証を行うためには、最初に、このブレードの「Aztive Directory admin」から、SQL Database で Azure AD による認証の設定を行うための管理者ユーザーまたはグループを選択します。
image

管理者は一つしか設定ができないようですので、グループを登録しておくと楽かと思います。
登録できるユーザー / グループは Azure AD に登録されているユーザー / グループになります。
Azure AD のユーザー / グループの追加はクラシックポータルから実施できますので、SQL Database に管理者権限で接続が可能な Azure AD の資格情報を作成して設定を行います。
# クラシックポータルから作成したユーザーは、一時パスワードで作成されますので、一度そのユーザーでポータルにログインし、パスワードを変更することをお忘れなく。

今回は Azure AD に「SQLAdmin」というグループを用意し、その中に「sqladmin@~.onmicrosoft.com」というユーザーを追加することで、このユーザーを管理者として設定しています。
管理者として、Microsoft アカウントを追加することはできないようでした。
image

管理者を追加すると SQL Database の「master」データベースのユーザーとしても自動的に追加されるようです。
image

SQL Database の資格情報については「sys.database_principals」から確認することができるのですが、Azure AD の情報については「EXTERNAL_GROUP」「EXTERNAL_USER」として管理がされているようですね。

 

■Azure AD のユーザーを SQL Database のユーザーとして追加

これで、Azure AD 側の準備は済みましたので、SQL Database のユーザーとして Azure AD のユーザーを追加してみたいと思います。

Azure AD のユーザーを追加する場合、「ポータルで管理者として設定した Azure AD のユーザー」で SQL Database に対して接続をする必要があります。

通常の SQL 認証用のログインで接続をして Azure AD のユーザーを追加しようとすると以下のようなエラーとなり、追加することができません。

image

Azure AD のユーザーを追加する場合には、Azure AD のユーザーでログインしてユーザーを追加する必要がありますので、SQL Server 2016 の SSMS で 「Active Directory パスワード認証」で SQL Database にログインします。
image

これで、Azure AD のユーザーを追加する準備は完了です。
ユーザーの作成を「FROM EXTERNAL PROVIDER」を指定して実行すれば、Azure AD のユーザーを SQL Database の認証ユーザーとして追加することができます。
# ここでも Microsoft アカウントは登録できませんので、「Microsoft Azure Acitve Directory」か「ローカル Active Directory」の情報を指定する必要があります。

あとは追加したユーザーで「Active Directory パスワード認証」を選択して接続すれば、Azure AD の情報で認証をすることができます。
# 特定の DB にのみユーザーを追加した場合は、接続先の DB の指定をお忘れなく。master にユーザーを追加した場合は、DB の指定をしなくても接続可能です。

コードから接続する場合は以下のような感じでしょうか。

$constring = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder

$constring.psbase.DataSource = "hogehoge.database.windows.net"
$constring.psbase.Authentication = [System.Data.SqlClient.SqlAuthenticationMethod]::ActiveDirectoryPassword
$constring.psbase.UserID = "sqluser@hogehoge.onmicrosoft.com"
$constring.psbase.Password = "hogehoge"

$constring.psbase.InitialCatalog = "SampleDB"

$con = New-Object -TypeName System.Data.SqlClient.SqlConnection
$con.ConnectionString = $constring
$con.open()
$cmd = $con.CreateCommand()
$cmd.CommandText ="SELECT @@version, SUSER_NAME()"
$ret = $cmd.ExecuteReader()
$ret.Read() > $null

"{0}`r`n{1}" -f $ret[0],$ret[1]

$con.Clone() > $null
$con.Dispose()

 

Azure AD の情報で接続をした場合は、SUSER_NAME の情報も以下のように Azure AD のユーザー情報となっています。

image

 

■Active Directory 統合認証で接続する

ここまでは「Active Directory パスワード認証 」による接続を使用してきました。

Azure AD を利用した接続としては「Active Directory 統合認証」も使用することができます。

この認証方法ですが、

  • オンプレミスのドメインに参加している状態でドメインユーザーを使用して、SQL Database に SSO で接続する

というようなイメージになるかと。

認証としては以下の図のようになります。

 

「Federated Domain」と書いてあるように、オンプレミスの AD をフェデレーションドメインとして設定し、認証を行う形になります。

ということで、AD FS の環境を用意する必要があります。

基本的な作業としては、オンプレミスの環境に AD FS/AD FS Proxy を Azure の仮想マシン上に構築してみる の 「AD FS を構築」の内容を実施することになるかと。

今回は、AD DS / ディレクトリ同期 / AD FS を一台の環境上に構築し、その環境に Windows 10 を参加させて、ドメインユーザーで Windows 10 にログインして「Active Directory 統合認証」による接続を実施してみましたが、正常に接続できました。

検証環境を作成する流れとしては、

  1. AD DS をインストールし、ドメインコントローラーを構築
  2. Microsoft Azure Active Directory Connect を使用して、ディレクトリ同期を設定

    # Azure AD Connect については、カリスマトレーナーの Azure AD Connectを利用したOffice 365 × ADFS設定  がとても参考になります。

  3. AD CS をインストールして AD FS で使用する証明書を作成
  4. 作成した証明書を使用して AD FS を構築
  5. DNS に AD FS を解決できるレコードを登録
  6. AD FS で 以下の PowerShell を実行

    Enable-AdfsEndpoint -TargetAddressPath "/adfs/services/trust/13/windowstransport"
    Restart-Service adfssrv
    
  7. ドメインにクライアントを参加しドメインユーザーでログイン
  8. AD FS で使用している証明書をクライアントに追加

という形になるかと。

windowstransport を有効にしていないと、Active Directory 統合認証で接続をしようとした場合に、

Could not discover endpoint for Integrate Windows Authentication. Check your ADFS settings. It should support Integrate Widows Authentication for WS-Trust 1.3."

というようなエラーが出て接続をすることができません。

# Office 2013 with ADAL not working with Single Sign-On と同じ状態となります。

クライアントから Azure のポータルにアクセスをし、フェデレーションアカウント (オンプレミスの AD のアカウント情報) でポータルにログインができる環境が整っていれば、Active Directory 統合認証によるログインが可能です。

以下は、SSMS でログインした画面になりますが、「ドメイン名\ユーザー名」でログインできていることが確認できますね。

image

コードから接続する場合は以下のような形になるかと。

$constring = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder

$constring.psbase.DataSource = "hogehoge.database.windows.net"
$constring.psbase.Authentication = [System.Data.SqlClient.SqlAuthenticationMethod]::ActiveDirectoryIntegrated
$constring.psbase.InitialCatalog = "SampleDB"

$con = New-Object -TypeName System.Data.SqlClient.SqlConnection
$con.ConnectionString = $constring
$con.open()
$cmd = $con.CreateCommand()
$cmd.CommandText ="SELECT @@version, SUSER_NAME()"
$ret = $cmd.ExecuteReader()
$ret.Read() > $null

"{0}`r`n{1}" -f $ret[0],$ret[1]

$con.Clone() > $null
$con.Dispose()

 

認証されたユーザーをクエリで取得した場合は、以下のように、UPN となるようですね。

image

klist コマンドの実行結果からも SQL Database の接続時に AD FS にアクセスしチケットを取得したことが確認できるかと。

image

 

ざっくりとですが SQL Database に追加された新しい認証方法を試してみました。

Share

Written by Masayuki.Ozawa

9月 18th, 2015 at 11:12 pm

3 Responses to 'Azure Active Directory を利用した SQL Database v12 への接続'

Subscribe to comments with RSS or TrackBack to 'Azure Active Directory を利用した SQL Database v12 への接続'.

  1. […] Azure Active Directory を利用した SQL Database v12 への接続 […]

  2. […] Azure AD認証 […]

  3. […] Azure Active Directory を利用した SQL Database v12 への接続 […]

Leave a Reply