Azure SQL Auditing to storage account behind Virtual Network and firewall now generally available でアナウンスがありましたが、Azure SQL Database の監査ログを、仮想ネットワークとファイアウォールのある背後にあるストレージアカウントに対して出力する機能が GA となりました。
これにより、閉じられたネットワークに対してのアクセスのみを許可しているストレージアカウントに監査ログ (サーバーレベル / DB レベルの監査の両方) の出力ができるようになります。
詳細については VNet とファイアウォールの背後にあるストレージ アカウントに対して監査を書き込む に記載されていますのでこちらを確認すれば問題ないと思いますが、関連する内容をいくつか検証してみようかと。
使用するストレージアカウントの準備
使用するストレージアカウントですが「汎用 v2 (Storage V2)」を使用する必要があると、前提条件に記載されています。
V1 を使用している場合は、ストレージアカウントの「構成」から アップグレード をして、v2 に変更する必要があります。
v2 に変更したら、「ファイアウォールと仮想ネットワーク」から「選択されたネットワーク」を選択し「信頼された Microsoft サービスによるこのストレージアカウントに対するアクセスを許可する」を有効にします。(デフォルトで有効になっているかと)
ブラウザからストレージアカウントのコンテナーの操作を行う場合は、「アドレス範囲」に自 PC からのアクセス IP を登録しておかないと、アクセス許可でエラーが出るかもしれませんので、この辺は利用する操作に応じて設定を行うとよいかと思います。
SQL Database の設定
SQL Database から、閉じられたネットワークからのアクセスのみが許可されているストレージアカウントに監査ログを出力する場合、「Managed Identity (Managed ID : マネージド ID)」(Managed Service Identity) を使用する必要があります。
SQL Database の論理サーバーのデフォルトでは、Managed ID が付与されていませんので、Managed ID を設定する必要があります。
ポータルから監査を設定する場合、選択されたネットワークに配置されているストレージアカウントを選択すると、次のようなダイアログが表示されます。
これが表示された場合「OK」をクリックし、監査の設定を行うことで、SQL Database の論理サーバーに Managed ID が付与されます。
Managed ID については、Cloud Shell 等で次のようなコマンドを実行することで確認できます。
(Get-AzSqlServer -ResourceGroupName <Resource Group Name> -ServerName <Server Name>).Identity
操作しているログインに割り当てられている権限にも依存すると思いますが、サブスクリプションの管理者であれば、監査ログの出力先として指定したストレージアカウントの IAM (アクセス制御) の「ストレージ BLOB データ共同作成者」に、SQL Database の論理サーバーの Managed ID の登録まで行われますので、ポータルの操作だけで完結ができるかと。
REST 等の CUI で設定を行う場合も、最初に Managed ID の付与が必要となります。
手動で Managed ID を有効化する場合は最初に次のようなコマンドを実行し、Managed ID の付与を行うこともできます。
Set-AzSqlServer -ResourceGroupName <Resource Group Name> -ServerName <Server Name> -AssignIdentity
Managed ID については、Azure Active Directory の「エンタープライズ アプリケーション」を「すべてのアプリケーション」を SQL Database の論理サーバー名で検索すると、登録されていることが確認できます。
(オブジェクト ID が、PowerShell で確認をした、PrincipalId と同じアプリケーションが登録されています)
Managed ID を使用して、監査ログを出力するように設定した場合、ストレージアカウントの情報が、SQL Database のデータベーススコープの資格情報 (sys.database_scoped_credentials) に「credential_identity」が「MANAGED IDENTITY」として、登録されていることを確認することができます。
OPEN ROWSET を Managed ID で利用する
それでは、監査以外の機能で Managed ID を使ってみたいと思います。
SQL Database では、Single Database の環境でも OPEN ROWSET を使用することで、ストレージアカウントのファイルのデータにアクセスすることができます。
従来までは Shared Access Signature (SAS) を使用してアクセスを行っていたのですが、Managed ID を使ってアクセスをしてみたいと思います。
data というコンテナーに存在する ImportData.txt を CLOB としてアクセスしてみます。
-- IDENTITY は MANAGED IDENTITY 固定 CREATE DATABASE SCOPED CREDENTIAL MSI_SECURE_STORAGE WITH IDENTITY='MANAGED IDENTITY' GO CREATE EXTERNAL DATA SOURCE AzureBlobStorage WITH ( LOCATION = 'https://<ストレージアカウント>.blob.core.windows.net', CREDENTIAL = MSI_SECURE_STORAGE, TYPE = BLOB_STORAGE ) GO SELECT * FROM OPENROWSET( BULK 'data/ImportData.txt', DATA_SOURCE = 'AzureBlobStorage', SINGLE_CLOB ) AS T GO
EXTERNAL DATA SOURCE で外部データソースを指定してアクセスを行うのですが、この時にはストレージアカウントへの資格情報を設定する必要があります。
この際に指定する資格情報ですが、Managed Identity を指定する必要がありますので「CREATE DATABASE SCOPED CREDENTIAL」の「IDENTITY」は「MANAGED IDENTITY」を固定で設定する必要がありました。
正常に登録が行えていると、ファイアウォールの背後にあるストレージアカウントに対して、SAS を使用せずにManaged ID でアクセスができることが確認できます。
Azure SQL で、Managed ID を使用して、ストレージアカウントに接続する方法としては、ADL Gen2 に対して PolyBase の接続を行う チュートリアル:ニューヨークのタクシー データセットを読み込む で記載されている方法があります。
Synapse Analytics で PolyBase を Managed Identity を使用する場合、資格情報の IDENTITY は「Managed Service Identity」または「MANAGED IDENTITY」の両方を使用することができそうだったのでした。
しかし、SQL Database の OPEN ROWSET については、 MANAGED IDENTITY を IDENTITY として指定しないと次のエラーとなってしまいました。
メッセージ 4861、レベル 16、状態 1、行 19
Cannot bulk load because the file "data/ImportData.txt" could not be opened. Operating system error code 86(The specified network password is not correct.).
Azure のリソースで Managed ID が使用できるものも多くなってきましたので、どういうアクセスができるのかのスキルアップデートも進めないといけないですね。