Azure Synapse Analytics에서 서버리스 SQL 풀에 대한 스토리지 계정 액세스 제어

서버리스 SQL 풀 쿼리는 Azure Storage에서 직접 파일을 읽습니다. Azure Storage의 파일에 액세스할 수 있는 권한은 두 가지 수준으로 제어됩니다.

  • 스토리지 수준 - 사용자에게 기본 스토리지 파일에 액세스할 수 있는 권한이 있어야 합니다. 스토리지 관리자는 Microsoft Entra 주체가 파일을 읽고 쓸 수 있도록 허용하거나 스토리지에 액세스하는 데 사용할 SAS(공유 액세스 서명) 키를 생성해야 합니다.
  • SQL 서비스 수준 - 사용자는 외부 테이블을 사용하여 데이터를 읽거나 OPENROWSET 함수를 실행할 수 있는 권한을 부여해야 합니다. 이 섹션에서 필요한 권한에 대해 자세히 알아보세요.

이 문서에서는 사용할 수 있는 자격 증명 형식과 SQL 및 Microsoft Entra 사용자에 대해 자격 증명 조회가 실행되는 방법에 대해 설명합니다.

스토리지 권한

Synapse Analytics 작업 영역의 서버리스 SQL 풀은 Azure Data Lake 스토리지에 저장된 파일의 내용을 읽을 수 있습니다. SQL 쿼리를 실행하는 사용자가 파일을 읽을 수 있도록 하려면 스토리지에 대한 사용 권한을 구성해야 합니다. 파일에 대한 액세스를 허용하는 방법에는 세 가지가 있습니다.

  • RBAC(역할 기반 액세스 제어)를 사용하면 스토리지가 배치된 테넌트의 일부 Microsoft Entra 사용자에게 역할을 할당할 수 있습니다. 읽는 사용자는 스토리지 계정에 대한 Storage Blob 데이터 읽기 권한자, Storage Blob 데이터 기여자 또는 Storage Blob 데이터 소유자 역할의 멤버여야 합니다. Azure Storage에 데이터를 쓰는 사용자는 Storage Blob 데이터 기여자 또는 Storage Blob 데이터 소유자 역할의 멤버여야 합니다. 스토리지 소유자 역할은 사용자가 스토리지 데이터 소유자임을 의미하지는 않습니다.
  • ACL(액세스 제어 목록)을 사용하면 Azure Storage의 파일 및 디렉터리에 대한 세분화된 읽기(R), 쓰기(W) 및 실행(X) 권한을 정의할 수 있습니다. ACL은 Microsoft Entra 사용자에게 할당할 수 있습니다. 리더가 Azure Storage의 경로에 있는 파일을 읽으려면 파일 경로에 있는 모든 폴더에 대한 실행(X) ACL 및 파일에 대한 읽기(R) ACL이 있어야 합니다. 스토리지 계층에서 ACL 사용 권한을 설정하는 방법에 대한 자세한 정보.
  • SAS(공유 액세스 서명)를 사용하면 reader가 시간 제한 토큰을 사용하여 Azure Data Lake 스토리지에 있는 파일에 액세스할 수 있습니다. 읽기 권한자는 Microsoft Entra 사용자로 인증될 필요도 없습니다. SAS 토큰에는 reader에 부여된 사용 권한뿐만 아니라 토큰의 유효 기간도 포함됩니다. SAS 토큰은 동일한 Microsoft Entra 테넌트에 있을 필요도 없는 모든 사용자에 대한 시간 제한적인 액세스에 적합한 선택입니다. SAS 토큰은 스토리지 계정 또는 특정 디렉터리에 정의할 수 있습니다. 공유 액세스 서명을 사용하여 Azure Storage 리소스에 대한 제한된 액세스 권한 부여에 대해 자세히 알아보세요.

또는 익명 액세스를 허용하여 파일을 공개적으로 사용할 수 있습니다. 비공개 데이터가 있는 경우 이 접근 방식을 사용하면 안 됩니다.

지원되는 스토리지 권한 부여 유형

서버리스 SQL 풀에 로그인한 사용자는 파일을 공개적으로 사용할 수 없는 경우 Azure Storage의 파일에 액세스하고 쿼리할 수 있는 권한이 있어야 합니다. 네 가지 권한 부여 유형(사용자 ID, 공유 액세스 서명, 서비스 주체관리 ID)을 사용하여 비공개 스토리지에 액세스할 수 있습니다.

참고 항목

Microsoft Entra 통과는 작업 영역을 만들 때의 기본 동작입니다.

"Microsoft Entra 통과"라고도 알려진 사용자 ID는 서버리스 SQL 풀에 로그인한 Microsoft Entra 사용자의 ID를 사용하여 데이터 액세스를 권한 부여하는 권한 부여 형식입니다. 데이터에 액세스하기 전에 Azure Storage 관리자는 Microsoft Entra 사용자에게 권한을 부여해야 합니다. 데이터베이스 사용자에 대해 지원되는 권한 부여 형식 표에 표시된 대로 SQL 사용자 유형에는 지원되지 않습니다.

