정책으로 보호되는 데이터 공유하기

데이터 공유 컨슈머는 이 미리 보기를 통해 공유 데이터베이스 역할을 사용하여 마스킹 정책 또는 행 액세스 정책으로 보호되는 공유 데이터에 액세스할 수 있습니다.

개요

데이터 공유 공급자가 마스킹 정책 또는 행 액세스 정책의 조건에서 IS_DATABASE_ROLE_IN_SESSION 컨텍스트 함수를 사용하여 데이터 공유 컨슈머가 다음 정책 중 하나로 보호되는 공유 데이터에 액세스할 수 있습니다. 이를 통해 공급자에게 더 많은 데이터 공유 옵션을 제공하고 컨슈머가 공급자가 제공하는 민감한 데이터에 액세스하도록 허용합니다.

공급자는 정책과 공유 오브젝트를 단일 데이터베이스나 다른 데이터베이스에 그룹화하도록 선택할 수 있습니다. 정책과 보호된 테이블이 서로 다른 데이터베이스에 있는 경우 공급자는 다음을 수행해야 합니다.

  • 컨슈머 계정에 두 데이터베이스를 모두 공유합니다.

  • 정책과 동일한 데이터베이스에 데이터베이스 역할을 만듭니다.

  • 정책이 포함된 공유에 데이터베이스 역할을 부여합니다.

컨슈머가 공유에서 데이터베이스를 생성하면 공유의 데이터베이스 역할이 공유에서 데이터베이스를 생성하는 역할에 부여됩니다. 이를 통해 컨슈머 계정의 계정 역할이 데이터베이스 역할을 지정하고 공유 데이터에 액세스하는 정책 조건을 충족할 수 있습니다.

정책으로 보호되는 공유 데이터에 액세스하려면 컨슈머는 공유 데이터베이스 역할이 포함된 데이터베이스를 지정하여 현재 세션에서 공유 데이터베이스 역할을 활성화해야 합니다. 이러한 맥락에서, 데이터베이스 역할을 활성화한다는 것은 사용자에 대한 현재 역할의 역할 계층 구조에서 데이터베이스 역할을 사용할 수 있다는 의미입니다. 이 공유 데이터베이스를 지정하지 않으면 컨슈머 계정의 사용자는 정책으로 보호되는 공유 데이터에 액세스할 수 없습니다. 다음 옵션 중 하나를 사용하여 이 데이터베이스를 지정할 수 있습니다.

  • USE <오브젝트> 명령으로 세션에서 데이터베이스를 활성화하거나 워크시트에서 데이터베이스를 선택합니다. 예:

    USE DATABASE mounted_db;
    
    Copy

    mounted_db 는 컨슈머가 공유에서 생성하는 데이터베이스의 이름입니다.

  • 특정 쿼리의 경우 데이터베이스 역할과 동일한 데이터베이스에 있는 오브젝트의 정규화된 이름을 사용합니다. 예:

    SELECT * FROM mounted_db.myschema.mytable;
    
    Copy

함수 호출

IS_DATABASE_ROLE_IN_SESSION 컨텍스트 함수에서 인자를 지정하는 방법에는 문자열 리터럴 또는 비리터럴(즉, 열 이름)이라는 두 가지 다른 방법이 있습니다.

  • IS_DATABASE_ROLE_IN_SESSION 컨텍스트 함수에서 데이터베이스 역할을 문자열 로 지정할 경우 함수 호출 결과는 함수 호출 방식에 따라 달라집니다. 예:

    • 워크시트에서 Snowflake는 세션에 사용 중인 데이터베이스나 쿼리에 지정된 데이터베이스를 살펴봅니다. 이는 공급자 계정과 컨슈머 계정에 모두 적용됩니다.

    • 정책, UDF 또는 뷰에서 Snowflake는 정책이 공유될 때 정책이 정의된 데이터베이스를 살펴봅니다. 정책이 공유되지 않은 경우 데이터베이스 역할 조회로 인해 데이터베이스 역할이 다른 데이터베이스에 정의되면 Snowflake는 오류를 반환합니다.

      A Role Context Function cannot reference a DB Role in another database.
      
      Copy
  • IS_DATABASE_ROLE_IN_SESSION 컨텍스트 함수에서 열 이름을 인자 로 지정하는 경우:

    • 테이블 쿼리가 함수를 호출하는 경우 열은 해당 열이 포함된 테이블의 테이블 식별자에 매핑됩니다. 그런 다음 Snowflake는 테이블이 포함된 데이터베이스에서 데이터베이스 역할을 살펴봅니다. 예를 들어 AUTHZ_ROLE(즉, 권한이 부여된 역할) 열을 인자로 지정하려면 다음을 수행하십시오.

      SELECT * FROM mydb.myschema.t WHERE IS_DATABASE_ROLE_IN_SESSION(AUTHZ_ROLE);
      
      Copy
    • 마스킹 정책, 행 액세스 정책 또는 UDF이 함수를 호출하는 경우 정책 또는 UDF가 포함된 데이터베이스에서 조회가 발생합니다.

