Menerapkan keamanan tingkat baris

Selesai 100 XP

Row-Level Security (RLS) adalah fitur yang menyediakan kontrol terperinci atas akses ke baris dalam tabel berdasarkan keanggotaan grup atau konteks eksekusi.

Misalnya, dalam platform e-niaga, Anda dapat memastikan bahwa penjual hanya memiliki akses ke baris pesanan yang terkait dengan produk mereka sendiri. Dengan cara ini, setiap penjual dapat mengelola pesanan mereka secara independen, sambil menjaga privasi informasi pesanan penjual lain.

Jika Anda memiliki pengalaman dengan SQL Server, Anda menemukan bahwa keamanan tingkat baris berbagi karakteristik dan fitur serupa.

Lindungi data Anda

Row-Level Security (RLS) bekerja dengan mengaitkan fungsi, yang dikenal sebagai predikat keamanan, dengan tabel. Fungsi ini didefinisikan untuk mengembalikan true atau false berdasarkan kondisi tertentu, biasanya melibatkan nilai satu atau beberapa kolom dalam tabel. Saat pengguna mencoba mengakses data dalam tabel, fungsi predikat keamanan dipanggil. Jika fungsi mengembalikan true, baris dapat diakses oleh pengguna; jika menampilkan false, baris tidak muncul dalam hasil kueri.

Tergantung pada persyaratan bisnis, predikat RLS bisa sesederhana WHERE CustomerId = 29 atau serumit yang diperlukan.

Proses ini transparan bagi pengguna dan diberlakukan secara otomatis oleh SQL Server, memastikan penerapan aturan keamanan yang konsisten.

Keamanan tingkat baris diterapkan dalam dua langkah utama:

  • Predikat filter - Ini adalah fungsi bernilai tabel sebaris yang memfilter hasil berdasarkan predikat yang ditentukan.

    Access Definisi
    SELECT Tidak dapat melihat baris yang difilter.
    UPDATE Tidak dapat memperbarui baris yang difilter.
    DELETE Tidak dapat menghapus baris yang difilter.
    INSERT Tidak berlaku.
  • Kebijakan keamanan - Ini adalah kebijakan keamanan yang memanggil fungsi bernilai tabel sebaris untuk melindungi akses ke baris dalam tabel.

Karena kontrol akses dikonfigurasi dan diterapkan di tingkat gudang, perubahan aplikasi minimal - jika ada. Selain itu, pengguna dapat langsung memiliki akses ke tabel dan dapat mengkueri data mereka sendiri.

Mengonfigurasi keamanan tingkat baris

Perintah T-SQL di bawah ini menunjukkan cara menggunakan RLS dalam skenario saat akses pengguna dipisahkan oleh penyewa:

SQL
-- Create supporting objects for this example
CREATE TABLE [Sales] (SalesID INT, 
    ProductID INT, 
    TenantName NVARCHAR(50), 
    OrderQty INT, 
    UnitPrice MONEY)
GO

INSERT INTO [Sales]  VALUES (1, 3, 'tenant1@contoso.com', 5, 10.00);
INSERT INTO [Sales]  VALUES (2, 4, 'tenant2@contoso.com', 2, 57.00);
INSERT INTO [Sales]  VALUES (3, 7, 'tenant3@contoso.com', 4, 23.00);
INSERT INTO [Sales]  VALUES (4, 2, 'tenant4@contoso.com', 2, 91.00);
INSERT INTO [Sales]  VALUES (5, 9, 'tenant5@contoso.com', 5, 80.00);

-- View all the rows in the table  
SELECT * FROM Sales;

Selanjutnya, kita membuat skema baru, fungsi bernilai tabel sebaris, dan memberikan akses pengguna ke fungsi baru. Predikat WHERE @TenantName = USER_NAME() OR USER_NAME() = 'TenantAdmin' mengevaluasi apakah nama pengguna yang menjalankan kueri cocok dengan nilai kolom TenantName.

SQL
--Create a schema
CREATE SCHEMA [Sec];  
GO  

--Create the filter predicate
CREATE FUNCTION sec.tvf_SecurityPredicatebyTenant(@TenantName AS NVARCHAR(10))  
    RETURNS TABLE  
WITH SCHEMABINDING  
AS  
    RETURN	SELECT 1 AS result
			WHERE @TenantName = USER_NAME() OR USER_NAME() = 'tenantAdmin@contoso.com';  
GO

--Create security policy and add the filter predicate
CREATE SECURITY POLICY sec.SalesPolicy  
ADD FILTER PREDICATE sec.tvf_SecurityPredicatebyTenant(TenantName) ON [dbo].[Sales]
WITH (STATE = ON);  
GO

Pengguna tenantAdmin@contoso.com akan melihat semua baris. Ke tenant1@contoso.com tenant5@contoso.com pengguna seharusnya hanya melihat baris mereka sendiri.

Jika Anda mengubah kebijakan keamanan dengan WITH (STATE = OFF);, Anda melihat bahwa pengguna melihat semua baris.

Catatan

Ada risiko kebocoran informasi jika penyerang menulis kueri dengan klausul WHERE yang dibuat khusus dan, misalnya, kesalahan bagi dengan nol, untuk memaksa pengecualian jika kondisi WHERE adalah true. Ini dikenal sebagai serangan saluran samping.

Menjelajahi kasus penggunaan

Keamanan tingkat baris sangat ideal untuk banyak skenario, termasuk:

  • Saat Anda perlu mengisolasi akses departemen di tingkat baris.
  • Saat Anda perlu membatasi akses data pelanggan hanya ke data yang relevan dengan perusahaan mereka.
  • Saat Anda perlu membatasi akses untuk tujuan kepatuhan.

Menerapkan praktik terbaik

Berikut adalah beberapa praktik terbaik yang perlu dipertimbangkan saat menerapkan RLS:

  • Direkomendasikan untuk membuat skema terpisah untuk fungsi predikat, dan kebijakan keamanan.
  • Jika memungkinkan, hindari konversi jenis dalam fungsi predikat.
  • Untuk memaksimalkan performa, hindari menggunakan gabungan tabel yang berlebihan dan rekursi dalam fungsi predikat.

Unit berikutnya: Menerapkan keamanan tingkat kolom

Sebelumnya Berikutnya