Important

Microsoft Entra 인증 토큰은 클라이언트 애플리케이션에 의해 캐시될 수 있습니다. 예를 들어, Power BI는 Microsoft Entra 토큰을 캐시하고 동일한 토큰을 한 시간 동안 재사용합니다. 쿼리가 실행되는 도중 토큰이 만료되면 긴 실행 쿼리가 실패할 수 있습니다. 쿼리 도중에 만료되는 Microsoft Entra 액세스 토큰으로 인해 쿼리 오류가 발생하는 경우 서비스 주체, 관리 ID 또는 공유 액세스 서명으로 전환하는 것이 좋습니다.

ID를 사용하여 데이터에 액세스하려면 Storage Blob 데이터 소유자, Storage Blob 데이터 기여자 또는 Storage Blob 데이터 읽기 권한자 역할의 멤버여야 합니다. 또는 파일 및 폴더에 액세스하는 세분화된 ACL 규칙을 지정할 수 있습니다. 스토리지 계정의 소유자인 경우에도 Storage Blob 데이터 역할 중 하나에 자신을 추가해야 합니다. Azure Data Lake Store Gen2의 액세스 제어에 대한 자세한 내용은 Azure Data Lake Storage Gen2의 액세스 제어 문서를 검토하세요.

교차 테넌트 시나리오

Synapse 서버리스 SQL 풀과 다른 테넌트에 Azure Storage가 있는 경우 서비스 주체를 통한 권한 부여가 권장되는 방법입니다. SAS 권한 부여도 가능하지만 관리 ID는 지원되지 않습니다.

권한 부여 유형 방화벽으로 보호된 스토리지 방화벽으로 보호되지 않는 스토리지
SAS 지원됨 지원됨
서비스 주체 지원되지 않음 지원됨

참고 항목

Azure Storage가 Azure Storage 방화벽으로 보호되는 경우 서비스 주체는 지원되지 않습니다.

데이터베이스 사용자에 대해 지원되는 권한 부여 유형

다음 표에서는 Azure Synapse Analytics 서버리스 SQL 엔드포인트에 대한 다양한 로그인 방법에 사용 가능한 Azure Storage 권한 부여 형식을 제공합니다.

인증 형식 SQL 사용자 Microsoft Entra 사용자 서비스 주체
사용자 ID 지원되지 않음 지원됨 지원됨
SAS 지원됨 지원 지원됨
서비스 주체 지원됨 지원 지원됨
관리 ID 지원됨 지원 지원됨

지원되는 스토리지 및 권한 부여 유형

다음과 같은 권한 부여 형식과 Azure Storage 형식의 조합을 사용할 수 있습니다.

권한 부여 유형 Blob Storage ADLS Gen1 ADLS Gen2
SAS 지원됨 지원되지 않음 지원됨
서비스 주체 지원됨 지원 지원됨
관리 ID 지원됨 지원 지원됨
사용자 ID 지원됨 지원 지원됨

교차 테넌트 시나리오

Azure Storage가 Azure Synapse Analytics 서버리스 SQL 풀과 다른 테넌트에 있는 경우 서비스 주체를 통한 권한 부여가 권장되는 방법입니다. 공유 액세스 서명 권한 부여도 가능합니다. 관리되는 서비스 ID는 지원되지 않습니다.

권한 부여 유형 방화벽으로 보호된 스토리지 방화벽으로 보호되지 않는 스토리지
SAS 지원됨 지원됨
서비스 주체 지원되지 않음 지원됨

참고 항목

Azure Storage가 Azure Storage 방화벽으로 보호되고 다른 테넌트에 있는 경우 서비스 주체는 지원되지 않습니다. 대신 SAS(공유 액세스 서명)를 사용합니다.

방화벽으로 보호된 스토리지

리소스 인스턴스 규칙을 만들어 특정 서버리스 SQL 풀에 대한 액세스를 허용하도록 스토리지 계정을 구성할 수 있습니다. 방화벽으로 보호되는 스토리지에 액세스할 때 사용자 ID 또는 관리 ID를 사용합니다.

참고 항목

Azure Storage의 방화벽 기능은 공개 미리 보기로 제공되며 모든 공용 클라우드 지역에서 사용할 수 있습니다.

다음 표에서는 Azure Synapse Analytics 서버리스 SQL 엔드포인트에 대한 다양한 로그인 방법에 사용 가능한 방화벽으로 보호되는 Azure Storage 권한 부여 형식을 제공합니다.

인증 형식 SQL 사용자 Microsoft Entra 사용자 서비스 주체
사용자 ID 지원되지 않음 지원됨 지원됨
SAS 지원되지 않음 지원되지 않음 지원되지 않음
서비스 주체 지원되지 않음 지원되지 않음 지원되지 않음
관리 ID 지원됨 지원 지원됨

