Microsoft® đã tập trung vào bảo mật trong SQL Server®, và hầu như mọi bản phát hành đều có cải tiến cho tính năng hiện có hoặc giới thiệu tính năng bảo mật mới. Trong SQL Server 2016, Microsoft giới thiệu nhiều tính năng bảo mật mới giúp người dùng bảo vệ dữ liệu của họ, bao gồm Row-Level Security, Always Encrypted, và Dynamic Data Masking.
Giới thiệu
Trong blog trước, tôi đã viết về Dynamic data masking trong SQL Server 2016. Trong blog này, tôi giới thiệu tính năng Row-Level Security (RLS), cho phép bạn kiểm soát người dùng nào có quyền truy cập vào các hàng trong một bảng. RLS cho phép bạn triển khai các hạn chế trên dữ liệu dựa trên đặc điểm của người dùng đang thực thi query. RLS giúp bạn kiểm soát truy cập dữ liệu dễ dàng với sự minh bạch hoàn toàn cho các người dùng khác nhau.
Cần thiết của RLS
Có những lúc chúng ta cần trả về chỉ dữ liệu chọn lọc cho người dùng chọn lọc. Trong quá khứ, chúng ta làm điều đó bằng cách tạo view và cấp quyền select cho người dùng trên những view đó. Tuy nhiên, cách tiếp cận đó trở nên không thể quản lý được với số lượng view cần thiết để đáp ứng lượng dữ liệu và người dùng ngày càng tăng. Vì vậy Microsoft giới thiệu RLS để đáp ứng yêu cầu bảo mật trong hoàn cảnh mới.
RLS cho phép kiểm soát truy cập mức độ chi tiết (fine-grained) đối với các hàng trong bảng, cho phép bạn dễ dàng kiểm soát người dùng nào có thể truy cập dữ liệu nào với sự minh bạch hoàn toàn đối với ứng dụng.
Với tính năng này, các hàng được lọc dựa trên ngữ cảnh thực thi (execution context) của query, thay vì quyền truy cập hiện tại của người dùng. Bạn có thể tạo các quy tắc logic bảo mật để xác định người dùng nào có thể thấy hàng nào và hạn chế bất kỳ hàng (hoặc dữ liệu) nào bằng cách thiết kế chính sách bảo mật linh hoạt và mạnh mẽ cho một bảng, như hình sau:
Nguồn hình ảnh: https://sqlwithmanoj.com/2015/07/13/implementing-row-level-security-rls-with-sql-server-2016/
Thuộc tính của RLS
RLS có các thuộc tính sau:
- Vai trò truy cập chi tiết (kiểm soát cả quyền đọc và ghi vào các hàng cụ thể)
- Minh bạch ứng dụng (không yêu cầu thay đổi ứng dụng)
- Tập trung quyền truy cập trong database
- Dễ dàng triển khai và bảo trì
Cách RLS hoạt động
Để triển khai RLS, bạn cần xem xét các yếu tố sau:
- Predicate function
- Security predicates
- Security policy
Các phần sau mô tả các mục này.
Predicate function
Predicate function là một inline table-valued function kiểm tra xem người dùng thực thi query có quyền truy cập dữ liệu dựa trên logic được định nghĩa trong nó hay không. Function này trả về 1 cho mỗi hàng mà người dùng được phép truy cập.
Security predicates
Security predicate giúp gắn predicate function vào bảng. RLS hỗ trợ hai loại security predicates: Filter predicates và block predicates. Filter predicate lọc dữ liệu im lặng mà không ném ra lỗi cho các hoạt động sau theo logic định nghĩa trong predicate function:
SELECTUPDATEDELETE
Block predicate ném ra lỗi một cách rõ ràng và chặn người dùng thực hiện các hoạt động sau trên dữ liệu vi phạm logic predicate function:
AFTER INSERTAFTER UPDATEBEFORE UPDATEBEFORE DELETE
Security policy
Một đối tượng security policy được tạo cho RLS nhóm tất cả security predicates tham chiếu đến predicate function.
Các trường hợp sử dụng
Dưới đây là một số ví dụ thiết kế về cách RLS có thể được sử dụng:
- Một bệnh viện có thể tạo chính sách bảo mật cho phép y tá chỉ xem hàng dữ liệu của bệnh nhân của họ.
- Một ngân hàng có thể tạo chính sách hạn chế truy cập hàng dữ liệu tài chính dựa trên bộ phận kinh doanh hoặc vai trò của nhân viên trong công ty.
- Một ứng dụng multi-tenant có thể tạo chính sách để thực thi sự tách biệt logic các hàng dữ liệu của mỗi tenant khỏi hàng dữ liệu của mọi tenant khác. Vì dữ liệu của nhiều tenant được lưu trong một bảng, quá trình hiệu quả hơn. Mỗi tenant chỉ thấy hàng dữ liệu của mình.
Triển khai RLS
Dưới đây là ví dụ về cách triển khai RLS:
Bước 1: Chạy mã sau để tạo database RowFilter và hai user để test:
CREATE DATABASE RowFilter; GO USE RowFilter; GO CREATE USER userBrian WITHOUT LOGIN; CREATE USER userJames WITHOUT LOGIN; GO
Bước 2: Chạy mã sau để tạo bảng với ví dụ và cấp quyền SELECT cho user mới:
CREATE TABLE dbo.SalesFigures ( [userCode] NVARCHAR(10), [sales] MONEY) GO INSERT INTO dbo.SalesFigures VALUES ('userBrian',100), ('userJames',250), ('userBrian',350) GO GRANT SELECT ON dbo.SalesFigures TO userBrian GRANT SELECT ON dbo.SalesFigures TO userJames GO
Bước 3: Chạy mã sau để thêm filter predicate function:
CREATE FUNCTION dbo.rowLevelPredicate (@userCode as sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS rowLevelPredicateResult WHERE @userCode = USER_NAME(); GO
Bước 4: Chạy mã sau để thêm filter predicate vào bảng dbo.Sales Figures:
CREATE SECURITY POLICY UserFilter ADD FILTER PREDICATE dbo.rowLevelPredicate(userCode) ON dbo.SalesFigures WITH (STATE = ON); GO
Bước 5: Chạy mã sau để test kết quả với user được thêm ở Bước 2:
EXECUTE AS USER = 'userBrian'; SELECT * FROM dbo.SalesFigures; REVERT; GO
Mã này trả về hai hàng, như hình dưới:
(https://vn.wsxdn.com/UploadFiles_2724/202207/2022070812111051.png)
EXECUTE AS USER = 'userJames'; SELECT * FROM dbo.SalesFigures; REVERT; GO
Mã này trả về một hàng, như hình dưới:
(https://vn.wsxdn.com/UploadFiles_2724/202207/2022070812111024.png)
Quyền hạn
Tạo, sửa đổi, hoặc xóa security policies yêu cầu quyền ALTER ANY SECURITY POLICY.
Tạo hoặc xóa security policy yêu cầu quyền ALTER trên schema.
Ngoài ra, mỗi predicate yêu cầu các quyền sau, được thêm vào:
- Quyền SELECT và REFERENCES trên function được dùng làm predicate.
- Quyền REFERENCES trên bảng đích được gắn với policy.
- Quyền REFERENCES trên mọi cột từ bảng đích được dùng làm tham số.
Security policies áp dụng cho tất cả người dùng, bao gồm cả database owner (DBO) trong database. DBO users có thể alter hoặc drop security policies. Tuy nhiên, thay đổi của họ đối với security policies có thể được audit. Trong trường hợp người dùng có quyền cao như sysadmin hoặc db_owner, bạn cần xem tất cả hàng để troubleshoot hoặc validate dữ liệu, nên bạn phải viết security policy để cho phép điều đó.
Nếu security policy được tạo với SCHEMABINDING = OFF, thì người dùng phải có quyền SELECT hoặc EXECUTE trên predicate function và bất kỳ bảng, view, hoặc function bổ sung nào được dùng trong predicate function để truy vấn bảng đích. Nếu security policy được tạo với SCHEMABINDING = ON (mặc định), thì các kiểm tra quyền này bị bỏ qua khi người dùng truy vấn bảng đích.
Sửa đổi SQL Server 2016 RLS
Thực hiện hành động sau để vô hiệu hóa SQL Server RLS cho một policy:
- Alter security policy UseFilter với
State = off.
Thực hiện các hành động sau để xóa filter và security policy:
- Drop security policy UseFilter.
- Drop function dbo.rowlevelPredicate.
Best practices
Microsoft đề xuất các best practices sau:
- Chúng tôi khuyên dring bạn nên tạo một schema riêng cho các đối tượng RLS (predicate function và security policy).
- Quyền ALTER ANY SECURITY POLICY dành cho người dùng có đặc quyền cao (như security policy manager). Security policy manager không yêu cầu quyền SELECT trên các bảng họ bảo vệ.
- Tránh chuyển đổi kiểu (type conversions) trong predicate functions để tránh lỗi runtime tiềm ẩn.
- Tránh đệ quy (recursion) trong predicate functions bất cứ nơi nào có thể để tránh giảm hiệu suất. Query optimizer cố gắng phát hiện đệ quy trực tiếp. Tuy nhiên, không đảm bảo tìm thấy đệ quy gián tiếp (ví dụ khi function thứ hai gọi predicate function).
- Tránh sử dụng quá nhiều table joins trong predicate functions để tối đa hóa hiệu suất.
Hạn chế và giới hạn trong RLS
Dưới đây là một số hạn chế áp dụng cho RLS:
- Predicate function phải được tạo với
SCHEMABINDING. Nếu function được tạo không cóSCHEMABINDING, và bạn cố gắng gắn nó vào security policy, nó sẽ ném lỗi. - Indexed views không thể được tạo trên bảng mà RLS được triển khai.
- In-memory tables không được hỗ trợ cho RLS.
- Full-text indexes không được hỗ trợ.
Kết luận
Với tính năng RLS trong SQL Server 2016, bạn có thể cung cấp bảo mật cho các bản ghi ở cấp database mà không cần thay đổi ở cấp ứng dụng. Bạn có thể triển khai RLS bằng cách sử dụng predicate function và tính năng security policy mới cùng với code hiện có, mà không cần thay đổi code Data Manipulation Language (DML) trong database của bạn.
Sử dụng tab Feedback để đưa ra bình luận hoặc đặt câu hỏi.
Tối ưu môi trường của bạn với quản trị, quản lý và cấu hình chuyên nghiệp
Các chuyên gia Dịch vụ ứng dụng của Rackspace (RAS) cung cấp các dịch vụ chuyên nghiệp và được quản lý sau đây trên danh mục ứng dụng rộng:
- Nền tảng eCommerce và Trải nghiệm số
- Quản trị nguồn lực doanh nghiệp (ERP)
- Business Intelligence
- Salesforce Quản trị quan hệ khách hàng (CRM)
- Databases
- Lưu trữ Email và Năng suất
Chúng tôi cung cấp:
- Chuyên môn khách quan: Chúng tôi đơn giản hóa và hướng dẫn hành trình hiện đại hóa của bạn, tập trung vào các khả năng mang lại giá trị ngay lập tức.
- Fanatical Experience™: Chúng tôi kết hợp phương pháp Process first. Technology second.® với hỗ trợ kỹ thuật chuyên dụng để cung cấp giải pháp toàn diện.
- Danh mục không đối thủ: Chúng tôi áp dụng kinh nghiệm đám mây rộng lớn để giúp bạn chọn và triển khai công nghệ phù hợp trên đám mây phù hợp.
- Giao hàng Agile: Chúng tôi gặp gỡ bạn ở bất kỳ đâu trong hành trình của bạn và điều chỉnh thành công của chúng tôi với của bạn.
Chat ngay để bắt đầu.