SAML 2.0 연합 인증 구성하기

SAML 2.0 연합 인증 구성하기

SAML2 보안 통합을 사용해 Snowflake를 연합 인증용으로 구성하는 방법을 설명해요. OpenID Connect(OIDC)는 OpenID Connect(OIDC) 연합 인증 구성을 참고해요. 이 주제는 IdP를 Snowflake와 함께 작동하도록 이미 구성했다고 가정해요.

출처: Snowflake 문서

본문

참고(Note): SAML2 보안 통합은 더 이상 사용되지 않는 SAML_IDENTITY_PROVIDER 계정 파라미터를 대체해요. 이 더 이상 사용되지 않는 계정 파라미터를 사용하는 기존 SSO 구현이 있다면 Snowflake를 연합 인증용으로 계속 구성하기 전에 SAML 보안 통합으로 마이그레이션해야 해요. Snowflake는 이 계정 파라미터를 사용하는 구현이 있는 한 계속 지원할 거예요.

SAML2 보안 통합 생성

Snowflake는 연합 인증을 구현하는 데 사용하는 IdP와 통합하기 위해 SAML2 보안 통합을 사용해요. SSO용 Snowflake 구성을 시작하려면 CREATE SECURITY INTEGRATION 명령을 사용해요.

시작하기 전에:

  • SSO용 IdP를 구성할 때 Snowflake 계정의 URL을 제공했어요. 이 URL의 형식은 보안 통합의 SAML2_SNOWFLAKE_ISSUER_URL 및 SAML2_SNOWFLAKE_ACS_URL 속성의 URL과 일치해야 해요. 보안 통합을 만들 때 이 속성을 정의하지 않으면 계정의 레거시 URL로 기본 설정돼요.
  • SAML2_SNOWFLAKE_ACS_URL 속성의 URL에는 /fed/login이 추가된다는 점을 주목해요.
  • IdP에 대한 정보를 Snowflake에 제공하는 선호 방법은 통합의 METADATA_URL 파라미터로 IdP의 메타데이터 URL을 지정하는 것이에요. Snowflake는 메타데이터 URL을 사용해 IdP의 구성 설정(인증서 포함)을 동적으로 얻어요.
    • IdP의 메타데이터 URL을 정의하면 통합의 파라미터를 변경하지 않고도 ALTER SECURITY INTEGRATION REFRESH METADATA_URL 명령을 실행해 IdP의 구성 설정을 새로고침할 수 있어요. 이렇게 하면 인증서 회전이 단순해져요.

예를 들어 개인 연결을 사용하는 계정 이름 URL을 사용하는 보안 통합을 만들려면 다음 SQL 명령을 실행해요.

CREATE SECURITY INTEGRATION my_idp
  TYPE = saml2
  ENABLED = true
  METADATA_URL = 'https://integrator-26580.okta.com/app/ex2kbcS30N697/sso/saml/metadata'
  SAML2_SNOWFLAKE_ISSUER_URL = 'https://<orgname>-<account_name>.privatelink.snowflakecomputing.com'
  SAML2_SNOWFLAKE_ACS_URL = 'https://<orgname>-<account_name>.privatelink.snowflakecomputing.com/fed/login';

SAML2 보안 통합을 구성한 후 보안 통합을 사용해 다음 작업을 할 수 있어요.

  • SAML 어서션(Assertion) 암호화
  • 서명된 SAML 요청 보내기
  • SAML NameID 형식 지정
  • SAML2 보안 통합 메타데이터 내보내기
  • Snowflake 재인증 강제 절차

참고(Note): 계정이 Business Critical Edition 이상이라면 Client Redirect와 함께 SAML2 보안 통합을 사용할 수 있어요. 자세한 내용은 클라이언트 연결 리디렉션을 참고해요.

사용자용 SSO 로그인 구성

SAML2 보안 통합을 만든 후 사용자가 IdP에서 or Snowflake에서 SSO 로그인을 시작할지 구성할 수 있어요.

IdP 시작 SSO는 Snowflake에서 구성이 필요하지 않아요. 사용자에게 Snowflake에 접근하는 방법만 알려주면 돼요(예: 내부 포털 사용).

saml2 보안 통합의 SAML2_ENABLE_SP_INITIATED 속성은 Snowflake 시작 SSO를 활성화해요. SAML2_SP_INITIATED_LOGIN_PAGE_LABEL 속성은 IdP를 식별하는 문자열을 정의해요. 이 문자열은 Snowflake 로그인 페이지에 나타나 사용자가 IdP에 접근할 수 있게 해요.