일반 워크플로

정책으로 보호된 데이터를 정책의 IS_DATABASE_ROLE_IN_SESSION 함수와 공유하려면 함수를 호출하고 데이터를 공유하는 정책을 만드는 것과 동일한 단계를 따라야 합니다. 요약하자면 다음과 같습니다.

  1. 공급자가 계정 역할을 생성합니다.

  2. 공급자가 정책을 생성하고 테이블이나 열에 정책을 설정합니다.

  3. 공급자가 계정 역할로 정책을 테스트합니다.

  4. 공급자가 데이터베이스 역할을 생성하고 데이터베이스 역할로 정책을 테스트합니다.

  5. 공급자가 공유를 생성하고 공유에 데이터베이스 역할을 부여하는 것을 포함하여 공유에 권한을 부여합니다.

  6. 컨슈머가 공유(즉, 탑재된 데이터베이스)에서 데이터베이스를 생성합니다.

  7. 컨슈머가 정책으로 보호되는 공유 오브젝트를 쿼리합니다.

예: 동일한 데이터베이스의 모든 오브젝트

이 예에서는 데이터베이스 역할, 마스킹 정책, 보호된 테이블이 모두 mydb 라는 동일한 데이터베이스에 있습니다.

다음을 참조하십시오.

  • 데이터베이스 역할은 mydb.analystmydb.support 입니다.

  • 마스킹 정책은 다음과 같이 정의됩니다.

    CREATE OR REPLACE MASKING POLICY mydb.policies.email_mask
      AS (val string) RETURNS string ->
      CASE
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.ANALYST')
          THEN val
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.SUPPORT')
          THEN REGEXP_REPLACE(val,'.+\@','*****@')
        ELSE '********'
      END
      COMMENT = 'use database role for shared data'
      ;
    
    Copy
  • EMAIL 열은 mydb.tables.empl_info 라는 테이블에 있으며 마스킹 정책은 이 열에 설정됩니다.

데이터베이스 mydb 를 공유하고 컨슈머가 공유 데이터베이스 역할을 사용하여 공유 마스킹 정책으로 보호되는 공유 데이터를 쿼리할 수 있도록 허용하려면 다음 단계를 완료하십시오. 이러한 단계에서는 공급자가 계정 역할 및 데이터베이스 역할로 EMAIL 열에 대한 마스킹 정책을 이미 테스트한 것으로 가정합니다.

  1. 공급자 계정에서 CREATE SHARE 명령을 실행하여 mydb.analyst_share 데이터베이스 역할의 공유를 생성합니다.

    USE ROLE r1;
    CREATE SHARE analyst_share;
    
    Copy
  2. 공유에 권한을 부여합니다. 각 공유에 동일한 권한이 필요합니다.

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.policies TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.tables TO SHARE analyst_share;
    GRANT SELECT ON TABLE mydb.tables.empl_info TO SHARE analyst_share;
    GRANT DATABASE ROLE mydb.analyst TO SHARE analyst_share;
    
    Copy
  3. 공유에 컨슈머 계정을 추가합니다.

    ALTER SHARE analyst_share ADD ACCOUNTS = consumer_account;
    
    Copy
  4. 컨슈머 계정에서 계정 역할 r1 을 생성하고 이 역할에 공유를 가져올 수 있는 권한을 부여합니다.

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  5. 공유를 가져옵니다.

    USE ROLE r1;
    CREATE DATABASE mounted_db FROM SHARE provider_account.analyst_share;
    
    Copy
  6. 데이터베이스 역할이 세션에 있는지 확인합니다.

    USE DATABASE mounted_db;
    USE SCHEMA mounted_db.tables;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db.analyst');
    
    Copy

    SELECT 문 실행 시 True 가 반환되어야 합니다.

  7. 보호된 테이블을 쿼리합니다.

    SELECT * FROM empl_info;
    
    Copy

    SELECT 문 실행 시 마스킹되지 않은 이메일 주소가 반환되어야 합니다.

  8. 이러한 역할이 있는 사용자가 마스킹 정책 정의를 기준으로 보호된 테이블을 쿼리하고 데이터를 볼 수 있도록 계정 역할에 데이터베이스 역할을 부여합니다.

    이전 두 단계를 반복하면 mydb.support 데이터베이스 역할이 부여된 사용자에게는 부분적으로 마스킹된 이메일 주소가 표시됩니다.

예: 서로 다른 데이터베이스의 마스킹 정책 및 보호된 데이터

정책과 보호된 테이블이 서로 다른 데이터베이스에 있는 경우 두 데이터베이스 모두 컨슈머와 공유해야 합니다.

예:

  • mydb1 은 마스킹 정책과 mydb1.analyst 데이터베이스 역할을 포함합니다. 정책과 데이터베이스 역할을 동일한 데이터베이스에 그룹화해야 합니다.

  • mydb2 는 EMAIL 열이 포함된 mydb2.tables.empl_info 라는 테이블을 포함합니다. 마스킹 정책은 이 열에 설정됩니다.

