S3 호환 개체 스토리지의 외부 데이터에 액세스하도록 PolyBase 구성

적용 대상: SQL Server 2022(16.x)

이 문서에서는 PolyBase를 사용하여 S3 호환 개체 스토리지에 있는 외부 데이터를 쿼리하는 방법을 설명합니다.

SQL Server 2022(16.x)에 모든 S3 호환 개체 스토리지에 연결하는 기능이 도입되었습니다. 인증에는 기본 인증 또는 통과 권한 부여(STS 권한 부여라고도 함)의 두 가지 사용 가능한 옵션이 있습니다.

정적 자격 증명이라고도 하는 기본 인증을 사용하려면 사용자가 SQL Server에 access key idsecret key id를 저장해야 하며, 필요할 때마다 자격 증명을 명시적으로 철회하고 회전해야 합니다. 세분화된 액세스 제어를 사용하려면 관리자가 각 로그인에 대해 정적 자격 증명을 설정해야 합니다. 이 방법은 수십 또는 수백 개의 고유한 자격 증명을 처리할 때 사용하기 어려울 수 있습니다.

통과(STS) 권한 부여는 SQL Server 자체 사용자 ID를 사용하여 S3 호환 개체 스토리지에 액세스함으로써 이러한 문제의 솔루션을 제공합니다. S3 호환 개체 스토리지에는 STS(보안 토큰 서비스)를 사용하여 임시 자격 증명을 할당하는 기능이 있습니다. 이러한 자격 증명은 단기적이고 동적으로 생성됩니다.

이 문서에는 기본 인증과 STS(통과 권한 부여) 권한 부여에 대한 지침 두 가지 모두 포함되어 있습니다.

필수 조건

S3 호환 개체 스토리지 통합 기능을 사용하려면 다음 도구와 리소스가 필요합니다.

  • SQL Server PolyBase 기능을 설치합니다.
  • SSMS(SQL Server Management Studio) 또는 Azure Data Studio를 설치합니다.
  • S3 호환 스토리지입니다.
  • 생성한 S3 버킷입니다. 버킷은 SQL Server에서 만들거나 구성할 수 없습니다.
  • 알려진 사용자(Access Key ID) 및 비밀(Secret Key ID)입니다. S3 개체 스토리지 엔드포인트에 대해 인증하려면 두 항목이 모두 필요합니다.
  • TLS(전송 계층 보안)이 구성되어야 합니다. 모든 연결이 HTTP가 아닌 HTTPS를 통해 안전하게 전송된다고 가정합니다. 엔드포인트는 SQL Server OS 호스트에 설치된 인증서에 의해 유효성이 검사됩니다. 자세한 내용은 데이터베이스 엔진에 암호화 연결 사용을 참조하세요.

사용 권한

프록시 사용자가 S3 버킷의 콘텐츠를 읽으려면 사용자(Access Key ID)는 S3 끝점에 대해 다음 작업을 수행할 수 있어야 합니다.

  • S3 개체 스토리지에서 특정 파일을 읽으려면 GetBucketLocationGetObject 권한이 필요합니다.
    • ListBucket은 단일 파일 대신 S3 폴더 위치를 가리키는 외부 테이블 또는 OPENROWSET 쿼리에 필요합니다. ListBucket 권한이 없으면 Msg 4860, Level 16, State 7, Line 15 Cannot bulk load. The file "s3://<ip address>:9000/bucket/*.*" does not exist or you don't have file access rights. 오류가 표시됩니다.
  • S3 개체 스토리지에 쓰려면 PutObject 권한이 필요합니다.

S3 호환 개체 스토리지 공급자는 추가 API 작업 권한이 필요하거나 API 작업에 대한 사용 권한이 포함된 역할에 다른 이름을 사용할 수 있습니다. 제품 설명서를 참조하세요.

PolyBase 사용

  1. sp_configure에서 PolyBase 사용:

    EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1;
    GO
    RECONFIGURE
    GO
    
  2. 설정 확인:

    EXEC sp_configure @configname = 'polybase enabled';
    

인증

계속하려면 기본 인증 또는 통과(STS) 권한 부여를 선택합니다.

기본 인증

데이터베이스 범위 자격 증명을 만들기 전에 자격 증명을 보호하려면 사용자 데이터베이스에 마스터 키가 있어야 합니다. 자세한 내용은 CREATE MASTER KEY를 참조하세요.

기본 인증을 사용하여 데이터베이스 범위 자격 증명 만들기

다음 샘플 스크립트는 SQL Server 인스턴스의 s3-dc 데이터베이스에 데이터베이스 범위 자격 증명인 database_name를 만듭니다. 자세한 내용은 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요.

