Azure Synapse Analytics でサーバーレス SQL プールのストレージ アカウント アクセスを制御する

サーバーレス SQL プールのクエリは、Azure Storage から直接ファイルを読み取ります。 Azure Storage 上のファイルへのアクセス許可は次の 2 つのレベルで制御されます。

  • ストレージ レベル - ユーザーには、基になるストレージ ファイルにアクセスするためのアクセス許可が必要です。 ストレージの管理者は、Microsoft Entra プリンシパルにファイルの読み取り/書き込みを許可するか、ストレージへのアクセスに使用される Shared Access Signature (SAS) キーを生成する必要があります。
  • SQL サービスレベル - ユーザーには、外部テーブル を使用してデータを読み取るか、OPENROWSET 関数を実行するためのアクセス許可が必要です。 このセクションでの必要なアクセス許可については、こちらを参照してください。

この記事では、使用できる資格情報の種類と、SQL および Microsoft Entra のユーザーに対して資格情報の参照がどのように実行されるかについて説明します。

ストレージのアクセス許可

Synapse Analytics ワークスペースのサーバーレス SQL プールでは、Azure Data Lake ストレージに格納されているファイルの内容を読み取ることができます。 SQL クエリを実行するユーザーがファイルを読み取ることができるようにするには、ストレージに対するアクセス許可を構成する必要があります。 ファイルへのアクセスを有効にするには、次の 3 つの方法があります。

  • ロールベースのアクセス制御 (RBAC) を使用すると、ストレージが配置されているテナント内の一部の Microsoft Entra ユーザーにロールを割り当てることができます。 閲覧者は、ストレージ アカウントのストレージ BLOB データ閲覧者、ストレージ BLOB データ共同作成者、またはストレージ BLOB データ所有者ロールのメンバーである必要があります。 Azure ストレージにデータを書き込むユーザーは、ストレージ BLOB データ共同作成者またはストレージ BLOB データ所有者ロールのメンバーである必要があります。 ストレージ所有者ロールは、ユーザーがストレージ データ所有者でもあることを意味しません。
  • アクセス制御リスト (ACL) を使用すると、Azure Storage 内のファイルとディレクトリに対してきめ細かな読み取り (R)、書き込み (W)、実行 (X) アクセス許可を定義できます。 ACL は Microsoft Entra ユーザーに割り当てることができます。 閲覧者が Azure Storage のパスにあるファイルを読み取る場合は、ファイル パス内のすべてのフォルダーに対する実行 (X) ACL と、ファイルに対する読み取り (R) ACL を保持している必要があります。 ストレージ レイヤーで ACL アクセス許可を設定する方法をご確認ください
  • Shared Access Signature (SAS) を使用すると、閲覧者は、時間制限付きのトークンを使用して Azure Data Lake ストレージ上のファイルにアクセスできます。 閲覧者は、Microsoft Entra ユーザーとして認証する必要さえありません。 SAS トークンには、閲覧者に付与されたアクセス許可と、トークンが有効である期間が含まれています。 SAS トークンは、同じ Microsoft Entra テナントに属している必要さえない任意のユーザーに対して時間制限付きアクセスを許可する場合に適しています。 SAS トークンは、ストレージ アカウントまたは特定のディレクトリに対して定義できます。 Shared Access Signature を使用して Azure Storage リソースへの制限付きアクセスを許可する方法の詳細をご確認ください。

別の方法として、匿名アクセスを許可することで、ファイルを公開することもできます。 非公開のデータがある場合は、この方法を使用しないでください。

サポートされているストレージ承認の種類

サーバーレス SQL プールにログインしたユーザーには、Azure Storage 内のファイルにアクセスしてクエリを実行する権限が必要です (ファイルが一般公開されていない場合)。 非パブリック ストレージにアクセスするには次の 4 種類の認可を使用できます: ユーザー IDShared Access Signatureサービス プリンシパルマネージド ID

Note

Microsoft Entra パススルーは、ワークスペースを作成するときの既定の動作です。

ユーザー ID ("Microsoft Entra パススルー" とも呼ばれる) は、サーバーレス SQL プールにログインしている Microsoft Entra ユーザーの ID がデータ アクセスの承認に使用される承認の種類です。 データにアクセスする前に、Azure Storage の管理者が Microsoft Entra ユーザーにアクセス許可を付与する必要があります。 データベース ユーザーに対してサポートされている認可の種類に関する表に示されているように、これは SQL ユーザー タイプに対してはサポートされていません。