공급자는 공유 생성, 공유에 권한 부여, 공유에 데이터베이스 역할 부여라는 측면에서 이전 예와 동일한 절차를 따릅니다.

컨슈머는 공유에서 데이터베이스를 생성하는 측면에서 이전 예와 동일한 절차를 따릅니다. 그러나 컨슈머는 데이터베이스 역할 활성화를 위해 사용 중인 정책이 포함된 데이터베이스가 있어야 합니다. 그러면 테이블의 정규화된 이름을 지정하여 보호된 테이블을 쿼리할 수 있습니다.

  1. 공급자 계정에서 CREATE SHARE 명령을 실행하여 각 데이터베이스의 공유를 생성합니다.

    USE ROLE r1;
    CREATE SHARE analyst_policy_share;
    CREATE SHARE analyst_table_share;
    
    Copy
  2. analyst_policy_share 라는 공유에 권한을 부여합니다.

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb1 TO SHARE analyst_policy_share;
    GRANT USAGE ON SCHEMA mydb1.policies TO SHARE analyst_policy_share;
    GRANT DATABASE ROLE mydb1.analyst TO SHARE analyst_policy_share;
    
    Copy
  3. analyst_table_share 라는 공유에 권한을 부여합니다.

    USE ROLE r1;
    GRANT USAGE ON SCHEMA mydb2.tables TO SHARE analyst_table_share;
    GRANT SELECT ON TABLE mydb2.tables.empl_info TO SHARE analyst_table_share;
    
    Copy
  4. 공유에 컨슈머 계정을 추가합니다.

    ALTER SHARE analyst_policy_share ADD ACCOUNTS = consumer_account;
    ALTER SHARE analyst_table_share ADD ACCOUNTS = consumer_account;
    
    Copy
  5. 컨슈머 계정에서 계정 역할 r1 을 생성하고 이 역할에 공유를 가져올 수 있는 권한을 부여합니다.

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  6. 각 공유를 가져옵니다.

    USE ROLE r1;
    CREATE DATABASE mounted_db1 FROM SHARE provider_account.analyst_policy_share;
    CREATE DATABASE mounted_db2 FROM SHARE provider_account.analyst_table_share;
    
    Copy
  7. 데이터베이스 역할이 세션에 있는지 확인합니다.

    USE DATABASE mounted_db1;
    USE SCHEMA mounted_db1.policies;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db1.analyst');
    
    Copy

    SELECT 문 실행 시 True 가 반환되어야 합니다.

  8. 보호된 테이블을 쿼리합니다.

    SELECT * FROM mounted_db2.tables.empl_info;
    
    Copy

    SELECT 문 실행 시 마스킹되지 않은 이메일 주소가 반환되어야 합니다.

예: 매핑 테이블이 없는 행 액세스 정책

이 예에서 행 액세스 정책은 IS_DATABASE_ROLE_IN_SESSION 함수를 호출하여 AUTHZ_ROLE(즉, 권한 부여된 역할) 열에서 역할 이름을 조회합니다. 리터럴이 아닌 구문과 정책이 포함된 데이터베이스에서 함수 조회가 이루어진다는 점에 유의하십시오. 이 시나리오에서는 매핑 테이블이 행 액세스 정책과 동일한 데이터베이스에 있어야 합니다.

정책을 만듭니다.

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_DATABASE_ROLE_IN_SESSION(authz_role);
Copy

테이블에 정책을 추가합니다.

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

공급자는 마스킹 정책 예제에 표시된 대로 단일 데이터베이스 또는 여러 데이터베이스의 오브젝트를 공유하도록 선택할 수 있습니다. 컨슈머는 동일한 절차에 따라 공급자가 제공하는 각 데이터베이스의 공유에서 데이터베이스를 만듭니다.

예: 매핑 테이블이 있는 행 액세스 정책

이 예에서 행 액세스 정책은 IS_DATABASE_ROLE_IN_SESSION 함수를 호출하여 ROLE_NAME이라는 매핑 테이블 열에서 권한 있는 역할을 조회합니다. 리터럴이 아닌 구문과 정책이 포함된 데이터베이스에서 함수 조회가 이루어진다는 점에 유의하십시오. 이 시나리오에서는 매핑 테이블이 행 액세스 정책과 동일한 데이터베이스에 있어야 합니다. 정책을 만든 후 AUTHZ_ROLE 열이 포함된 테이블에 정책을 추가합니다.

정책을 만듭니다.

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key AND IS_DATABASE_ROLE_IN_SESSION(m.role_name)
);
Copy

테이블에 정책을 추가합니다.

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy

공급자는 마스킹 정책 예제에 표시된 대로 단일 데이터베이스 또는 여러 데이터베이스의 오브젝트를 공유하도록 선택할 수 있습니다. 컨슈머는 동일한 절차에 따라 공급자가 제공하는 각 데이터베이스의 공유에서 데이터베이스를 만듭니다.