외부 OAuth용 Microsoft Azure AD 구성

이 항목에서는 Snowflake를 OAuth 리소스로 구성하고 Azure AD를 외부 OAuth 인증 서버로 구성하여 Snowflake 데이터에 프로그래밍 방식으로 안전하게 액세스하는 방법을 설명합니다.

이 항목의 내용:

구성 절차

다음 4단계에서는 Azure AD OAuth 인증 서버, OAuth 클라이언트, 범위 및 필요한 메타데이터가 환경에 구성되지 않은 것으로 가정합니다.

1~3단계의 정보는 Snowflake에서 보안 통합을 구성하기 위해 사용됩니다.

이미 Azure AD 인증 서버와 클라이언트를 구성한 경우에는 아래의 모든 단계를 완료할 필요가 없습니다. 대신, 다음 세 단계를 건너뛰어 원하는 정보를 얻고 범위를 생성해 1개 이상의 정책에 범위를 할당한 후 메타데이터에 액세스할 수 있는지 확인합니다.

Azure AD OAuth 인증 서버와 클라이언트를 구성하지 않은 경우에는 다음 네 단계를 완료합니다.

중요

이 항목의 이러한 단계는 외부 OAuth용 Azure AD를 구성하는 방법을 보여주는 대표적인 예 입니다.

Azure AD를 원하는 상태로 구성하고 원하는 OAuth 흐름을 구성할 수도 있습니다. 단, 이 항목의 보안 통합 에 대하여 필요한 정보를 얻을 수 있어야 합니다.

다음 단계는 Snowflake에서 보안 통합을 생성하기 위해 필요한 정보를 얻기 위한 가이드라는 점에 유의하십시오.

1~3단계는 OAuth 2.0 및 인증에 대한 Azure AD 설명서에서 가져온 것입니다. Microsoft가 OAuth 2.0 및 인증과 관련하여 용어, 사용자 인터페이스 및 옵션을 정의하는 방법에 대한 자세한 내용은 다음 Azure AD 가이드를 참조하십시오.

사전 필수 단계: Azure AD에서 OAuth 흐름 결정

Azure AD는 OAuth 클라이언트가 액세스 토큰을 얻을 수 있는 2가지의 다른 OAuth 흐름을 지원합니다.

  1. 인증 서버가 사용자를 대신하여 OAuth 클라이언트에 액세스 토큰을 부여할 수 있습니다.

  2. 인증 서버가 OAuth 클라이언트 자체를 위해 OAuth 클라이언트에 액세스 토큰을 부여할 수 있습니다.

첫 번째 흐름에서 액세스 토큰의 ID는 사용자를 참조합니다. 두 번째 흐름에서 액세스 토큰의 ID는 OAuth 클라이언트를 참조합니다.

Microsoft Azure AD에서는 이러한 두 OAuth 흐름 각각에서 동일한 역할 형식을 허용하지 않습니다. 사용할 역할 형식은 사용하는 OAuth 흐름에 따라 결정됩니다. 사용할 OAuth 흐름을 결정하면:

