Rekomendasi keamanan tingkat baris - AWS Bimbingan Preskriptif

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Rekomendasi keamanan tingkat baris

Keamanan tingkat baris (RLS) diperlukan untuk mempertahankan isolasi data penyewa dalam model gabungan dengan PostgreSQL. RLS memusatkan penegakan kebijakan isolasi di tingkat database dan menghilangkan beban mempertahankan isolasi ini dari pengembang perangkat lunak. Cara paling umum untuk mengimplementasikan RLS adalah dengan mengaktifkan fitur ini di PostgreSQL DBMS. RLS melibatkan penyaringan akses ke baris data berdasarkan nilai dalam kolom tertentu. Anda dapat menggunakan dua metode untuk memfilter akses ke data:

  • Kolom data tertentu dalam tabel dibandingkan dengan nilai pengguna PostgreSQL saat ini. Nilai dalam kolom yang setara dengan pengguna PostgreSQL yang masuk dapat diakses oleh pengguna tersebut.

  • Kolom data tertentu dalam tabel dibandingkan dengan nilai variabel runtime yang ditetapkan oleh aplikasi. Nilai dalam kolom yang setara dengan variabel runtime dapat diakses selama sesi itu.

Opsi kedua lebih disukai, karena opsi pertama memerlukan pembuatan pengguna PostgreSQL baru untuk setiap penyewa. Sebagai gantinya, aplikasi SaaS yang menggunakan PostgreSQL harus bertanggung jawab untuk mengatur konteks khusus penyewa saat runtime saat menanyakan PostgreSQL. Ini akan memiliki efek menegakkan RLS. Anda juga dapat mengaktifkan RLS secara table-by-table dasar. Sebagai praktik terbaik, Anda harus mengaktifkan RLS pada semua tabel yang berisi data penyewa.

Contoh berikut membuat dua tabel dan memungkinkan RLS. Contoh ini membandingkan kolom data dengan nilai variabel runtime. 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);

Untuk informasi lebih lanjut, lihat posting blog isolasi data multi-tenant dengan PostgreSQL Row Level Security. Tim Pabrik AWS SaaS juga memiliki beberapa contoh GitHub untuk membantu dalam mengimplementasikan RLS.