ALTER SECURITY INTEGRATION 명령을 사용해 이 속성을 설정해요.

ALTER SECURITY INTEGRATION my_idp SET SAML2_ENABLE_SP_INITIATED = true;
ALTER SECURITY INTEGRATION my_idp SET SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'My IdP';

사용자용 SSO 로그인을 구성한 후 클라이언트가 Snowflake에 연결하는 방법은 Snowflake에 연결하는 클라이언트 애플리케이션과 SSO 사용을 참고해요.

SAML 어서션 암호화

SAML2_SNOWFLAKE_X509_CERT 속성은 SAML2 어서션이 Snowflake의 공개 인증서로 암호화되도록 보장하여, 사용자가 연합 인증을 통해 Snowflake에 접근할 때 트래픽을 보호해요.

고객 IdP로부터 암호화된 어서션을 받은 후 Snowflake는 개인 키로 암호화된 어서션을 복호화해요. Snowflake는 개인 키를 절대 내보내거나 공개하지 않아요.

SAML 어서션을 암호화하려면 아래 섹션을 참고해요.

Snowflake에서 공개 인증서 내보내기

SAML2 보안 통합을 만든 후 다음 단계를 따라요.

  • SAML2 통합에서 다음 SQL 문을 실행해요.
DESC SECURITY INTEGRATION my_idp;
  • 7행에서 SAML2_SNOWFLAKE_X509_CERT 값을 찾아요. 이것은 PEM 형식의 공개 인증서예요.
  • BEGIN CERTIFICATE와 END CERTIFICATE 구분자를 포함해 값을 저장해요. 예를 들어 아래 코드블록은 PEM 형식의 잘린 인증서를 포함해요.
-----BEGIN CERTIFICATE-----
MIICr...
-----END CERTIFICATE-----

인증서 서명 요청(CSR) 생성 — 선택 사항

기본적으로 Snowflake의 SAML2 보안 통합은 SAML IdP가 SAML 어서션을 암호화하는 데 사용하는 자체 서명 인증서를 사용해요. 조직에서 CA(인증 기관)가 발급한 인증서를 사용해야 한다면 다음 단계를 완료해요.

  • SYSTEM$GENERATE_SAML_CSR 시스템 함수를 사용해 Snowflake에서 인증서 서명 요청(CSR)을 만들어요.
  • 인증서가 발급되도록 선택한 CA에 CSR을 제공해요.
  • BEGIN CERTIFICATE와 END CERTIFICATE 구분자 없이 다음 ALTER 문을 사용해 Base64 인코딩된 인증서를 SAML 통합에 업로드해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_SNOWFLAKE_X509_CERT = 'AX2bv...';
DESC SECURITY INTEGRATION my_idp;

그런 다음 함수가 생성한 CSR로 만든 개인 키용 인증서를 Snowflake에 업로드할 수 있어요.

SAML IdP 구성

  • 저장된 PEM 형식 인증서를 조직의 IdP에 SAML 암호화 인증서로 업로드해요.
  • IdP가 Snowflake 서비스 제공자(SP)에 대해 SAML 어서션을 암호화하도록 구성해요.

서명된 SAML 요청 보내기

Snowflake에서 IdP로 서명된 SAML 요청을 보내 Snowflake가 진정한 서비스 제공자임을 검증할 수 있어요. Snowflake를 검증하려면 SAML2 보안 통합에 저장된 인증서를 사용해 SAML 요청이 Snowflake가 아닌 Snowflake를 사칭하는 서드파티가 아니라 Snowflake에서 비롯되었는지 확인하도록 IdP를 구성할 수 있어요.

SAML2_SIGN_REQUEST 속성 설정

SAML2 보안 통합을 처음 만들 때 SAML2_SIGN_REQUEST 속성을 설정해야 해요.

SAML2_SIGN_REQUEST 속성 없이 SAML2 보안 통합을 만들었다면 다음 단계를 따라요.

ALTER SECURITY INTEGRATION my_idp SET SAML2_SIGN_REQUEST = true;
DESC SECURITY INTEGRATION my_idp;

IdP가 서명된 요청을 수락하도록 구성

