امنیت در سطح ردیف ( RLS )

امنیت در سطح ردیف ( RLS )

در دنیای امروز، حفاظت از داده‌های حساس به یک چالش اساسی تبدیل شده است. امنیت در سطح ردیف (RLS) یک قابلیت قدرتمند در SQL Server است که به شما امکان می‌دهد دسترسی به ردیف‌های جدول را بر اساس عضویت در گروه‌ها یا متن اجرا (execution context) کنترل کنید.

راهنمای جامع امنیت در سطح ردیف (Row-Level Security) در SQL Server

چکیده

در دنیای امروز، حفاظت از داده‌های حساس به یک چالش اساسی تبدیل شده است. امنیت در سطح ردیف (RLS)یک قابلیت قدرتمند در SQL Server است که به شما امکان می‌دهد دسترسی به ردیف‌های جدول را بر اساس عضویت در گروه‌ها یا متن اجرا (execution context) کنترل کنید  

مقدمه

تصور کنید در یک بیمارستان کار می‌کنید. پرستاران فقط باید به سوابق بیماران خود دسترسی داشته باشند، نه همه بیماران. یا در یک بانک، هر کارمند فقط باید به داده‌های مشتریان واحد خود دسترسی داشته باشد. چگونه این محدودیت‌ها را اعمال می‌کنید؟

RLS چیست؟

امنیت در سطح ردیف (RLS) قابلیتی است که اولین بار در SQL Server 2016  معرفی شد. این ویژگی به شما اجازه می‌دهد دسترسی به ردیف‌های یک جدول را بر اساس ویژگی‌های کاربر کنترل کنید.

به زبان ساده  RLSفیلتر هوشمند که قبل از نمایش هر داده‌ای، بررسی می‌کند آیا کاربر مجاز به دیدن این ردیف خاص است یا خیر.

مثال کاربردی :

ایجاد کاربر :

REATE USER Manager WITHOUT LOGIN

CREATE USER User1 WITHOUT LOGIN

CREATE USER User2 WITHOUT LOGIN

GO

ایجاد اسکیما و جدول :

CREATE SCHEMA Sales ;

CREATE TABLE Sales.Orders

(
    OrderID int ,
    SalesRep nvarchar(50) ,
    Product nvarchar(50)
    Quantity smallint
)

GO

   مقدار دهی به جدول :

INSERT INTO Sales.Orders VALUES

    (1,'SalesRep1','Valve',5 ),
    (2,'SalesRep1','Wheel',2 ),
    (3,'SalesRep1','Valve',4 ),
    (4,'SalesRep2','Bracket',2),
    (5,'SalesRep2','Wheel',5),
    (6,'SalesRep2','Seat',5) ;

اعطای دسترسی کاربران به جدول :

 

GRANT SELECT Sales.Orders TO Manager
GRANT SELECT Sales.Orders TO User1
GRANT SELECT Sales.Orders TO User2

ایجاد تابع :

CREATE SCHEMA Security;

GO

CREATE FUNCTION Security.tvf_securitypredicate(@SalesRep AS nvarchar(50))

    RETURNS TABLE
    WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS predicate_result
    WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager';
GO

ایجاد سیاست امنیتی :

CREATE SECURITY POLICY SalesFilter

    ADD FILTER PREDICATE Security.tvf_securitypredicate(SalesRep)
    ON Sales.Orders
    WITH (STATE = ON);

GO

اعطای دسترسی کاربران  به تابع :

GRANT SELECT ON Security.tvf_securitypredicate TO Manager;

GRANT SELECT ON Security.tvf_securitypredicate TO User1;
GRANT SELECT ON Security.tvf_securitypredicate TO User2;
GO

اجرای تستی به عنوان کاربر user1

EXECUTE AS USER = 'User1';

SELECT * FROM Sales.Orders;  -- فقط 3 ردیف مربوط به خودش
REVERT;
GO

اجرای تستی به عنوان کاربر Manager

EXECUTE AS USER = 'Manager';

SELECT * FROM Sales.Orders;  -- همه 6 ردیف
REVERT;
GO
 

خروجی مورد انتظار:

  • SalesRep1: فقط ردیف‌های ۱، ۲، ۳ را می‌بیند
  • SalesRep2: فقط ردیف‌های ۴، ۵، ۶ را می‌بیند
  • Manager: همه ۶ ردیف را می‌بیند

💬 نظرات (0)

هنوز نظری ثبت نشده است. اولین نفری باشید که نظر می‌دهید!

📝 ثبت نظر جدید