重要

Microsoft Entra 認証トークンは、クライアント アプリケーションによってキャッシュされる場合があります。 たとえば、Power BI では Microsoft Entra トークンをキャッシュし、同じトークンを 1 時間にわたって再利用します。 実行時間の長いクエリは、クエリ実行の途中でトークンの有効期限が切れると、失敗する可能性があります。 クエリの途中で Microsoft Entra アクセス トークンの有効期限が切れたことによってクエリ エラーが発生している場合は、サービス プリンシパルマネージド ID または Shared Access Signature に切り替えることを検討してください。

ID を使用してデータにアクセスするには、ストレージ BLOB データ所有者、ストレージ BLOB データ共同作成者、またはストレージ BLOB データ閲覧者ロールのメンバーである必要があります。 または、細かい設定が可能な ACL 規則を指定して、ファイルやフォルダーにアクセスすることもできます。 ストレージ アカウントの所有者であっても、Storage Blob データのいずれかのロールに自分自身を追加する必要があります。 Azure Data Lake Store Gen2 でのアクセス制御の詳細については、「Azure Data Lake Storage Gen2 のアクセス制御」という記事をご覧ください。

テナント間のシナリオ

Azure Storage が Synapse サーバーレス SQL プールとは異なるテナントにある場合、サービス プリンシパルによる認可が推奨される方法です。 SAS 認可も可能ですが、マネージド ID はサポートされていません。

承認の種類 ファイアウォールで保護されたストレージ ファイアウォール以外で保護されたストレージ
SAS サポートされています サポートされています
サービス プリンシパル サポートされていません サポートされています

Note

Azure Storage が Azure Storage ファイアウォールで保護されている場合、サービス プリンシパルはサポートされません。

データベース ユーザーに対してサポートされている認可の種類

次の表に、Azure Synapse Analytics サーバーレス SQL エンドポイントへのさまざまなサインイン方法に対して使用できる Azure Storage 認可の種類を示します。

承認の種類 SQL ユーザー Microsoft Entra ユーザー サービス プリンシパル
ユーザー ID サポートされていません サポートされています サポートされています
SAS サポートされています サポートされています サポートされています
サービス プリンシパル サポートされています サポートされています サポートされています
Managed Identity サポートされています サポートされています サポートされています

サポートされているストレージと承認の種類

次の組み合わせの認可の種類と Azure Storage の種類を使用できます。

承認の種類 Blob Storage ADLS Gen1 ADLS Gen2
SAS サポートされています サポートされていません サポートされています
サービス プリンシパル サポートされています サポートされています サポートされています
Managed Identity サポートされています サポートされています サポートされています
ユーザー ID サポートされています サポートされています サポートされています

テナント間のシナリオ

Azure Storage が Azure Synapse Analytics サーバーレス SQL プールとは異なるテナントにある場合、サービス プリンシパルによる認可が推奨される方法です。 Shared Access Signature による認可も可能です。 マネージド サービス ID はサポートされていません。

承認の種類 ファイアウォールで保護されたストレージ ファイアウォール以外で保護されたストレージ
SAS サポートされています サポートされています
サービス プリンシパル サポートされていません サポートされています

Note

Azure Storage が Azure Storage ファイアウォールで保護されており、別のテナントにある場合は、サービス プリンシパルはサポートされません。 代わりに、Shared Access Signature (SAS) を使用します。

ファイアウォールで保護されたストレージ

リソース インスタンス ルールを作成することによって、特定のサーバーレス SQL プールへのアクセスを許可するようにストレージ アカウントを構成できます。 ファイアウォールで保護されているストレージにアクセスする場合は、ユーザー ID またはマネージド ID を使用します。

注意

Azure Storage 上のファイアウォール機能はパブリック プレビュー段階であり、すべてのパブリック クラウド リージョンで使用できます。

次の表に、Azure Synapse Analytics サーバーレス SQL エンドポイントへのさまざまなサインイン方法に対して使用できるファイアウォールで保護された Azure Storage 認可の種類を示します。