USE [database_name];
GO
IF NOT EXISTS(SELECT * FROM sys.database_scoped_credentials WHERE name = 's3_dc')
BEGIN
 CREATE DATABASE SCOPED CREDENTIAL s3_dc
 WITH IDENTITY = 'S3 Access Key',
 SECRET = '<AccessKeyID>:<SecretKeyID>' ;
END
GO

sys.database_scoped_credentials(Transact-SQL)를 사용하여 새 데이터베이스 범위 자격 증명을 확인합니다.

SELECT * FROM sys.database_scoped_credentials;

기본 인증을 사용하여 외부 데이터 원본 만들기

다음 샘플 스크립트는 SQL Server의 원본 사용자 데이터베이스에 s3_ds 외부 데이터 원본을 만듭니다. 외부 데이터 원본은 s3_dc 데이터베이스 범위 자격 증명을 참조합니다. 자세한 내용은 CREATE EXTERNAL DATA SOURCE를 참조하세요.

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/'
,   CREDENTIAL = s3_dc
);
GO

sys.external_data_sources를 사용하여 새 외부 데이터 원본을 확인합니다.

SELECT * FROM sys.external_data_sources;

기본 인증 제한 사항

  • S3 호환 개체 스토리지의 경우 고객은 : 문자가 포함된 액세스 키 ID를 만들 수 없습니다.
  • 전체 URL 길이는 259자로 제한됩니다. 따라서 s3://<hostname>/<objectkey>는 259자를 초과하면 안 됩니다. s3://는 이 제한 갯수에 포함되므로, 경로 길이는 259-5 = 254자를 초과할 수 없습니다.
  • SQL 자격 증명 이름은 UTF-16 형식에서 128자로 제한됩니다.
  • 이 자격 증명이 새 외부 데이터 원본에 대한 것이 아니면 만든 자격 증명 이름에 버킷 이름이 포함되어야 합니다.
  • 액세스 키 ID 및 비밀 키 ID는 영숫자 값만 포함해야 합니다.

통과(STS) 권한 부여

S3 호환 개체 스토리지에는 STS(보안 토큰 서비스)를 사용하여 임시 자격 증명을 할당하는 기능이 있습니다. 이러한 자격 증명은 단기적이고 동적으로 생성됩니다.

통과 권한 부여는 OIDC(OpenID Connect) ID 공급자 역할을 하는 ADFS(Active Directory Federation Service)에 의존하며, S3 호환 개체 스토리지 STS와 통신하고 STS를 요청하 SQL Server에 다시 제공하는 것은 ADFS에 달려 있습니다.

SQL Server에서 통과(STS) 권한 부여 사용

  1. TLS는 SQL Server와 S3 호환 호스트 서버 간의 인증서로 구성해야 합니다. 모든 연결이 HTTP가 아닌 HTTPS를 통해 안전하게 전송된다고 가정합니다. 엔드포인트는 SQL Server OS 호스트에 설치된 인증서에 의해 유효성이 검사됩니다. 공용 또는 자체 서명된 인증서는 지원됩니다.

  2. ID를 S3 호환 개체 스토리지에 전달하는 데 사용할 데이터베이스 범위 자격 증명을 만듭니다. 자세한 내용은 CREATE DATABASE SCOPED CREDENTIAL(Transact-SQL)을 참조하세요. 다음 예제를 참조하세요.

    CREATE DATABASE SCOPED CREDENTIAL CredName
    WITH IDENTITY = 'User Identity'
    
  3. 외부 데이터 원본을 만들어 S3 호환 개체 스토리지에 액세스합니다. CONNECTION_OPTIONS를 사용하여 JSON 형식으로 ADFS 및 STS 모두에 필요한 정보를 알립니다. 자세한 내용은 CREATE EXTERNAL DATA SOURCE를 참조하세요. 다음 예제를 참조하세요.

    CREATE EXTERNAL DATA SOURCE EdsName
    WITH
    {
        LOCATION = 's3://<hostname>:<port>/<bucket_name>'
        , CREDENTIAL = <CredName>
        [ , CONNECTION_OPTIONS = ' {
            [ , "authorization": {
                    "adfs": {
                        "endpoint": "http[s]://hostname:port/servicepath",
                        "relying_party": "SQL Server Relying Party Identifier"
                    },
                    "sts": {
                        "endpoint": "http[s]://hostname:port/stspath",
                        "role_arn": "Role Arn"
                        [ , "role_session_name": "AD user login" ] -- default value if not provided
                        [ , "duration_seconds": 3600 ]             -- default value if not provided
                        [ , "version": "2011-06-15" ]              -- default value if not provided
                        [ , "request_parameters": "In request query string format" ]
                    }
                } ]
            [ , "s3": {
                "url_style": "Path"
                } ]
        }' ]
    }
    
  • ADFS 옵션은 ADFS에서 SQL Server의 Windows 전송 끝점 및 relying_party 식별자를 지정합니다.
  • STS 옵션은 AssumeRoleWithWebIdentity 요청에 대한 S3 호환 개체 스토리지 STS 끝점 및 매개 변수를 지정합니다. AssumeRoleWithWebIdentity는 인증에 사용되는 임시 보안 자격 증명을 획득에 사용되는 메서드입니다. 선택적 매개 변수 및 기본값에 대한 정보를 포함한 전체 매개 변수 목록은 STS API 참조를 참조하세요.