Snowflake의 서명된 요청을 수락하도록 IdP를 구성해요. 구성하는 동안 IdP는 SAML2_SNOWFLAKE_X509_CERT 속성에 저장된 인증서를 보유해야 해요. IdP는 이 인증서를 사용해 SAML 요청이 Snowflake에서 비롯되었는지 확인해요.

참고(Note): Snowflake는 IdP 구성에 책임이 없어요. IdP 구성에 대한 도움은 내부 보안 관리자에게 문의해 주세요.

DESC SECURITY INTEGRATION my_idp;

SAML NameID 형식 지정

Snowflake는 관리자(즉 ACCOUNTADMIN 역할을 가진 사용자)가 Snowflake에서 IdP로 보내는 나가는 SAML 인증 요청에서 요청될 SAML NameID 형식을 지정할 수 있게 지원해요.

SAML NameID 형식을 지정하면 Snowflake는 IdP의 SAML 어서션에서 사용자(SAML Subject)의 식별 속성에 대한 기대치를 설정해 Snowflake에 유효한 인증을 보장할 수 있어요.

SAML NameID 형식은 SAML2 보안 통합에 통합할 수 있어요. 다음 값 중 하나를 사용해 보안 통합에서 SAML NameID를 지정할 수 있어요.

  • urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
  • urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
  • urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
  • urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName
  • urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos
  • urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
  • urn:oasis:names:tc:SAML:2.0:nameid-format:transient

SAML NameID 형식을 지정하지 않으면 Snowflake는 다음 값을 사용해요.

urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

SAML2_REQUESTED_NAMEID_FORMAT 속성 설정

SAML2 보안 통합을 처음 만들 때 SAML2_REQUESTED_NAMEID_FORMAT 속성을 설정해야 해요.

SAML2_REQUESTED_NAMEID_FORMAT 속성 없이 SAML2 보안 통합을 만들었다면 다음 단계를 따라요.

ALTER SECURITY INTEGRATION my_idp SET SAML2_REQUESTED_NAMEID_FORMAT = '<string_literal>';
DESC SECURITY INTEGRATION my_idp;

IdP가 NameID를 지정하도록 구성

IdP가 SAML 어서션에서 SAML NameID 형식을 지정하도록 구성해요.

참고(Note): Snowflake는 IdP 구성에 책임이 없어요. IdP 구성에 대한 도움은 내부 보안 관리자에게 문의해 주세요.

SAML2 보안 통합 메타데이터 내보내기

Snowflake는 SAML2 보안 통합에 대한 SAML 2.0 메타데이터를 제공해 IdP에서 Snowflake 서비스 제공자를 구성하는 것을 용이하게 해요.

SAML 2.0 메타데이터는 SAML2_SNOWFLAKE_METADATA 속성에 포함되며, SAML2 보안 통합에서 DESCRIBE INTEGRATION 명령을 실행해 얻을 수 있어요. 예를 들어:

DESC SECURITY INTEGRATION my_idp;
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+
              property              | property_type |                               property_value                                | property_default |
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+
SAML2_X509_CERT                     | String        | MIICr...                                                                    |                  |
SAML2_PROVIDER                      | String        | OKTA                                                                        |                  |
SAML2_ENABLE_SP_INITIATED           | Boolean       | false                                                                       | false            |
SAML2_SP_INITIATED_LOGIN_PAGE_LABEL | String        | my_idp                                                                      |                  |
SAML2_SSO_URL                       | String        | https://okta.com/sso                                                        |                  |
SAML2_ISSUER                        | String        | https://okta.com                                                            |                  |
SAML2_SNOWFLAKE_X509_CERT           | String        | MIICr...                                                                    |                  |
SAML2_REQUESTED_NAMEID_FORMAT       | String        | urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress                      |                  |
SAML2_SNOWFLAKE_ACS_URL             | String        | https://example.snowflakecomputing.com/fed/login                            |                  |
SAML2_SNOWFLAKE_ISSUER_URL          | String        | https://example.snowflakecomputing.com                                      |                  |
SAML2_SNOWFLAKE_METADATA            | String        | <md:EntityDescriptor entityID="https://example.snowflakecomputing.com"> ... |                  |
SAML2_DIGEST_METHODS_USED           | String        | http://www.w3.org/2001/04/xmlenc#sha256                                     |                  |
SAML2_SIGNATURE_METHODS_USED        | String        | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256                           |                  |
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+

