정책으로 보호되는 데이터 공유하기¶
데이터 공유 컨슈머는 이 미리 보기를 통해 공유 데이터베이스 역할을 사용하여 마스킹 정책 또는 행 액세스 정책으로 보호되는 공유 데이터에 액세스할 수 있습니다.
개요¶
데이터 공유 공급자는 데이터베이스 역할을 공유하여 데이터 공유 컨슈머가 정책으로 보호되는 데이터에 액세스하도록 할 수 있습니다. 공급자는 공유 데이터베이스 역할 또는 데이터베이스 역할이 포함된 매핑 테이블 열을 평가하기 위해 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는 세션에 사용 중인 데이터베이스나 쿼리에 지정된 데이터베이스를 살펴봅니다. 이는 공급자 계정과 컨슈머 계정에 모두 적용됩니다.
Snowflake는 정책, UDF 또는 뷰를 통해 보호된 오브젝트가 포함된 데이터베이스를 살펴봅니다. 이러한 오브젝트가 공유되지 않고 데이터베이스 역할이 다른 데이터베이스에 정의된 경우 이 함수는
False
로 평가됩니다.
IS_DATABASE_ROLE_IN_SESSION 함수에서 열 이름을 인자 로 지정하는 경우:
테이블 쿼리가 함수를 호출하는 경우 열은 해당 열이 포함된 테이블의 테이블 식별자에 매핑됩니다. 그런 다음 Snowflake는 테이블이 포함된 데이터베이스에서 데이터베이스 역할을 살펴봅니다. 예를 들어 AUTHZ_ROLE(즉, 권한이 부여된 역할) 열을 인자로 지정하려면 다음을 수행하십시오.
SELECT * FROM mydb.myschema.t WHERE IS_DATABASE_ROLE_IN_SESSION(AUTHZ_ROLE);
Copy마스킹 정책, 행 액세스 정책 또는 UDF가 함수를 호출하는 경우 보호된 테이블이 포함된 데이터베이스에서 조회가 발생합니다.
일반 워크플로¶
정책으로 보호된 데이터를 정책의 IS_DATABASE_ROLE_IN_SESSION 함수와 공유하려면 함수를 호출하고 데이터를 공유하는 정책을 만드는 것과 동일한 단계를 따라야 합니다. 요약하자면 다음과 같습니다.
공급자가 계정 역할을 생성합니다.
공급자가 정책을 생성하고 테이블이나 열에 정책을 설정합니다.
공급자가 계정 역할로 정책을 테스트합니다.
공급자가 데이터베이스 역할을 생성하고 데이터베이스 역할로 정책을 테스트합니다.
공급자가 공유를 생성하고 공유에 데이터베이스 역할을 부여하는 것을 포함하여 공유에 권한을 부여합니다.
컨슈머가 공유(즉, 탑재된 데이터베이스)에서 데이터베이스를 생성합니다.
컨슈머가 정책으로 보호되는 공유 오브젝트를 쿼리합니다.
예: 동일한 데이터베이스의 모든 오브젝트¶
이 예에서는 데이터베이스 역할, 마스킹 정책, 보호된 테이블이 모두 mydb
라는 동일한 데이터베이스에 있습니다.
다음을 참조하십시오.
데이터베이스 역할은
analyst_dbrole
및support_dbrole
입니다.마스킹 정책은 다음과 같이 정의됩니다.
CREATE OR REPLACE MASKING POLICY mydb.policies.email_mask AS (val string) RETURNS string -> CASE WHEN IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE') THEN val WHEN IS_DATABASE_ROLE_IN_SESSION('SUPPORT_DBROLE') THEN REGEXP_REPLACE(val,'.+\@','*****@') ELSE '********' END COMMENT = 'use database role for shared data' ;
CopyEMAIL 열은
mydb.tables.empl_info
라는 테이블에 있으며 마스킹 정책은 이 열에 설정됩니다.
데이터베이스 mydb
를 공유하고 컨슈머가 공유 데이터베이스 역할을 사용하여 공유 마스킹 정책으로 보호되는 공유 데이터를 쿼리할 수 있도록 허용하려면 다음 단계를 완료하십시오. 이러한 단계에서는 공급자가 계정 역할 및 데이터베이스 역할로 EMAIL 열에 대한 마스킹 정책을 이미 테스트한 것으로 가정합니다.
공급자 계정에서 CREATE SHARE 명령을 실행하여 분석가 데이터베이스 역할의 공유를 생성합니다.
USE ROLE r1; CREATE SHARE analyst_share;
Copy공유에 권한을 부여합니다. 각 공유에 동일한 권한이 필요합니다.
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 analyst_dbrole TO SHARE analyst_share;
Copy공유에 컨슈머 계정을 추가합니다.
ALTER SHARE analyst_share ADD ACCOUNTS = consumer_account;
Copy컨슈머 계정에서 계정 역할
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공유를 가져옵니다.
USE ROLE r1; CREATE DATABASE mounted_db FROM SHARE provider_account.analyst_share;
Copy데이터베이스 역할이 세션에 있는지 확인합니다.
USE DATABASE mounted_db; USE SCHEMA mounted_db.tables; SELECT IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE');
CopySELECT 문 실행 시
True
가 반환되어야 합니다.보호된 테이블을 쿼리합니다.
SELECT * FROM empl_info;
CopySELECT 문 실행 시 마스킹되지 않은 이메일 주소가 반환되어야 합니다.
이러한 역할이 있는 사용자가 마스킹 정책 정의를 기준으로 보호된 테이블을 쿼리하고 데이터를 볼 수 있도록 계정 역할에 데이터베이스 역할을 부여합니다.
이전 두 단계를 반복하면
support_dbrole
데이터베이스 역할이 부여된 사용자에게는 부분적으로 마스킹된 이메일 주소가 표시됩니다.
예: 서로 다른 데이터베이스의 마스킹 정책 및 보호된 데이터¶
정책과 보호된 테이블이 서로 다른 데이터베이스에 있는 경우 두 데이터베이스 모두 컨슈머와 공유해야 합니다.
예:
mydb1
은 마스킹 정책과analyst_dbrole
데이터베이스 역할을 포함합니다. 테이블과 데이터베이스 역할을 동일한 데이터베이스에 그룹화해야 합니다.mydb2
는 EMAIL 열이 포함된mydb2.tables.empl_info
라는 테이블을 포함합니다. 마스킹 정책은 이 열에 설정됩니다.
공급자는 공유 생성, 공유에 권한 부여, 공유에 데이터베이스 역할 부여라는 측면에서 이전 예와 동일한 절차를 따릅니다.
컨슈머는 공유에서 데이터베이스를 생성하는 측면에서 이전 예와 동일한 절차를 따릅니다. 그러나 컨슈머는 데이터베이스 역할 활성화를 위해 사용 중인 보호된 테이블이 포함된 데이터베이스가 있어야 합니다. 그러면 테이블의 정규화된 이름을 지정하여 보호된 테이블을 쿼리할 수 있습니다.
공급자 계정에서 CREATE SHARE 명령을 실행하여 각 데이터베이스의 공유를 생성합니다.
USE ROLE r1; CREATE SHARE analyst_policy_share; CREATE SHARE analyst_table_share;
Copyanalyst_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;
Copyanalyst_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; GRANT DATABASE ROLE analyst_dbrole TO SHARE analyst_table_share;
Copy공유에 컨슈머 계정을 추가합니다.
ALTER SHARE analyst_policy_share ADD ACCOUNTS = consumer_account; ALTER SHARE analyst_table_share ADD ACCOUNTS = consumer_account;
Copy컨슈머 계정에서 계정 역할
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각 공유를 가져옵니다.
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데이터베이스 역할이 세션에 있는지 확인합니다.
USE DATABASE mounted_db2; USE SCHEMA mounted_db2.tables; SELECT IS_DATABASE_ROLE_IN_SESSION('ANALYST_DBROLE');
CopySELECT 문 실행 시
True
가 반환되어야 합니다.보호된 테이블을 쿼리합니다.
SELECT * FROM mounted_db2.tables.empl_info;
CopySELECT 문 실행 시 마스킹되지 않은 이메일 주소가 반환되어야 합니다.
예: 매핑 테이블이 없는 행 액세스 정책¶
이 예에서 행 액세스 정책은 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
공급자는 마스킹 정책 예제에 표시된 대로 단일 데이터베이스 또는 여러 데이터베이스의 오브젝트를 공유하도록 선택할 수 있습니다. 컨슈머는 동일한 절차에 따라 공급자가 제공하는 각 데이터베이스의 공유에서 데이터베이스를 만듭니다.