Active Directory와 통과(STS) 권한 부여 사용

  • S3 호환 스토리지에 통과를 허용하도록 AD의 SQL Server 사용자 계정 속성을 민감하지 않은 것으로 표시합니다.
  • SQL Server SPN(서비스 사용자 이름)과 관련된 사용자에 대해 ADFS 서비스에 Kerberos 제한 위임을 허용합니다.

Active Directory Federation Service에서 통과(STS) 권한 부여 사용

  • SQL Server를 Active Directory에서 클레임 공급자 트러스트로 사용하도 설정합니다.
  • ADFS에 대한 인증 방법으로 인트라넷 Windows 인증을 허용합니다.
  • 인트라넷에서 Windows 전송 서비스 엔드포인트를 사용하도록 설정합니다.
  • OIDC(OpenID Connect) 끝점을 사용하도록 설정합니다.
  • SQL Server를 신뢰 당사자 트러스트로 등록합니다.
    • 고유 식별자를 제공합니다.
    • JWT(JSON Web Token에 대한 클레임 규칙을 설정합니다.
  • 사용자 지정 클레임 - 스토리지 쪽에서 액세스 정책을 결정하는 데 필요한 경우 고객이 이러한 클레임을 추가할 수 있습니다.
  • 공급업체별 자세한 내용은 S3 호환 플랫폼 공급자에게 문의하세요.

S3 호환 개체 스토리지에서 통과(STS) 권한 부여 사용

  • S3 호환 저장소 공급자가 제공하는 설명서에 따라 외부 OIDC ID 공급자를 설정합니다. ID 공급자를 설정하려면 주로 다음 값이 일반적으로 필요합니다.

    • OIDC 공급자의 구성 끝점입니다.
    • OIDC 공급자의 지문입니다.
    • S3 호환 개체 스토리지에 대한 통과 권한 부여

통과(STS) 권한 부여의 제한 사항

  • Windows 인증을 사용하는 SQL Server 로그인은 S3 호환 개체 스토리지에 통과 권한 부여(STS)를 지원합니다.
  • STS 토큰은 S3 호환 개체 스토리지의 URL에 백업하는 BACKUP에 사용할 수 없습니다.
  • ADFS 및 SQL Server는 동일한 도메인에 있어야 합니다. ADFS Windows 전송 끝점은 엑스트라넷에서 사용하지 않도록 설정해야 합니다.
  • ADFS에는 클레임 트러스트 공급자로서 SQL Server와 동일한 AD(Active Directory)가 있어야 합니다.
  • S3 호환 스토리지에는 클라이언트가 외부 ID의 JWT를 사용하여 임시 자격 증명을 요청할 수 있도록 하는 STS 끝점 서비스가 있어야 합니다.
  • OPENROWSET 및 CETAS(외부 테이블을 선택으로 만들기) 쿼리는 parquet 및 CSV 형식으로 지원됩니다.
  • 기본적으로 Kerberos 티켓 갱신 시간은 7일이며 수명은 Windows에서 10시간, Linux에서는 2시간입니다. SQL Server는 사용자의 Kerberos 토큰을 최대 7일까지 갱신합니다. 7일 후에 사용자의 티켓이 만료되므로 S3 호환 스토리지로 통과가 실패합니다. 이 경우 SQL Server는 사용자를 다시 인증하여 새 Kerberos 티켓을 가져와야 합니다.
  • Windows Server 2019를 사용하는 ADFS 2019가 지원됩니다.
  • S3 REST API 호출은 AWS 서명 버전 4를 사용합니다.

SQL Server on Linux에서 PolyBase

SQL Server on Linux에서 PolyBase의 경우, 더 많은 구성이 필요합니다.

  • TLS가 구성되어야 합니다. 모든 연결이 HTTP가 아닌 HTTPS를 통해 안전하게 전송된다고 가정합니다. 끝점은 SQL Server OS 호스트에 설치된 인증서로 유효성을 검사합니다.
  • Linux에서는 인증서 관리가 다릅니다. S3 호환 스토리지에 대한 Linux Support에 자세히 설명된 구성을 검토하고 따릅니다.