1단계: Azure AD에서 OAuth 리소스 구성

  1. Microsoft Azure 포털 로 이동하여 인증합니다.

  2. Azure Active Directory로 이동합니다.

  3. App Registrations 를 클릭합니다.

  4. New Registration 을 클릭합니다.

  5. Snowflake OAuth Resource 또는 유사한 값을 Name 으로 입력합니다.

  6. Supported account typesSingle Tenant 로 설정되었는지 확인합니다.

  7. Register 를 클릭합니다.

  8. Expose an API 를 클릭합니다.

  9. Application ID URI 옆의 Set 링크를 클릭하여 Application ID URI 를 설정합니다.

    중요

    Application ID URI 는 조직의 디렉터리 내에서 고유(예: https://your.company.com/4d2a8c2b-a5f4-4b86-93ca-294185f45f2e) 해야 합니다. 하위 구성 단계에서는 이 값을 <SNOWFLAKE_APPLICATION_ID_URI> 라고 부릅니다.

    애플리케이션 ID URI를 얻는 데 도움이 필요하면 내부 Microsoft Azure AD 관리자에게 문의하십시오.

    애플리케이션 ID URI가 사용되지 않는 경우에는 Snowflake 계정 URL(즉, <계정_식별자>.snowflakecomputing.com)을 사용하여 대상 그룹과 함께 보안 통합을 생성해야 합니다. 자세한 내용은 다음을 참조하십시오.

  10. 사용자 대신 프로그래밍 방식 클라이언트가 작동하는 OAuth 흐름에 대한 OAuth 범위로 Snowflake 역할을 추가하려면, Add a scope 를 클릭하여 Snowflake 역할을 나타내는 범위를 추가합니다.

    • Snowflake 역할 이름에 session:scope: 접두사를 사용하여 범위를 입력합니다. 예를 들어, Snowflake Analyst 역할의 경우 session:scope:analyst 를 입력합니다.

    • 동의할 수 있는 사용자를 선택합니다.

    • 범위에 display name (예: 계정 관리자)을 입력합니다.

    • 범위에 description (예: Snowflake 계정을 관리할 수 있음)을 입력합니다.

    • Add Scope 를 클릭합니다.

  11. 프로그래밍 방식 클라이언트가 자체를 위한 액세스 토큰을 요청하는 OAuth 흐름을 위한 역할로 Snowflake 역할을 추가하려면:

    • Manifest 를 클릭합니다.

    • appRoles 요소를 찾습니다.

    • 다음과 같은 설정으로 App Role 을 입력합니다.

      설정

      설명

      allowedMemberTypes

      애플리케이션입니다.

      설명

      역할에 대한 설명입니다.

      displayName

      살펴볼 사용자의 식별 이름입니다.

      id

      고유 ID입니다. 필요한 경우 PowerShell의 [System.Guid]::NewGuid() 함수를 사용하여 고유 ID를 생성할 수 있습니다.

      isEnabled

      true 로 설정합니다.

      lang

      언어입니다. null 로 설정합니다.

      origin

      Application 으로 설정합니다.

      session:role: 접두사가 포함된 Snowflake 역할의 이름으로 설정합니다. . Analyst 역할의 경우 session:role:analyst 를 입력합니다.

      App Role 은 다음과 같이 표시됩니다.

      "appRoles":[
          {
              "allowedMemberTypes": [ "Application" ],
              "description": "Account Administrator.",
              "displayName": "Account Admin",
              "id": "3ea51f40-2ad7-4e79-aa18-12c45156dc6a",
              "isEnabled": true,
              "lang": null,
              "origin": "Application",
              "value": "session:role:analyst"
          }
      ]
      
  12. Save 를 클릭합니다.

2단계: Azure AD에서 OAuth 클라이언트 만들기

  1. Microsoft Azure 포털 로 이동하여 인증합니다.

  2. Azure Active Directory로 이동합니다.

  3. App Registrations 를 클릭합니다.

  4. New Registration 을 클릭합니다.

  5. 클라이언트의 이름(예: Snowflake OAuth Client)을 입력합니다.

  6. 지원되는 계정 유형이 단일 tenant로 설정되어 있는지 확인합니다.

  7. Register 를 클릭합니다.

  8. Overview 섹션에서 Application (client) ID 필드의 ClientID 를 복사합니다. 다음 단계에서는 이를 <OAUTH_CLIENT_ID> 라고 부릅니다.

  9. Certificates & secrets 을 클릭하고 New client secret 을 클릭합니다.

  10. 비밀의 시크릿을 추가합니다.

  11. never expire 을 선택합니다. 테스트 목적으로 만료되지 않는 시크릿을 선택합니다.

  12. Add 를 클릭합니다. 시크릿을 복사합니다. 다음 단계에서는 이를 <OAUTH_CLIENT_SECRET> 이라고 부릅니다.

  13. 사용자를 대신하여 액세스 토큰을 요청하는 프로그래밍 방식 클라이언트의 경우, 다음과 같이 애플리케이션에 위임된 권한을 구성합니다.

    • API Permissions 를 클릭합니다.

    • Add Permission 을 클릭합니다.

    • My APIs 를 클릭합니다.

    • 1단계: Azure AD에서 OAuth 리소스 구성 에서 생성한 Snowflake OAuth Resource 를 클릭합니다.

    • Delegated Permissions 상자를 클릭합니다.

    • 이 클라이언트에 부여할 애플리케이션에 정의된 범위와 관련된 권한을 확인합니다.

    • Add Permissions 를 클릭합니다.

    • Grant Admin Consent 버튼을 클릭하여 클라이언트에 권한을 부여합니다. 테스트를 위해 이러한 방식으로 권한이 구성되었음에 유의하십시오. 그러나 프로덕션 환경에서 이러한 방식으로 권한을 부여하는 것은 권장되지 않습니다.

    • Yes 를 클릭합니다.

  14. 자체를 위해 액세스 토큰을 요청하는 프로그래밍 방식 클라이언트의 경우, 다음과 같이 API permissions for Applications 을 구성합니다.

    • API Permissions 를 클릭합니다.

    • Add Permission 을 클릭합니다.

    • My APIs 를 클릭합니다.

    • 1단계: Azure AD에서 OAuth 리소스 구성 에서 생성한 Snowflake OAuth Resource 를 클릭합니다.

    • Application Permissions 을 클릭합니다.

    • 이 클라이언트에게 부여할 애플리케이션의 Manifest 에 수동으로 정의된 역할과 관련된 Permission 을 선택합니다.

    • Add Permissions 를 클릭합니다.

    • Grant Admin Consent 버튼을 클릭하여 클라이언트에 권한을 부여합니다. 권한은 테스트 목적으로 이러한 방식으로 구성된다는 점에 유의하십시오. 그러나 프로덕션 환경에서 이러한 방식으로 권한을 부여하는 것은 권장되지 않습니다.

    • Yes 를 클릭합니다.

3단계: Snowflake용 Azure AD 정보 수집

  1. Microsoft Azure 포털 로 이동하여 인증합니다.

  2. Azure Active Directory로 이동합니다.

  3. App Registrations 를 클릭합니다.

  4. 1단계: Azure AD에서 OAuth 리소스 구성 에서 생성한 Snowflake OAuth Resource 를 클릭합니다.

  5. Overview 인터페이스에서 Endpoints 를 클릭합니다.

  6. 오른쪽에서 OAuth 2.0 token endpoint (v2) 를 복사하고 OpenID Connect metadataFederation Connect metadata 에 대한 URLs을 메모합니다.

    • 다음 구성 단계에서는 OAuth 2.0 token endpoint (v2)<AZURE_AD_OAUTH_TOKEN_ENDPOINT> 라고 부릅니다. 엔드포인트는 https://login.microsoftonline.com/90288a9b-97df-4c6d-b025-95713f21cef9/oauth2/v2.0/token 과 유사해야 합니다.

    • OpenID Connect metadata 의 경우 새 브라우저 창에서 엽니다.

      • "jwks_uri" 매개 변수를 찾아 값을 복사합니다.

      • 다음 구성 단계에서는 이 매개 변수 값을 <AZURE_AD_JWS_KEY_ENDPOINT> 라고 부릅니다. 엔드포인트는 https://login.microsoftonline.com/90288a9b-97df-4c6d-b025-95713f21cef9/discovery/v2.0/keys 와 유사해야 합니다.

    • Federation metadata document 의 경우 새 브라우저 창에서 URL을 엽니다.

      • XML Root Element 에서 "entityID" 매개 변수를 찾고 값을 복사합니다.

      • 다음 구성 단계에서는 이 매개 변수 값을 <AZURE_AD_ISSUER> 라고 부릅니다. entityID 값은 https://sts.windows.net/90288a9b-97df-4c6d-b025-95713f21cef9/ 와 유사해야 합니다.

4단계: Snowflake에서 보안 통합 만들기

이 단계에는 Snowflake가 Microsoft Azure AD와 보안 통신을 수행하고, Azure AD에서 제공되는 토큰의 유효성을 검사하며, OAuth 토큰과 연결된 사용자 역할을 기반으로 사용자에게 적절한 Snowflake 데이터 액세스를 제공하기 위해 Snowflake에 보안 통합을 생성하는 작업에 대해 다룹니다.

사용 사례 및 구성 요구 사항에 가장 적합한 보안 통합을 선택합니다. 통합이 이전 구성만을 기반으로 하는 경우에는 우선 보안 통합을 사용합니다. 자세한 내용은 CREATE SECURITY INTEGRATION(External OAuth) 섹션을 참조하십시오.

중요

Microsoft Power BI 용 보안 통합을 생성하는 경우 Microsoft Power BI SSO로 Snowflake에 연결 의 설정 지침을 따르십시오.

계정 관리자(즉, ACCOUNTADMIN 역할의 사용자) 또는 전역 CREATE INTEGRATION 권한이 있는 역할만 이 SQL 명령을 실행할 수 있습니다.

보안 통합 매개 변수 값에서는 대/소문자가 구분되며 보안 통합에 입력한 값은 환경의 해당 값과 일치해야 합니다. 대/소문자가 일치하지 않으면 액세스 토큰을 확인할 수 없어 인증이 실패할 수 있습니다.

모든 값이 정확히 일치하는지 확인합니다. 예를 들어, 발급자 값이 백슬래시로 끝나지 않고 URL의 끝에 백슬래시 문자가 있는 보안 통합을 생성하는 경우에는 오류 메시지가 발생합니다. DROP INTEGRATION 를 사용하여 보안 통합 오브젝트를 삭제한 후 CREATE SECURITY INTEGRATION을 사용하여 올바른 발급자 값을 갖도록 오브젝트를 다시 생성해야 합니다.

Azure AD용 보안 통합 만들기

create security integration external_oauth_azure_1
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = '<AZURE_AD_ISSUER>'
    external_oauth_jws_keys_url = '<AZURE_AD_JWS_KEY_ENDPOINT>'
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

대상 그룹으로 보안 통합 만들기

보안 통합의 external_oauth_audience_list 매개 변수는 Azure AD를 구성하는 동안 지정한 Application ID URI 와 일치해야 합니다.

create security integration external_oauth_azure_2
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = '<AZURE_AD_ISSUER>'
    external_oauth_jws_keys_url = '<AZURE_AD_JWS_KEY_ENDPOINT>'
    external_oauth_audience_list = ('<SNOWFLAKE_APPLICATION_ID_URI>')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

외부 OAuth 보안 통합 수정하기

외부 OAuth 보안 통합은 보안 통합에서 ALTER 문을 실행하여 업데이트할 수 있습니다.

자세한 내용은 ALTER SECURITY INTEGRATION(External OAuth) 섹션을 참조하십시오.

외부 OAuth가 포함된 ANY 역할 사용하기

Snowflake에서 보안 통합을 생성하기 위한 구성 단계에서 OAuth 액세스 토큰에는 범위 정의가 포함됩니다. 그러므로 런타임 시점에 외부 OAuth 보안 통합을 사용하면 OAuth 클라이언트와 사용자 모두 OAuth 액세스 토큰에 정의되지 않은 역할을 사용할 수 없습니다.

액세스 토큰의 유효성을 검사하고 세션을 생성한 후 ANY 역할은 OAuth 클라이언트 및 사용자가 자체 역할을 결정하는 것을 허용합니다. 필요한 경우 클라이언트 또는 사용자는 OAuth 액세스 토큰에 정의된 역할과 다른 역할로 전환할 수 있습니다.

ANY 역할을 구성하려면 범위를 SESSION:ROLE-ANY 로 정의하고 external_oauth_any_role_mode 매개 변수를 사용하여 보안 통합을 구성합니다. 이 매개 변수에서 사용할 수 있는 3가지 문자열 값은 다음과 같습니다.

  • DISABLE 로 지정하면 OAuth 클라이언트 또는 사용자가 역할(즉, use role <역할>;)을 전환할 수 없습니다. 기본값입니다.

  • ENABLE 로 지정하면 OAuth 클라이언트 또는 사용자가 역할을 전환할 수 있습니다.

  • ENABLE_FOR_PRIVILEGE 로 지정하면 OAuth 클라이언트 또는 사용자가 USE_ANY_ROLE 권한을 가진 클라이언트 또는 사용자에 대해서만 역할을 전환할 수 있습니다. 사용자가 사용할 수 있는 1개 이상의 역할에 이 권한을 부여하고 취소할 수 있습니다. 예:

    grant USE_ANY_ROLE on integration external_oauth_1 to role1;
    
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    

보안 통합을 다음과 같이 정의합니다.

create security integration external_oauth_1
    type = external_oauth
    enabled = true
    external_oauth_any_role_mode = 'ENABLE'
    ...

외부 OAuth가 포함된 보조 역할 사용하기

기본 역할에 대해 원하는 범위가 외부 토큰으로 전달되는데, 사용자의 기본 역할(session:role-any) 또는 사용자에게 부여된 특정 역할(session:role:<역할_이름>)입니다.

기본적으로 Snowflake는 세션에서 사용자(즉, DEFAULT_SECONDARY_ROLES)에 대한 기본 보조 역할 을 활성화하지 않습니다.

세션에서 사용자의 기본 보조 역할을 활성화하고 External OAuth를 사용하는 동안 USE SECONDARY ROLES 명령의 실행을 허용하려면 다음 단계를 완료하십시오.

  1. 연결을 위한 보안 통합을 구성합니다. (CREATE SECURITY INTEGRATION을 사용하여) 보안 통합을 만들 때나 나중에 (ALTER SECURITY INTEGRATION을 사용하여) EXTERNAL_OAUTH_ANY_ROLE_MODE 매개 변수 값을 ENABLE 또는 ENABLE_FOR_PRIVILEGE로 설정합니다.

  2. 토큰의 범위 속성에서 session:role-any 의 정적 값을 전달하도록 인증 서버를 구성합니다. 범위 매개 변수에 대한 자세한 내용은 외부 OAuth 개요 섹션을 참조하십시오.

External OAuth에서 클라이언트 리디렉션 사용하기

Snowflake는 지원되는 Snowflake 클라이언트에서 클라이언트 리디렉션과 OAuth 사용을 포함하여, External OAuth에서의 클라이언트 리디렉션 사용을 지원합니다.

자세한 내용은 클라이언트 연결 리디렉션하기 섹션을 참조하십시오.

외부 OAuth가 포함된 네트워크 정책 사용하기

현재는 네트워크 정책을 외부 OAuth 보안 통합에 추가할 수 없습니다. 하지만 전체 Snowflake 계정에 광범위하게 적용되는 네트워크 정책을 계속 구현할 수 있습니다.

사용 사례에서 OAuth 보안 통합과 관련된 네트워크 정책이 필요한 경우 Snowflake OAuth 를 사용하십시오. 이 접근 방식을 사용하면 Snowflake OAuth 네트워크 정책을 Snowflake 계정에 적용될 수 있는 다른 네트워크 정책과 구분할 수 있습니다.

자세한 내용은 OAuth 및 네트워크 정책 섹션을 참조하십시오.

외부 OAuth로 복제 사용하기

Snowflake는 원본 계정에서 대상 계정으로의 외부 OAuth 보안 통합의 복제 및 장애 조치/장애 복구를 지원합니다.

자세한 내용은 여러 계정에 보안 통합 및 네트워크 정책 복제 섹션을 참조하십시오.

절차 테스트하기

Azure AD를 인증 서버로 사용하여 OAuth를 테스트하려면 다음을 수행해야 합니다.

  1. 테스트 사용자가 Azure AD에 있고 비밀번호가 설정되었는지 확인합니다.

  2. login_name 속성 값이 <AZURE_AD_USER_USERNAME> 으로 설정된 테스트 사용자가 Snowflake에 있는지 확인합니다.

  3. 이 사용자에게 SYSADMIN 역할의 권한을 부여합니다.

  4. OAuth 클라이언트를 등록합니다.

  5. 다음과 같이 OAuth 클라이언트가 Azure AD 토큰 엔드포인트에 POST 요청을 할 수 있도록 허용합니다.

    • 리소스 소유자로 설정된 권한 부여 타입

    • clientID 및 시크릿이 포함된 HTTP 기본 인증 헤더

    • 사용자의 사용자 이름 및 비밀번호가 포함된 FORM 데이터

    • 범위 포함

cURL을 사용하여 액세스 토큰을 획득하는 예는 다음과 같습니다. 범위는 Azure App URI(예: scope=https://example.com/wergheroifvj25/session:role-any)를 포함하여 정규화되어야 합니다.

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --data-urlencode "client_id=<OAUTH_CLIENT_ID>" \
  --data-urlencode "client_secret=<OAUTH_CLIENT_SECRET>" \
  --data-urlencode "username=<AZURE_AD_USER>" \
  --data-urlencode "password=<AZURE_AD_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=<AZURE_APP_URI+AZURE_APP_SCOPE>" \
  '<AZURE_AD_OAUTH_TOKEN_ENDPOINT>'

외부 OAuth를 사용하여 Snowflake에 연결하기

보안 통합을 구성하고 액세스 토큰을 얻은 후에는 다음 중 하나를 사용하여 Snowflake에 연결할 수 있습니다.

다음 사항을 참고하십시오.

  • authenticator 매개 변수를 oauth 로 설정하고 token 매개 변수를 external_oauth_access_token 으로 설정해야 합니다.

  • token 값을 URL 쿼리 매개 변수로 전달할 때는 token 값을 URL로 인코딩해야 합니다.

  • token 값을 속성 오브젝트(예: JDBC 드라이버)로 전달할 때는 수정할 필요가 없습니다.

예를 들어, Python Connector를 사용하는 경우에는 연결 문자열을 아래와 같이 설정해야 합니다.

ctx = snowflake.connector.connect(
   user="<username>",
   host="<hostname>",
   account="<account_identifier>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)

이제 외부 OAuth을 사용하여 안전하게 Snowflake에 연결할 수 있습니다.

맨 위로 이동