External OAuth용 PingFederate 구성

External OAuth용 PingFederate 구성

이 주제는 Snowflake를 OAuth 리소스로, Ping Identity PingFederate를 External OAuth 인가 서버로 구성하여 Snowflake 데이터에 안전하고 프로그래매틱하게 접근하는 방법을 설명해요.

출처: Configure PingFederate for External OAuth

본문

구성 절차

아래의 두 단계는 환경에 PingFederate OAuth 인가 서버, OAuth 클라이언트, 스코프, 필요한 메타데이터와 관련된 구성이 없다고 가정해요. 이 단계는 PingFederate를 구성하는 방법의 대표적인 예시이기도 해요. 첫 단계에서 얻은 정보는 Snowflake에서 보안 통합을 만들 때 사용돼요.

이미 PingFederate 인가 서버와 클라이언트를 구성했다면 아래의 모든 단계를 완료할 필요는 없어요. 첫 단계를 훑어보고 원하는 정보를 얻을 수 있고, 스코프를 만들고, 하나 이상의 정책에 스코프를 할당하고, 메타데이터에 접근할 수 있는지 확인하세요.

PingFederate OAuth 인가 서버와 클라이언트를 구성하지 않았다면 두 단계를 모두 완료하세요.

중요 사항

이 주제의 단계는 External OAuth용 PingFederate를 구성하는 대표적인 예시예요. (이 주제의) 보안 통합에 필요한 정보를 얻을 수만 있다면 PingFederate를 원하는 상태로 구성하고 원하는 OAuth 흐름을 사용할 수 있어요.

아래 단계는 Snowflake에서 보안 통합을 만들기 위해 필요한 정보를 얻는 데 도움이 되는 가이드 역할을 해요. 인가 서버 구성과 관련해서 조직이 모든 필수 규정과 규정 준수 요구 사항을 충족하도록 내부 보안 정책을 반드시 확인하세요.

1단계는 OAuth 2.0에 관한 PingIdentity 문서에서 파생됐어요. PingIdentity가 인가 서버와 관련된 용어, 사용자 인터페이스, 옵션을 정의하는 방식에 대한 자세한 내용은 다음 PingIdentity 가이드를 참조하세요:

PingFederate 구성

  1. PingFederate Server 다운로드 페이지로 이동해 운영 체제에 따라 PingFederate 인스턴스를 다운로드하거나 업그레이드하세요.
  2. 운영 체제에 맞는 PingFederate 설치 가이드를 사용하세요. 설치 후 PingFederate에 접근하세요.
  3. OAuth Server 패널의 Exclusive Scopes 인터페이스로 이동해 OAuth 스코프를 만들어요.
  4. 스코프로 Snowflake 역할을 추가하려면 역할을 Scope Value에 추가하세요. Snowflake 역할에는 session:role: 접두사가 있어야 해요(예: Snowflake Analyst 역할의 경우 session:role:analyst 입력).
  5. Scope Description 상자에 스코프 설명을 입력하고 Add를 클릭하세요.
  6. OAuth Server 탭으로 이동해 새 클라이언트를 만들어요. 다음 값을 확인하세요:
필드 값
NAME PingFederate OAuth 인가 서버의 친숙한 이름
DESCRIPTION PingFederate OAuth 인가 서버의 친숙한 설명
CLIENT AUTHENTICATION CLIENT SECRET
EXCLUSIVE SCOPES 스코프(즉, Snowflake 역할) 선택
ALLOWED GRANT TYPES Refresh Token과 Resource Owner Password Credentials 선택
DEFAULT ACCESS TOKEN MANAGER JSON Web Tokens
  1. Security 탭으로 이동해 인증서를 내보내요. 다음 단계에서 사용하기 위해 인증서에서 공개 키를 추출하세요.
  2. OAuth Server 탭 아래의 Instance Configuration 탭과 Access Token Management | Create Access Token Management Instance로 이동한 후:
  • ISSUER CLAIM VALUE를 이 OAuth 인가 서버를 참조하는 고유 식별자로 업데이트하세요.
  • AUDIENCE CLAIM VALUE를 Snowflake 계정 URL로 업데이트하세요(예: https://<account_identifier>.snowflakecomputing.com). 가능한 URL 형식 목록은 URL로 연결하기를 참조하세요.
  1. 개발자 도구 섹션에서 PingFederate OAuth Playground 애드온을 다운로드하세요. 이 클라이언트는 API 요청을 수행해요.
  2. OAuth Playground를 설치하세요.

Snowflake에서 보안 통합 만들기

이 단계는 Snowflake가 PingIdentity와 안전하게 통신하고, PingIdentity의 토큰을 검증하며, OAuth 토큰과 연결된 사용자 역할에 따라 사용자에게 적절한 Snowflake 데이터 접근을 제공하도록 Snowflake에서 보안 통합을 만들어요.

Snowflake 웹 인터페이스, Snowflake CLI 또는 SnowSQL에서 다음 명령문을 실행하세요.

external_oauth_issuer 값은 1.8 단계에서 설정한 고유 식별자여야 해요. 예를 들어 고유 식별자 값이 27f10cde-a964-4499-a88c-0c598883e5ad라면 <unique_id>를 '27f10cde-a964-4499-a88c-0c598883e5ad'로 바꾸세요. 고유 식별자는 단일(즉, 세로) 따옴표로 묶어야 해요.

사용 사례와 구성 요구 사항에 가장 잘 맞는 보안 통합을 선택하세요. 자세한 내용은 CREATE SECURITY INTEGRATION을 참조하세요.

계정 관리자(즉, ACCOUNTADMIN 역할 보유자) 또는 전역 CREATE INTEGRATION 권한이 있는 역할만 이 SQL 명령을 실행할 수 있어요.

보안 통합 매개변수 값은 대소문자를 구분하며, 통합에 넣는 값은 환경의 값과 일치해야 해요. 대소문자가 일치하지 않으면 액세스 토큰이 검증되지 않아 인증 시도가 실패할 수 있어요.

PingFederate용 보안 통합 만들기

create or replace security integration external_oauth_pf_1
    type = external_oauth
    enabled = true
    external_oauth_type = ping_federate
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_issuer = '<unique_id>'
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

이 보안 통합은 external_oauth_rsa_public_key 매개변수를 사용해요. Snowflake는 공개 키 값을 사용해 JWT 액세스 토큰의 서명을 검증해요.

audience가 있는 보안 통합 만들기

보안 통합의 external_oauth_audience_list 매개변수는 PingFederate를 구성할 때 지정한 Audience Claim Value와 일치해야 해요.

create security integration external_oauth_pf_2
    type = external_oauth
    enabled=true
    external_oauth_type = ping_federate
    external_oauth_issuer = '<ISSUER>'
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_audience_list = ('<snowflake_account_url>')
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

이 보안 통합은 external_oauth_rsa_public_key 매개변수를 사용해요. Snowflake는 공개 키 값을 사용해 JWT 액세스 토큰의 서명을 검증해요.

External OAuth 보안 통합 수정하기

보안 통합에 ALTER 명령문을 실행해 External OAuth 보안 통합을 업데이트할 수 있어요.

자세한 내용은 ALTER SECURITY INTEGRATION (External OAuth)을 참조하세요.

External OAuth에서 ANY 역할 사용하기

Snowflake에서 보안 통합을 만드는 구성 단계에서 OAuth 액세스 토큰에는 스코프 정의가 포함돼요. 따라서 런타임 시 External OAuth 보안 통합을 사용하면 OAuth 클라이언트나 사용자가 OAuth 액세스 토큰에 정의되지 않은 역할을 사용할 수 없어요.

액세스 토큰을 검증하고 세션을 만든 후에는 ANY 역할이 OAuth 클라이언트와 사용자가 자신의 역할을 결정하도록 허용할 수 있어요. 필요한 경우 클라이언트나 사용자는 OAuth 액세스 토큰에 정의된 역할과 다른 역할로 전환할 수 있어요.

ANY 역할을 구성하려면 스코프를 SESSION:ROLE-ANY로 정의하고 보안 통합을 external_oauth_any_role_mode 매개변수로 구성하세요. 이 매개변수는 세 가지 가능한 문자열 값을 가질 수 있어요:

  • DISABLE — OAuth 클라이언트나 사용자가 역할을 전환할 수 없게 해요(즉, use role role;). 기본값.
  • ENABLE — OAuth 클라이언트나 사용자가 역할을 전환할 수 있게 해요.
  • ENABLE_FOR_PRIVILEGE — USE_ANY_ROLE 권한이 있는 클라이언트나 사용자만 역할을 전환할 수 있게 해요. 이 권한은 사용자에게 제공되는 하나 이상의 역할에 부여하거나 철회할 수 있어요. 예를 들어:
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'
    ...

External OAuth에서 2차 역할 사용하기

주 역할에 대한 원하는 스코프는 외부 토큰에 전달돼요: 사용자의 기본 역할(session:role-any)이거나 사용자에게 부여된 특정 역할(session:role:role_name)이에요.

기본적으로 Snowflake는 세션에서 사용자의 기본 2차 역할(즉, DEFAULT_SECONDARY_ROLES)을 활성화하지 않아요.

세션에서 사용자의 기본 2차 역할을 활성화하고 External OAuth를 사용하는 동안 USE SECONDARY ROLES 명령을 실행할 수 있게 하려면 다음 단계를 완료하세요:

  1. 연결에 대한 보안 통합을 구성해요. 보안 통합을 만들 때([CREATE SECURITY INTEGRATION] 사용) 또는 나중에([ALTER SECURITY INTEGRATION] 사용) EXTERNAL_OAUTH_ANY_ROLE_MODE 매개변수 값을 ENABLE 또는 ENABLE_FOR_PRIVILEGE로 설정하세요.
  2. 인가 서버가 토큰의 scope 속성에 session:role-any의 정적 값을 전달하도록 구성하세요. scope 매개변수에 대한 자세한 내용은 External OAuth 개요를 참조하세요.

External OAuth에서 네트워크 정책 사용하기

현재 네트워크 정책은 External OAuth 보안 통합에 추가할 수 없어요. 하지만 전체 Snowflake 계정에 광범위하게 적용되는 네트워크 정책은 여전히 구현할 수 있어요.

OAuth 보안 통합에 특정한 네트워크 정책이 필요한 사용 사례라면 Snowflake OAuth를 사용하세요. 이렇게 하면 Snowflake OAuth 네트워크 정책을 Snowflake 계정에 적용될 수 있는 다른 네트워크 정책과 구별할 수 있어요.

자세한 내용은 Snowflake OAuth 네트워크 트래픽 제한을 참조하세요.

External OAuth에서 복제 사용하기

Snowflake는 소스 계정에서 대상 계정으로의 External OAuth 보안 통합 복제 및 장애 조치/장애 복구를 지원해요.

자세한 내용은 여러 계정에 걸친 보안 통합 및 네트워크 정책 복제를 참조하세요.

테스트 절차

PingFederate를 인가 서버로 사용하면서 OAuth를 테스트할 때는 다음을 수행해야 해요:

  1. 테스트 사용자가 PingIdentity에 존재하고 비밀번호가 있는지 확인하세요.
  2. 테스트 사용자가 Snowflake에 login_name 속성 값이 <PING_USER_USERNAME>으로 설정된 상태로 존재하는지 확인하세요.
  3. 이 사용자에게 Analyst 역할을 부여하세요.
  4. OAuth 클라이언트를 등록하세요.
  5. OAuth 클라이언트가 다음과 같이 PingFederate 토큰 엔드포인트에 POST 요청을 하도록 허용하세요:
  • Grant type을 Resource Owner로 설정.
  • clientID와 secret이 포함된 HTTP Basic Authorization 헤더.
  • 사용자의 username과 password가 포함된 FORM 데이터.
  • 필요한 스코프 포함.

샘플 명령은 Analyst 역할을 요청하며 PingFederate > OAuth Server > Exclusive Scopes에 session:role:analyst가 정의돼 있다고 가정해요.

Ping에서 액세스 토큰을 얻으려면 다음 명령을 사용하세요:

curl -k 'https://10.211.55.4:9031/as/token.oauth2' \
  --data-urlencode 'client_id=<CLIENT_ID>&grant_type=password&username=<USERNAME>&password=<PASSWORD>&client_secret=<CLIENT_SECRET>&scope=session:role:analyst'

External OAuth로 Snowflake 연결하기

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

다음 사항에 유의하세요:

  • authenticator 매개변수를 oauth로, token 매개변수를 external_oauth_access_token으로 설정해야 해요.
  • token 값을 URL 쿼리 매개변수로 전달할 때는 token 값을 URL 인코딩해야 해요.
  • token 값을 Properties 객체(예: JDBC 드라이버)에 전달할 때는 수정이 필요 없어요.

예를 들어 Python 커넥터를 사용한다면 연결 문자열을 아래처럼 설정하세요:

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"
)

이제 External OAuth를 사용해 Snowflake에 안전하게 연결할 수 있어요.

더 알아보기