사용자 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
    

    Important

    최소한 버전 3.4.0을 사용하고 있는지 확인합니다. 다음 명령을 실행하여 Az. Storage 버전을 확인할 수 있습니다.

    Get-Module -ListAvailable -Name Az.Storage | Select Version
    
  3. Azure 테넌트에 연결:

    Connect-AzAccount
    
  4. PowerShell에서 변수 정의:

    • 리소스 그룹 이름 - 스토리지 계정의 개요에 있는 Azure Portal에서 찾을 수 있습니다.
    • 계정 이름 - 방화벽 규칙으로 보호되는 스토리지 계정의 이름입니다.
    • 테넌트 ID - Microsoft Entra ID의 Azure Portal, 속성, 테넌트 속성에서 찾을 수 있습니다.
    • 작업 영역 이름 - 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
    

    Important

    PowerShell 스크립트에서 반환된 $resourceid 값은 다음 템플릿과 일치해야 합니다. /subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Synapse/workspaces/{name-of-workspace}resourcegroups를 소문자로 작성해야 합니다.

  5. Azure Storage 계정 네트워크 규칙을 추가합니다.

        $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 풀 엔드포인트에 인증 정보가 포함된 자격 증명이 필요합니다. 두 가지 유형의 자격 증명이 사용됩니다.

  • 서버 수준 자격 증명은 OPENROWSET 함수를 사용하여 실행되는 임시 쿼리에 사용됩니다. 자격 증명 이름은 스토리지 URL과 일치해야 합니다.
  • 데이터베이스 범위 자격 증명은 외부 테이블에 사용됩니다. 외부 테이블은 스토리지에 액세스하는 데 사용해야 하는 자격 증명으로 DATA SOURCE를 참조합니다.

자격 증명을 관리할 수 있는 권한 부여

자격 증명 관리 기능을 부여하려면 다음 안내를 따릅니다.

  • 사용자가 서버 수준 자격 증명을 만들거나 삭제하도록 허용하려면 관리자가 master 데이터베이스의 로그인에 ALTER ANY CREDENTIAL 권한을 부여해야 합니다. 예시:

    GRANT ALTER ANY CREDENTIAL TO [login_name];
    
  • 사용자가 데이터베이스 범위 자격 증명을 만들거나 삭제하도록 허용하려면 관리자가 사용자 데이터베이스의 데이터베이스 사용자에게 데이터베이스에 대한 CONTROL 권한을 부여해야 합니다. 예시:

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

자격 증명을 사용할 수 있는 권한 부여

외부 스토리지에 액세스하는 데이터베이스 사용자는 자격 증명을 사용할 수 있는 권한이 있어야 합니다. 자격 증명을 사용하려면 사용자에게 특정 자격 증명에 대한 REFERENCES 권한이 있어야 합니다.

로그인을 위한 서버 수준 자격 증명에 대한 REFERENCES 권한을 부여하려면 master 데이터베이스에서 다음 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 Storage의 기준 URL과 일치해야 합니다(선택적으로 뒤에 컨테이너 이름이 옴). 자격 증명은 CREATE CREDENTIAL을 실행하여 추가됩니다. CREDENTIAL NAME 인수를 제공해야 합니다.

참고 항목

FOR CRYPTOGRAPHIC PROVIDER 인수는 지원되지 않습니다.

서버 수준 CREDENTIAL 이름은 <prefix>://<storage_account_path>[/<container_name>] 형식과 일치해야 합니다. 스토리지 계정 경로는 다음 표에 설명되어 있습니다.

외부 데이터 원본 접두사 스토리지 계정 경로
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 Storage에 액세스할 수 있습니다.

Microsoft Entra 사용자는 Storage Blob 데이터 소유자, Storage Blob 데이터 기여자 또는 Storage Blob 데이터 읽기 권한자 역할의 멤버인 경우 Azure Storage의 모든 파일에 액세스할 수 있습니다. Microsoft Entra 사용자는 스토리지에 액세스하기 위해 자격 증명이 필요하지 않습니다.

SQL 인증 사용자는 Microsoft Entra 인증을 사용하여 스토리지에 액세스할 수 없습니다. 관리 ID, SAS 키, 서비스 주체를 사용하거나 스토리지에 대한 공용 액세스가 있는 경우 데이터베이스 자격 증명을 통해 스토리지에 액세스할 수 있습니다.

데이터베이스 범위 자격 증명

데이터베이스 범위 자격 증명은 보안 주체가 DATA_SOURCE를 사용하여 OPENROWSET 함수를 호출하거나 공용 파일에 액세스하지 않는 외부 테이블에서 데이터를 선택하는 경우에 사용됩니다. 데이터베이스 범위 자격 증명은 스토리지 계정의 이름과 일치할 필요가 없으며 스토리지 위치를 정의하는 데이터 원본에서 참조됩니다.

데이터베이스 범위 자격 증명을 사용하면 다음 인증 유형을 사용하여 Azure 스토리지에 액세스할 수 있습니다.

Microsoft Entra 사용자는 Storage Blob 데이터 소유자, Storage Blob 데이터 기여자 또는 Storage 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

다음 단계

다음 문서는 다양한 폴더 형식, 파일 형식을 쿼리하고 보기를 만들고 사용하는 방법을 배우는 데 도움이 됩니다.