대표적인 예시로, SAML2_SNOWFLAKE_METADATA 속성의 형식화된 SAML 2.0 XML 메타데이터가 아래에 나와있어요. signing 및 encryption에 대한 X509certificate 값은 잘렸다는 점을 주목해요.

<md:EntityDescriptor xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" entityID="https://example.snowflakecomputing.com">
 <md:SPSSODescriptor AuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
  <md:KeyDescriptor use="signing">
    <dsig:KeyInfo>
      <dsig:X509Data>
        <dsig:X509Certificate>MIICr...</dsig:X509Certificate>
      </dsig:X509Data>
    </dsig:KeyInfo>
  </md:KeyDescriptor>
  <md:KeyDescriptor use="encryption">
    <dsig:KeyInfo>
      <dsig:X509Data>
        <dsig:X509Certificate>MIICr...</dsig:X509Certificate>
      </dsig:X509Data>
    </dsig:KeyInfo>
  </md:KeyDescriptor>
  <md:AssertionConsumerService index="0" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://example.snowflakecomputing.com/fed/login" />
 </md:SPSSODescriptor>
</md:EntityDescriptor>

참고로 다음 표는 XML 메타데이터 태그를 Snowflake SAML2 보안 통합 속성에 매핑해요.

XML 출력 SAML2 보안 통합 속성
entityID SAML2_SNOWFLAKE_ISSUER_URL
AuthnRequestsSigned SAML2_SIGN_REQUEST
Signing Certificate SAML2_SNOWFLAKE_X509_CERT
Encryption Certificate SAML2_SNOWFLAKE_X509_CERT
Assertion Consumer Service URL SAML2_SNOWFLAKE_ACS_URL

Snowflake 재인증 강제

Snowflake는 초기 인증 SSO 흐름 중 또는 현재 Snowflake 세션이 만료되었을 때 인증 사용자가 Snowflake에 접근하기 위해 재인증하도록 요구하도록 SAML2 보안 통합을 구성하는 것을 지원해요.

Snowflake SAML2 보안 통합에서 이 기능을 활성화하면 Snowflake는 Snowflake에서 IdP로 보내는 나가는 SAML 요청에서 SAML 사양 ForceAuthn 속성을 True로 설정해요. IdP가 ForceAuthn 속성이 True로 설정된 요청을 받으면 IdP는 Snowflake에 요청을 보내고, 결과적으로 사용자에게 Snowflake에 접근하기 위해 인증 자격 증명(예: 사용자 이름, 비밀번호)을 다시 입력하라는 프롬프트가 표시돼요.

이 기능은 재인증을 통한 강화된 보안을 제공해요. 추가로 재인증 프롬프트를 통해 사용자는 SSO를 시작하는 데 사용된 것과 다른 자격 증명 집합을 입력해 Snowflake에 접근할 수 있어요.

중요(Important): 이 기능을 구현하기 전에 IdP가 SSO 인증 흐름 중 신원 전환을 지원하는지 확인해요. 이 기능이 Snowflake에 구현되었고 IdP가 초기 SSO 인증 흐름 중 신원 전환을 지원하지 않으면 사용자는 재인증 프롬프트에 제공한 다른 자격 증명 집합으로 Snowflake에 접근하지 못할 수 있어요.

SAML2 보안 통합을 처음 만들 때 SAML2_FORCE_AUTHN 속성을 설정해야 해요.

Snowflake에 접근하기 위한 강제 재인증을 지원하도록 기존 SAML2 보안 통합을 업데이트하려면 다음 단계를 따라요.

ALTER SECURITY INTEGRATION my_idp SET SAML2_FORCE_AUTHN = true;
DESC SECURITY INTEGRATION my_idp;

여기서:

SAML2_FORCE_AUTHN = TRUE | FALSE

초기 인증 흐름 중 사용자가 Snowflake에 접근하기 위해 다시 인증하도록 강제되는지 여부를 나타내는 Boolean이에요. TRUE로 설정하면 Snowflake는 Snowflake에서 ID 공급자로 보내는 나가는 요청에서 ForceAuthn SAML 속성을 TRUE로 설정해요.

  • TRUE는 ID 공급자와 유효한 세션이 이미 있어도 사용자가 Snowflake에 접근하기 위해 다시 인증하도록 강제해요.
  • FALSE는 사용자가 Snowflake에 접근하기 위해 다시 인증하도록 강제하지 않아요.

