행 수준 보안 권장 사항 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

행 수준 보안 권장 사항

PostgreSQL을 사용하는 풀링 모델에서 테넌트 데이터 격리를 유지하려면 행 수준 보안(RLS)이 필요합니다. RLS는 데이터베이스 수준에서 격리 정책의 적용을 중앙 집중화하고 소프트웨어 개발자로부터이 격리를 유지해야 하는 부담을 제거합니다. RLS를 구현하는 가장 일반적인 방법은 PostgreSQL DBMS에서이 기능을 활성화하는 것입니다. RLS에는 지정된 열의 값을 기반으로 데이터 행에 대한 액세스를 필터링하는 작업이 포함됩니다. 두 가지 방법을 사용하여 데이터에 대한 액세스를 필터링할 수 있습니다.

  • 테이블의 지정된 데이터 열을 현재 PostgreSQL 사용자의 값과 비교합니다. 로그인한 PostgreSQL 사용자와 동일한 열의 값은 해당 사용자가 액세스할 수 있습니다.

  • 테이블의 지정된 데이터 열을 애플리케이션에서 설정한 런타임 변수 값과 비교합니다. 런타임 변수와 동일한 열의 값은 해당 세션 중에 액세스할 수 있습니다.

첫 번째 옵션에는 각 테넌트에 대해 새 PostgreSQL 사용자를 생성해야 하므로 두 번째 옵션이 선호됩니다. 대신 PostgreSQL을 사용하는 SaaS 애플리케이션은 PostgreSQL을 쿼리할 때 런타임에 테넌트별 컨텍스트를 설정하는 역할을 해야 합니다. 이렇게 하면 RLS를 적용하는 효과가 있습니다. table-by-table 있습니다. 가장 좋은 방법은 테넌트 데이터가 포함된 모든 테이블에서 RLS를 활성화하는 것입니다.

다음 예제에서는 두 개의 테이블을 생성하고 RLS를 활성화합니다. 이 예제에서는 데이터 열을 런타임 변수의 값과 비교합니다app.current_tenant.

-- Create a table for our tenants with indexes on the primary key and the tenant’s name CREATE TABLE tenant ( tenant_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, name VARCHAR(255) UNIQUE, status VARCHAR(64) CHECK (status IN ('active', 'suspended', 'disabled')), tier VARCHAR(64) CHECK (tier IN ('gold', 'silver', 'bronze')) ); -- Create a table for users of a tenant CREATE TABLE tenant_user ( user_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, tenant_id UUID NOT NULL REFERENCES tenant (tenant_id) ON DELETE RESTRICT, email VARCHAR(255) NOT NULL UNIQUE, given_name VARCHAR(255) NOT NULL CHECK (given_name <> ''), family_name VARCHAR(255) NOT NULL CHECK (family_name <> '') ); -- Turn on RLS ALTER TABLE tenant ENABLE ROW LEVEL SECURITY; -- Restrict read and write actions so tenants can only see their rows -- Cast the UUID value in tenant_id to match the type current_setting -- This policy implies a WITH CHECK that matches the USING clause CREATE POLICY tenant_isolation_policy ON tenant USING (tenant_id = current_setting('app.current_tenant')::UUID); -- And do the same for the tenant users ALTER TABLE tenant_user ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_user_isolation_policy ON tenant_user USING (tenant_id = current_setting('app.current_tenant')::UUID);

자세한 내용은 블로그 게시물 PostgreSQL 행 수준 보안을 사용한 다중 테넌트 데이터 격리를 참조하세요. 또한 AWS SaaS Factory 팀에는 RLS 구현을 지원하는 몇 가지 예가 GitHub에 있습니다.