Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Giới thiệu về Bảo mật cấp hàng trong SQL Server

Tại sao lại quan trọng đến vấn đề bảo mật ở cấp độ hàng?

Trước SQL Server 2016, bảo mật mức bảng là mức bảo mật thấp nhất mặc định cho cơ sở dữ liệu. Nói cách khác, người dùng có thể bị hạn chế quyền truy cập vào một bảng nói chung. Tuy nhiên, trong một số trường hợp, chúng tôi cần người dùng có quyền truy cập vào một bảng, nhưng không truy cập vào các hàng cụ thể trong bảng. Trước SQL Server 2016, quy trình được lưu trữ tùy chỉnh này bắt buộc phải được viết để cung cấp bảo mật chi tiết như vậy. Tuy nhiên, các thủ tục được lưu trữ như vậy dễ bị chèn SQL và các cảnh báo bảo mật khác.

Sử dụng Tính năng Bảo mật Cấp Hàng của SQL Server trên Thực hành

SQL Server 2016 đã giới thiệu một tính năng bảo mật cấp hàng mới cho phép người dùng có quyền truy cập vào bảng nhưng hạn chế họ truy cập vào các hàng cụ thể trong bảng đó. Hãy xem cách này có thể được sử dụng trong thực tế.

Mô tả

Có bốn bước để triển khai bảo mật cấp hàng trong SQL Server.

  1. Cấp quyền Chọn cho người dùng trên bàn mà bạn muốn triển khai bảo mật cấp hàng.
  2. Tiếp theo, bạn phải viết một hàm giá trị trong bảng có chứa một vị từ bộ lọc. Thêm logic bộ lọc vào vị ngữ bộ lọc.
  3. Cuối cùng, bạn cần liên kết vị từ bộ lọc mà bạn đã tạo ở bước thứ hai với chính sách bảo mật.
  4. Kiểm tra tính năng bảo mật cấp hàng.

Trước khi thực hiện các bước trên, chúng ta cần tạo một cơ sở dữ liệu giả với một số bản ghi giả. Thực thi tập lệnh sau để làm như vậy:

CREATE DATABASE University
GO

USE University
GO

USE University
CREATE TABLE Persons
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50),
Role VARCHAR (50)
)
GO

USE University
INSERT INTO Persons VALUES ('Sally', 'Principal' )
INSERT INTO Persons VALUES ('Edward', 'Student' )
INSERT INTO Persons VALUES ('Jon', 'Student' )
INSERT INTO Persons VALUES ('Scot', 'Student')
INSERT INTO Persons VALUES ('Ben', 'Student' )
INSERT INTO Persons VALUES ('Isabel', 'Teacher' )
INSERT INTO Persons VALUES ('David', 'Teacher' )
INSERT INTO Persons VALUES ('Laura', 'Teacher' )
INSERT INTO Persons VALUES ('Jean', 'Teacher')
INSERT INTO Persons VALUES ('Francis', 'Teacher' )

Trong tập lệnh, chúng tôi tạo một cơ sở dữ liệu giả “Đại học”. Tiếp theo, chúng tôi thực thi tập lệnh tạo một bảng có tên "Người". Nếu bạn nhìn vào thiết kế bảng, bạn có thể thấy rằng nó chứa ba cột Id, Tên và Vai trò. Cột Id là cột khóa chính có ràng buộc IDENTITY. Cột Tên chứa tên của người và cột Vai trò chứa vai trò của người đó. Cuối cùng, chúng tôi đã chèn 10 bản ghi vào bảng Người. Bàn có 1 Hiệu trưởng, 4 giáo viên và 5 học sinh.

Hãy thực hiện một câu lệnh SELECT đơn giản để xem các bản ghi trong bảng:

Use University
SELECT * FROM Persons

Kết quả như sau:

Chúng tôi muốn người dùng có tên là Hiệu trưởng có quyền truy cập vào tất cả các hàng trong bảng Người. Tương tự, một Giáo viên chỉ nên có quyền truy cập vào các bản ghi của Giáo viên, trong khi Học sinh chỉ được quyền truy cập vào các bản ghi của Học sinh. Đây là một trường hợp cổ điển của bảo mật cấp hàng.

Để triển khai bảo mật cấp độ hàng, chúng ta sẽ làm theo các bước mà chúng ta đã thảo luận trước đó.

Bước 1:Cấp Quyền Chọn cho Người dùng trên Bàn

Hãy tạo ba người dùng với các vai trò Hiệu trưởng, Giáo viên và Sinh viên và cấp cho họ quyền truy cập CHỌN đối với những người dùng này trên bảng Người. Thực thi tập lệnh sau để làm như vậy:

CREATE USER Principal WITHOUT LOGIN;
GO
CREATE USER Teacher WITHOUT LOGIN;
GO
CREATE USER Student WITHOUT LOGIN;
GO

Use University
GRANT SELECT ON Persons TO Principal;
GO
GRANT SELECT ON Persons TO Teacher;
GO
GRANT SELECT ON Persons TO Student;
GO

Bước 2:Tạo gợi ý bộ lọc