承認の種類 SQL ユーザー Microsoft Entra ユーザー サービス プリンシパル
ユーザー ID サポートされていません サポートされています サポートされています
SAS サポートされていません サポートされていません サポートされていません
サービス プリンシパル サポートされていません サポートされていません サポートされていません
Managed Identity サポートされています サポートされています サポートされています

ファイアウォールで保護されているストレージにユーザー ID を使用してアクセスするには、Azure portal または Az.Storage PowerShell モジュールを使用します。

Azure portal を使用した Azure Storage ファイアウォールの構成

  1. Azure portal で、お使いのストレージ アカウントを検索します。
  2. メイン ナビゲーション メニューで、[設定][ネットワーク] に移動します。
  3. [リソース インスタンス] セクションで、Azure Synapse ワークスペースの例外を追加します。
  4. リソースの種類として Microsoft.Synapse/workspaces を選択します。
  5. ワークスペースの名前をインスタンス名にします。
  6. [保存] を選択します。

PowerShell を使用した Azure Storage ファイアウォールの構成

以下の手順に従って、ストレージ アカウントを構成し、Azure Synapse ワークスペースの例外を追加します。

  1. Powershell を開くか PowerShell をインストールします。

  2. たとえば次のスクリプトのように、Az.Storage モジュールと Az.Synapse モジュールの最新バージョンをインストールします。

    Install-Module -Name Az.Storage -RequiredVersion 3.4.0
    Install-Module -Name Az.Synapse -RequiredVersion 0.7.0
    

    重要

    バージョン 3.4.0 以上を使用していることを確認してください。 次のコマンドを実行して、Az.Storage のバージョンを確認できます。

    Get-Module -ListAvailable -Name Az.Storage | Select Version
    
  3. Azure テナントに接続します

    Connect-AzAccount
    
  4. PowerShell で変数を定義します

    • リソース グループ名 - これは、Azure portal のストレージ アカウントの [概要] で確認できます。
    • アカウント名 - ファイアウォール規則によって保護されているストレージ アカウントの名前。
    • テナント ID - これは、Azure portal の Microsoft Entra ID[プロパティ] の下にある [テナントのプロパティ] で確認できます。
    • ワークスペース名 - Azure Synapse ワークスペースの名前。
        $resourceGroupName = "<resource group name>"
        $accountName = "<storage account name>"
        $tenantId = "<tenant id>"
        $workspaceName = "<Azure Synapse workspace name>"
    
        $workspace = Get-AzSynapseWorkspace -Name $workspaceName
        $resourceId = $workspace.Id
        $index = $resourceId.IndexOf("/resourceGroups/", 0)
        # Replace G with g - /resourceGroups/ to /resourcegroups/
        $resourceId = $resourceId.Substring(0,$index) + "/resourcegroups/" ` 
            + $resourceId.Substring($index + "/resourceGroups/".Length)
    
        $resourceId
    

    重要

    PowerShell スクリプトによって返される $resourceid の値は、このテンプレートと一致する必要があります。/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Synapse/workspaces/{name-of-workspace}resourcegroups を小文字で記述することが重要です。

  5. 次のように Azure ストレージ アカウントのネットワーク規則を追加します。

        $parameters = @{
            ResourceGroupName = $resourceGroupName
            Name = $accountName
            TenantId = $tenantId 
            ResourceId = $resourceId
        }
    
        Add-AzStorageAccountNetworkRule @parameters
    
  6. ストレージ アカウント ファイアウォールでストレージ アカウントのネットワーク規則が適用されたことを確認します。 次の PowerShell スクリプトでは、前の手順の $resourceid 変数をストレージ アカウントのネットワーク規則の出力と比較します。

        $parameters = @{
            ResourceGroupName = $resourceGroupName
            Name = $accountName
        }
    
        $rule = Get-AzStorageAccountNetworkRuleSet @parameters
        $rule.ResourceAccessRules | ForEach-Object { 
            if ($_.ResourceId -cmatch "\/subscriptions\/(\w\-*)+\/resourcegroups\/(.)+") { 
                Write-Host "Storage account network rule is successfully configured." -ForegroundColor Green
                $rule.ResourceAccessRules
            } else {
                Write-Host "Storage account network rule is not configured correctly. Remove this rule and follow the steps in detail." -ForegroundColor Red
                $rule.ResourceAccessRules
            }
        }
    

資格情報

Azure Storage にあるファイルに対してクエリを実行するには、サーバーレス SQL プール エンドポイントに、認証情報を含む資格情報が必要です。 2 種類の資格情報が使用されます。

  • サーバーレベル資格情報は、OPENROWSET 関数を使用して実行されるアドホック クエリに使用されます。 資格情報の "名前" はストレージ URL と一致する必要があります。
  • データベース スコープの資格情報は、外部テーブルに使用されます。 外部テーブルは、ストレージへのアクセスに使用する必要がある資格情報を使用して DATA SOURCE を参照します。

資格情報を管理するための権限を付与する

資格情報の管理機能を付与するには:

  • ユーザーがサーバーレベルの資格情報を作成または削除できるようにするには、管理者がマスター データベースでのログインに対して ALTER ANY CREDENTIAL 権限を付与する必要があります。 次に例を示します。

    GRANT ALTER ANY CREDENTIAL TO [login_name];
    
  • ユーザーがデータベース スコープの資格情報を作成または削除できるようにするには、管理者がユーザー データベース内のデータベース ユーザーに対してデータベースの CONTROL 権限を付与する必要があります。 次に例を示します。

    GRANT CONTROL ON DATABASE::[database_name] TO [user_name];
    

資格情報を使用するためのアクセス許可を付与する

外部ストレージにアクセスするデータベース ユーザーは、資格情報を使用するアクセス許可を持つ必要があります。 資格情報を使用するには、ユーザーは特定の資格情報に対する REFERENCES 権限を持っている必要があります。

ログインに対してサーバーレベルの資格情報に対する REFERENCES 権限を付与するには、マスター データベース内の次の T-SQL クエリを使用します。

GRANT REFERENCES ON CREDENTIAL::[server-level_credential] TO [login_name];

データベース ユーザーに対してデータベーススコープの資格情報に対する REFERENCES 権限を付与するには、ユーザー データベース内の次の T-SQL クエリを使用します。

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[database-scoped_credential] TO [user_name];

サーバーレベルの資格情報

サーバーレベルの資格情報が使用されるのは、SQL ログインがストレージ アカウント上のファイルを読み取るための DATA_SOURCE を指定せずに OPENROWSET 関数を呼び出すときです。

サーバーレベルの資格情報の名前は、Azure ストレージのベース URL と一致している必要があります (必要に応じてコンテナー名が続きます)。 資格情報を追加するには、CREATE CREDENTIAL を実行します。 CREDENTIAL NAME 引数を指定する必要があります。

注意

引数 FOR CRYPTOGRAPHIC PROVIDER はサポートされていません。

サーバーレベルの CREDENTIAL 名は次の形式に合わせる必要があります: <prefix>://<storage_account_path>[/<container_name>]。 ストレージ アカウント パスについては、次の表で説明します。

外部データ ソース Prefix ストレージ アカウント パス
Azure Blob Storage https <storage_account>.blob.core.windows.net
Azure Data Lake Storage Gen1 https <storage_account>.azuredatalakestore.net/webhdfs/v1
Azure Data Lake Storage Gen2 https <storage_account>.dfs.core.windows.net

その後にサーバーレベルの資格情報は、次の認証の種類を使用して Azure ストレージにアクセスできるようになります。

Microsoft Entra ユーザーは、ストレージ BLOB データ所有者、ストレージ BLOB データ共同作成者、またはストレージ BLOB データ閲覧者ロールのメンバーである場合、Azure Storage 上の任意のファイルにアクセスできます。 Microsoft Entra ユーザーは、ストレージにアクセスするために資格情報は必要ありません。

SQL で認証されたユーザーは、Microsoft Entra 認証を使用してストレージにアクセスすることはできません。 これらのユーザーは、マネージド ID、SAS キー、サービス プリンシパルを使用するか、ストレージへのパブリック アクセスがある場合は、データベース資格情報を使用してストレージにアクセスできます。

データベーススコープ資格情報

データベーススコープ資格情報が使用されるのは、任意のプリンシパルが DATA_SOURCE を指定した OPENROWSET 関数を呼び出すとき、または公開ファイルにアクセスしない外部テーブルのデータを選択するときです。 データベース スコープ資格情報は、ストレージ アカウントの名前と一致する必要はなく、これはストレージの場所を定義する DATA SOURCE で参照されます。

データベーススコープ資格情報は、次の認証の種類を使用して Azure Storage にアクセスできるようにします。

Microsoft Entra ユーザーは、ストレージ BLOB データ所有者、ストレージ BLOB データ共同作成者、またはストレージ BLOB データ閲覧者ロールのメンバーである場合、Azure Storage 上の任意のファイルにアクセスできます。 Microsoft Entra ユーザーは、ストレージにアクセスするために資格情報は必要ありません。

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
)

SQL で認証されたユーザーは、Microsoft Entra 認証を使用してストレージにアクセスすることはできません。 これらのユーザーは、マネージド ID、SAS キー、サービス プリンシパルを使用するか、ストレージへのパブリック アクセスがある場合は、データベース資格情報を使用してストレージにアクセスできます。

データベーススコープ資格情報は、外部データ ソースで使用され、そのストレージへのアクセスに使用される認証方法を指定します。

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
          CREDENTIAL = <name of database scoped credential> 
)

一般公開されているデータ ソースにアクセスする

次のスクリプトを使用して、一般公開されているデータ ソースにアクセスするテーブルを作成します。

CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat]
       WITH ( FORMAT_TYPE = PARQUET)
GO
CREATE EXTERNAL DATA SOURCE publicData
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<public_container>/<path>' )
GO

CREATE EXTERNAL TABLE dbo.userPublicData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
       DATA_SOURCE = [publicData],
       FILE_FORMAT = [SynapseParquetFormat] )

データベース ユーザーは、データ ソースを参照する外部テーブルまたは OPENROWSET 関数を使用して、データ ソースからファイルの内容を読み取ることができます。

SELECT TOP 10 * FROM dbo.userPublicData;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet',
                                DATA_SOURCE = 'mysample',
                                FORMAT='PARQUET') as rows;
GO

資格情報を使用してデータ ソースにアクセスする

次のスクリプトを変更して、SAS トークン、ユーザーの Microsoft Entra ID、またはワークスペースのマネージド ID を使用して Azure Storage にアクセスする外部テーブルを作成します。

-- Create master key in databases with some password (one-off per database)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>'
GO

-- Create databases scoped credential that use Managed Identity, SAS token or service principal. User needs to create only database-scoped credentials that should be used to access data source:

CREATE DATABASE SCOPED CREDENTIAL WorkspaceIdentity
WITH IDENTITY = 'Managed Identity'
GO
CREATE DATABASE SCOPED CREDENTIAL SasCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=2019-10-1********ZVsTOL0ltEGhf54N8KhDCRfLRI%3D'
GO
CREATE DATABASE SCOPED CREDENTIAL SPNCredential WITH
IDENTITY = '**44e*****8f6-ag44-1890-34u4-22r23r771098@https://login.microsoftonline.com/**do99dd-87f3-33da-33gf-3d3rh133ee33/oauth2/token' 
, SECRET = '.7OaaU_454azar9WWzLL.Ea9ePPZWzQee~'
GO
-- Create data source that one of the credentials above, external file format, and external tables that reference this data source and file format:

CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] WITH ( FORMAT_TYPE = PARQUET)
GO

CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
-- Uncomment one of these options depending on authentication method that you want to use to access data source:
--,CREDENTIAL = WorkspaceIdentity 
--,CREDENTIAL = SasCredential 
--,CREDENTIAL = SPNCredential
)

CREATE EXTERNAL TABLE dbo.userData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
       DATA_SOURCE = [mysample],
       FILE_FORMAT = [SynapseParquetFormat] );

データベース ユーザーは、データ ソースを参照する外部テーブルまたは OPENROWSET 関数を使用して、データ ソースからファイルの内容を読み取ることができます。

SELECT TOP 10 * FROM dbo.userdata;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet', DATA_SOURCE = 'mysample', FORMAT='PARQUET') as rows;
GO

次のステップ

以下の記事は、さまざまなフォルダーの種類やファイルの種類に対してクエリを実行し、ビューを作成して使用する方法を確認するのに役立ちます。