Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 블로그 게시물
Amazon Redshift 페더레이션 권한 - 종합 예제
다음은 Amazon Redshift 페더레이션 권한을 사용하여 포괄적인 데이터 거버넌스 정책을 생성하고 관리하는 방법을 보여주는 종합적인 예제입니다. 이러한 정책에는 사용자 역할 및 조건에 따라 데이터 액세스를 제어하기 위해 함께 작동하는 행 수준 보안(RLS), 동적 데이터 마스킹(DDM) 및 열 수준 권한(CLP)이 포함됩니다.
이 예제를 실행하려면 superuser이거나 sys:secadmin 역할이 있어야 합니다.
사전 조건
이 예제에서는 아래 ‘IAMR:role_name’ 역할이 계정에 이미 있다고 가정합니다. 그렇지 않으면 역할을 생성하세요. 또한 Redshift 데이터 웨어하우스는 이름이 ‘catalog_name’인 AWS Glue Data Catalog에 등록되며 데이터베이스는 ‘db_name’입니다.
카탈로그 인스턴스에서 해당 IAM 역할에 sys:secadmin 역할 부여
-- Grant sys:secadmin role to relevant user (must be run on Redshift catalog instance) GRANT ROLE sys:secadmin TO "IAMR:AccountSecurityAdminrole_name";
나머지는 Redshift 컴퓨팅 웨어하우스에서 실행
IAM 또는 IdC 사용자를 사용하는 경우, 다음 두 단계를 건너뛰어 로컬 웨어하우스 사용자와 글로벌 자격 증명 매핑을 생성할 수 있습니다.
1단계: 거버넌스 정책을 테스트하는 데 필요한 로컬 웨어하우스 사용자 생성
-- Create test users. CREATE USER alice WITH PASSWORD 'Alice_pass_1'; CREATE USER oscar WITH PASSWORD 'Oscar_pass_1'; CREATE USER sierra WITH PASSWORD 'Sierra_pass_1';
2단계: 글로벌 자격 증명 IAM 역할 매핑 설정
-- Map local users to IAM roles (executed by superuser). -- Make user sierra a sys:secadmin by setting the global identity -- to `IAMR:AccountSecurityAdmin`. -- This role has been granted secadmin privilege on Redshift catalog instance. ALTER USER sierra SET GLOBAL IDENTITY IAM_ROLE 'arn:aws:iam::123456789012:role/AccountSecurityAdmin'; ALTER USER alice SET GLOBAL IDENTITY IAM_ROLE 'arn:aws:iam::123456789012:role/Analyst'; ALTER USER oscar SET GLOBAL IDENTITY IAM_ROLE 'arn:aws:iam::123456789012:role/Operator'; -- Verify global identity settings. SET SESSION AUTHORIZATION sierra; SHOW GLOBAL IDENTITY; SET SESSION AUTHORIZATION alice; SHOW GLOBAL IDENTITY; SET SESSION AUTHORIZATION oscar; SHOW GLOBAL IDENTITY; -- Reset to default session. RESET SESSION AUTHORIZATION;
환경 설정
먼저 테이블을 생성하고 거버넌스 정책에 대한 샘플 고객 데이터 및 조회 테이블로 채웁니다.
-- Create the main customer table. CREATE TABLE db_name@catalog_name.public.customers ( id INTEGER, name VARCHAR(50), email VARCHAR(100), region VARCHAR(20), revenue DECIMAL(10,2) ); -- Populate with sample customer data. INSERT INTO db_name@catalog_name.public.customers VALUES (1, 'John Smith', 'john@email.com', 'US', 1000.00), (2, 'Jane Doe', 'jane@email.com', 'EU', 500.00), (3, 'Mike Johnson', 'mike@email.com', 'US', 2000.00); -- Grant basic table access. GRANT ALL ON db_name@catalog_name.public.customers TO PUBLIC; -- Create lookup table for region-based policies. CREATE TABLE db_name@catalog_name.public.lookup_regions ( region_code VARCHAR(20), allowed BOOLEAN ); INSERT INTO db_name@catalog_name.public.lookup_regions VALUES ('US', TRUE), ('EU', FALSE), ('APAC', TRUE); GRANT ALL ON db_name@catalog_name.public.lookup_regions TO PUBLIC; -- Create lookup table for revenue-based masking. CREATE TABLE db_name@catalog_name.public.lookup_revenue_tiers (base_revenue INTEGER); INSERT INTO db_name@catalog_name.public.lookup_revenue_tiers VALUES (1000), (2000); GRANT ALL ON db_name@catalog_name.public.lookup_revenue_tiers TO PUBLIC;
열 수준 권한(CLP) 설정
사용자가 액세스할 수 있는 열을 제어하도록 여러 사용자에 대한 열 수준 액세스를 구성합니다.
-- Grant specific column access to Analyst i.e. `alice`. GRANT SELECT (id, region) ON db_name@catalog_name.public.customers TO "IAMR:Analyst"; -- Grant different column access to Operator i.e. `oscar`. GRANT SELECT (id, name, revenue) ON db_name@catalog_name.public.customers TO "IAMR:operator";
행 수준 보안(RLS) 정책 생성
RLS 정책을 생성하여 권한 부여 및 데이터 조건에 따라 사용자가 볼 수 있는 행을 제어합니다.
-- Switch to admin user to create policies. SET SESSION AUTHORIZATION sierra; -- Create simple RLS policy: Analysts see only US customers. CREATE RLS POLICY db_name@catalog_name.us_only WITH (region VARCHAR(20)) USING (region = 'US'); -- Attach the policy to the Analyst i.e. `alice`. ATTACH RLS POLICY db_name@catalog_name.us_only ON db_name@catalog_name.public.customers TO "IAMR:Analyst"; -- Enable row level security on the table. ALTER TABLE db_name@catalog_name.public.customers ROW LEVEL SECURITY ON; -- Create advanced RLS policy using lookup table. CREATE RLS POLICY db_name@catalog_name.region_lookup_policy WITH (region VARCHAR(20)) AS r USING (r.region IN ( SELECT region_code FROM public.lookup_regions WHERE allowed = TRUE )); -- Attach the lookup-based policy to Operator i.e. `oscar`. ATTACH RLS POLICY db_name@catalog_name.region_lookup_policy ON db_name@catalog_name.public.customers TO "IAMR:Operator";
동적 데이터 마스킹(DDM) 정책 생성
사용자 역할 및 조건에 따라 민감한 데이터를 난독화하는 마스킹 정책을 생성합니다.
-- Create masking policy for PII data (names and emails). CREATE MASKING POLICY db_name@catalog_name.mask_pii WITH (DATA VARCHAR(100)) USING (SHA2(DATA + 'secret', 256)::TEXT); -- Attach masking to name and email columns for all users. ATTACH MASKING POLICY db_name@catalog_name.mask_pii ON db_name@catalog_name.public.customers (name) TO PUBLIC; ATTACH MASKING POLICY db_name@catalog_name.mask_pii ON db_name@catalog_name.public.customers (email) TO PUBLIC; -- Create conditional masking policy for revenue data. CREATE MASKING POLICY db_name@catalog_name.conditional_mask WITH (revenue DECIMAL(10,2)) USING (CASE WHEN revenue IN (SELECT base_revenue FROM public.lookup_revenue_tiers) THEN revenue ELSE 0.00 END); -- Attach conditional masking to Analyst i.e. `alice` with priority. ATTACH MASKING POLICY db_name@catalog_name.conditional_mask ON db_name@catalog_name.public.customers (revenue) TO "IAMR:Analyst" PRIORITY 20;
사용 가능/적용된 정책 감사
SHOW 명령을 사용하여 거버넌스 정책이 올바르게 구성되었는지 확인합니다.
-- Show all RLS policies in the database. SHOW RLS POLICIES FROM DATABASE db_name@catalog_name LIMIT 10; -- Show RLS policies for specific users and tables. SHOW RLS POLICIES ON db_name@catalog_name.public.customers FOR "IAMR:Analyst" LIMIT 10; SHOW RLS POLICIES ON db_name@catalog_name.public.customers FOR "IAMR:Operator" LIMIT 10; SHOW RLS POLICIES ON db_name@catalog_name.public.customers FOR PUBLIC LIMIT 10; -- Show all masking policies in the database. SHOW MASKING POLICIES FROM DATABASE db_name@catalog_name LIMIT 10; -- Show Masking policies for specific users and tables. SHOW MASKING POLICIES ON db_name@catalog_name.public.customers FOR "IAMR:Analyst" LIMIT 10; SHOW MASKING POLICIES ON db_name@catalog_name.public.customers FOR "IAMR:Operator" LIMIT 10; SHOW MASKING POLICIES ON db_name@catalog_name.public.customers FOR PUBLIC LIMIT 10;
액세스 패턴 테스트
역할 및 적용된 정책에 따라 다른 사용자가 데이터를 보는 방법을 테스트합니다.
-- Test as analyst: Only US customers, only id/region columns, -- conditional revenue masking. SET SESSION AUTHORIZATION alice; SELECT id, region FROM db_name@catalog_name.public.customers ORDER BY id; SELECT id, region, revenue FROM db_name@catalog_name.public.customers ORDER BY id; -- Test as operator: Allowed regions only, masked names, specific columns. SET SESSION AUTHORIZATION oscar; SELECT id, name, revenue FROM db_name@catalog_name.public.customers ORDER BY id; SELECT id, name, region FROM db_name@catalog_name.public.customers ORDER BY id; -- Test as admin: Full access to all data. SET SESSION AUTHORIZATION sierra; SELECT * FROM db_name@catalog_name.public.customers ORDER BY id;
정책 변경
기존 정책을 수정하여 정책을 다시 생성하지 않고 동작을 변경합니다.
-- Switch back to admin user. SET SESSION AUTHORIZATION sierra; -- Alter the PII masking policy to use simple string replacement. ALTER MASKING POLICY db_name@catalog_name.mask_pii USING ('***MASKED***'::TEXT); -- Alter the conditional masking policy to use different threshold. ALTER MASKING POLICY db_name@catalog_name.conditional_mask USING (CASE WHEN revenue >= 500.00 THEN revenue ELSE -1.00 END); -- Alter the RLS policy to show only disallowed regions. ALTER RLS POLICY db_name@catalog_name.region_lookup_policy USING (r.region IN ( SELECT region_code FROM db_name@catalog_name.public.lookup_regions WHERE allowed = FALSE ));
정책 분리 및 삭제
더 이상 필요하지 않은 정책을 제거합니다.
-- Detach RLS policies from users. DETACH RLS POLICY db_name@catalog_name.us_only ON db_name@catalog_name.public.customers FROM "IAMR:Analyst"; DETACH RLS POLICY db_name@catalog_name.region_lookup_policy ON db_name@catalog_name.public.customers FROM "IAMR:Operator"; -- Detach masking policies. DETACH MASKING POLICY db_name@catalog_name.mask_pii ON db_name@catalog_name.public.customers (name) FROM PUBLIC; DETACH MASKING POLICY db_name@catalog_name.mask_pii ON db_name@catalog_name.public.customers (email) FROM PUBLIC; DETACH MASKING POLICY db_name@catalog_name.conditional_mask ON db_name@catalog_name.public.customers (revenue) FROM "IAMR:Analyst";
정리: RLS 끄기 및 정책 삭제
-- Turn off Row-level security. ALTER TABLE db_name@catalog_name.public.customers ROW LEVEL SECURITY OFF; -- Drop policies. DROP RLS POLICY db_name@catalog_name.us_only CASCADE; DROP RLS POLICY db_name@catalog_name.region_lookup_policy CASCADE; DROP MASKING POLICY db_name@catalog_name.mask_pii CASCADE; DROP MASKING POLICY db_name@catalog_name.conditional_mask CASCADE; -- Drop tables. DROP TABLE db_name@catalog_name.public.customers; DROP TABLE db_name@catalog_name.public.lookup_regions; DROP TABLE db_name@catalog_name.public.lookup_revenue_tiers;
글로벌 자격 증명 재설정
-- TO rest the global identity. ALTER USER alice RESET GLOBAL IDENTITY; ALTER USER oscar RESET GLOBAL IDENTITY; ALTER USER sierra RESET GLOBAL IDENTITY;