기본값: FALSE.

커스텀 로그아웃 엔드포인트

Snowflake는 사용자가 Snowflake에서 로그아웃한 후 리디렉션할 커스텀 엔드포인트 URL을 정의하는 것을 지원해요. 엔드포인트는 SAML2 보안 통합의 SAML2_POST_LOGOUT_REDIRECT_URL 속성을 통해 설정돼요.

SAML SSO를 통해 Snowflake에 접근하는 사용자에게 활성화되면 Snowsight에서 Log Out 버튼을 클릭하면 Snowflake가 Snowflake 세션을 종료하고 사용자를 지정된 엔드포인트로 리디렉션해요.

중요(Important): 이 동작은 Snowsight에는 적용되지 않아요.

로그아웃 엔드포인트를 정의하면 관리자가 Snowflake에서 로그아웃한 후 사용자가 리디렉션되는 곳을 제어할 수 있어요. 예를 들어 커스텀 엔드포인트가 스크립트를 트리거해 IdP 세션을 동시에 종료할 수 있어요. 이 구현의 장점은 Snowflake와 IdP 세션이 모두 종료되어 사용자가 Snowflake에 접근하려면 IdP에 다시 인증해야 한다는 점이에요.

SAML2 보안 통합을 처음 만들 때 SAML2_POST_LOGOUT_REDIRECT_URL 속성을 설정해야 해요.

SAML2_POST_LOGOUT_REDIRECT_URL 속성 없이 SAML2 보안 통합을 만들었다면 ALTER SECURITY INTEGRATION 명령을 실행해 커스텀 로그아웃 엔드포인트를 구성해요.

ALTER SECURITY INTEGRATION my_idp SET SAML2_POST_LOGOUT_REDIRECT_URL = 'https://logout.example.com';

SAML2 보안 통합 관리

ALTER SECURITY INTEGRATION 명령을 사용해 SAML2 보안 통합을 관리할 수 있어요. 예를 들어:

  • 기존 SAML2 보안 통합에 X.509 인증서를 문자열로 업데이트해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_X509_CERT = 'AX2bv...';
  • IdP가 SAML 요청 서명을 검증하거나 SAML 응답을 암호화하도록 구성한 고객이라면 기존 개인 키와 자체 서명 인증서를 덮어쓰고 새 개인 키와 자체 서명 인증서를 생성할 수 있어요.
    • 새 개인 키를 생성해요.

주의(Caution): 아래 명령을 실행하면 IdP가 여전히 이전 SAML2_SNOWFLAKE_X509_CERT 인증서를 사용하므로 SAML 인증이 작동을 멈춰요. 중단을 최소화하려면 사용자가 덜 활동적인 때 아래 명령을 실행해야 해요.

ALTER SECURITY INTEGRATION my_idp REFRESH SAML2_SNOWFLAKE_PRIVATE_KEY;
  • 보안 통합의 SAML2_SNOWFLAKE_X509_CERT 속성 값을 검색해요.
DESCRIBE SECURITY INTEGRATION my_idp;
SELECT "property_value" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
  WHERE "property" = 'SAML2_SNOWFLAKE_X509_CERT';
  • 검색한 값을 IdP에 업로드해 IdP에서 이전 인증서를 새 인증서로 교체해요.
  • 서명된 요청을 활성화해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_SIGN_REQUEST = true;
  • NameID 형식을 지정해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_REQUESTED_NAMEID_FORMAT = 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified';
  • 기존 보안 통합을 업데이트해 강제 재인증을 활성화해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_FORCE_AUTHN = true;
  • 기존 보안 통합을 업데이트해 강제 재인증을 비활성화해요.
ALTER SECURITY INTEGRATION my_idp UNSET SAML2_FORCE_AUTHN;
  • 커스텀 로그아웃 엔드포인트를 업데이트해요.
ALTER SECURITY INTEGRATION my_idp SET SAML2_POST_LOGOUT_REDIRECT_URL = 'https://logout.example.com';

자세한 내용은 ALTER SECURITY INTEGRATION을 참고해요.

SSO 구성 복제

Snowflake는 SAML2 보안 통합과 OIDC 보안 통합을 소스 계정에서 대상 계정으로 복제하고 장애 조치/장애 복구를 지원해요.

자세한 내용은 여러 계정 간 보안 통합 및 네트워크 정책 복제를 참고해요.

더 알아보기 (Learn more)