Khi người dùng đã được cấp quyền, bước tiếp theo là tạo một vị từ bộ lọc.

Tập lệnh sau thực hiện điều đó:

Use University
GO
CREATE FUNCTION dbo.fn_SP_Person(@Role AS sysname)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS fn_SP_Person_output
    -- Predicate logic
    WHERE @Role = USER_NAME()
    OR USER_NAME() = 'Principal';
GO

Vị từ bộ lọc được tạo bên trong một hàm có giá trị bảng nội tuyến và nhận vai trò của người dùng như một tham số. Nó trả về những bản ghi trong đó giá trị Vai trò được truyền dưới dạng tham số khớp với giá trị vai trò trong cột Vai trò. Hoặc nếu vai trò người dùng là 'Chính', tất cả các vai trò sẽ được trả về. Nếu bạn nhìn vào bộ lọc vị từ, bạn sẽ không tìm thấy tên bảng mà chúng tôi đang tạo bộ lọc. Vị từ bộ lọc được kết nối với bảng thông qua chính sách bảo mật mà chúng ta sẽ thấy trong bước tiếp theo.

Bước 3:Tạo Chính sách Bảo mật

Thực thi tập lệnh sau để tạo chính sách bảo mật cho vị từ bộ lọc mà chúng tôi đã tạo ở bước cuối cùng:

Use University
Go
CREATE SECURITY POLICY RoleFilter
ADD FILTER PREDICATE dbo.fn_SP_Person(Role)
ON dbo.Persons
WITH (STATE = ON);
GO

Trong chính sách Bảo mật, chúng tôi chỉ cần thêm vị từ bộ lọc mà chúng tôi đã tạo vào bảng Người. Để bật chính sách này, cờ “STATE” phải được đặt thành BẬT.

Bước 4:Kiểm tra bảo mật cấp hàng

Chúng tôi đã thực hiện tất cả các bước cần thiết để thực thi bảo mật cấp hàng trên bảng Người của cơ sở dữ liệu trường đại học. Trước tiên, hãy thử truy cập các bản ghi trong bảng Người thông qua người dùng mặc định. Thực thi tập lệnh sau:

Use University
SELECT * FROM Persons;
GO

Bạn sẽ không thấy gì trong đầu ra vì người dùng mặc định không thể truy cập vào bảng Người.

Hãy chuyển sang người dùng Sinh viên mà chúng ta đã tạo trước đó và cố gắng CHỌN bản ghi từ bảng Người:

EXECUTE AS USER = 'Student';
Use University
SELECT * FROM Persons; -- Student Records Only
REVERT;
GO

Trong tập lệnh ở trên, chúng tôi chuyển sang người dùng ‘Sinh viên’, các bản ghi đã chọn từ bảng Người và hoàn nguyên trở lại người dùng mặc định. Đầu ra trông giống như sau:

Bạn có thể thấy rằng do bảo mật cấp hàng, chỉ các bản ghi trong đó cột Vai trò có giá trị là Sinh viên mới được hiển thị.

Tương tự, người dùng Giáo viên sẽ chỉ có quyền truy cập vào các bản ghi mà cột Vai trò có giá trị là Giáo viên. Thực thi tập lệnh sau để xác minh điều này:

EXECUTE AS USER = 'Teacher';
Use University
SELECT * FROM Persons; -- All Records
REVERT;
GO

Trong đầu ra, bạn sẽ có các bản ghi sau:

Cuối cùng, trong vị từ bộ lọc của chúng tôi, chúng tôi đã triển khai logic rằng Người dùng chính có thể truy cập tất cả các bản ghi. Hãy xác minh điều này bằng cách thực hiện truy vấn sau:

EXECUTE AS USER = 'Principal';
Use University
SELECT * FROM Persons; -- All Records
REVERT;
GO

Trong đầu ra, bạn sẽ thấy tất cả các bản ghi như hình dưới đây:

Kết luận

Tính năng bảo mật cấp độ hàng cực kỳ hữu ích khi bạn muốn người dùng có quyền truy cập chi tiết vào dữ liệu cụ thể. Tuy nhiên, tính năng bảo mật cấp hàng liên quan đến chức năng có giá trị bảng nội dòng, có thể khiến bạn gặp phải hiệu suất.

Theo nguyên tắc chung, nếu bạn định sử dụng mệnh đề WHERE đơn giản trong chức năng vị ngữ, thì hiệu suất của bạn sẽ không bị ảnh hưởng. Mặt khác, nên tránh các câu lệnh nối phức tạp liên quan đến bảng tra cứu khi bạn đã triển khai bảo mật cấp hàng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để truy vấn các giá trị và thuộc tính Xml từ bảng trong SQL Server?

  2. Sao chép cơ sở dữ liệu SQL Server

  3. Nhận AVG bỏ qua giá trị Null hoặc Zero

  4. Khám phá các thao tác lập chỉ mục trực tuyến cấp độ phân vùng trong SQL Server 2014 CTP1

  5. Kiểm tra ràng buộc trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / TSQL Phần 82