Bảo mật mức hàng trong SQL Server
1 GV Phi Loan - Khoa CNTT – UIH
2
GV Phi Loan - Khoa CNTT – UIH
Nội dung
• Case study
– Xây dựng bảng, hàm, thủ tục và trigger cho
mục đích bảo mật mức hàng
3
GV Phi Loan - Khoa CNTT – UIH
Đặt vấn đề
• SQL Server tuy bảo mật bảng và cột
(vertical security) rất tốt nhưng lại không có khả năng bảo mật mức hàng (row- level security).
• Views với tùy chọn with check option có thể cung cấp dạng bảo mật mức hàng nhưng nếu phải duy trì hàng tá view để quản l{ thì quá phức tạp.
4
GV Phi Loan - Khoa CNTT – UIH
View
CREATE VIEW
[ < database_name >.] [ < owner > . ] view_name [ ( column [ ,...n ] ) ]
AS
select_statement [ WITH CHECK OPTION ] .
5
GV Phi Loan - Khoa CNTT – UIH
Lệnh View
• [ WITH CHECK OPTION ]: bắt buộc tất cả các lệnh chỉnh sửa dữ liệu liên quan đến view đều phải tuân theo điều kiện lọc trong mệnh đề select. – Khi 1 hàng bị sửa đổi thông qua view, WITH
CHECK OPTION bảo đảm là dữ liệu vẫn còn nhìn thấy được thông qua view.
– Bất kz lệnh sửa đổi nào mà làm cho các hàng biến mất khỏi view sẽ bị loại trừ và hiển thị thông báo lỗi.
6
GV Phi Loan - Khoa CNTT – UIH
Ví dụ
CREATE VIEW CAonly AS SELECT au_lname, au_fname, city, state FROM authors WHERE state = 'CA' WITH CHECK OPTION
UPDATE CAOnly Set state = ‘KS’ WHERE state =‘CA’ and au_fname ='Ann' Lệnh update này có thực hiện được
không?
7
GV Phi Loan - Khoa CNTT – UIH
Case study
• Cơ sở dữ liệu mẫu OBXKites cần thực thi
bảo mật mức hàng.
• Mỗi nhân viên (employee) trong bảng
Contact có thể được cấp các quyền khác nhau (read, write, hay administrator) khi truy xuất dữ liệu về bán hàng và kho hàng tùy theo mỗi chi nhánh.
8
GV Phi Loan - Khoa CNTT – UIH
Business-security rules
• Tuy dữ liệu về kho, kế hoạch sản xuất được quản l{ bởi riêng phòng kế hoạch, nhưng tất cả phòng ban trong công ty được quyền xem dữ liệu về hàng hóa, tình trạng kho …
• Dữ liệu về mỗi nhân viên chỉ có phòng nhân sự và trưởng phòng của nhân viên đó mới được quyền xem.
9
GV Phi Loan - Khoa CNTT – UIH
Business-security rules
• Hệ thống đặt mua hàng chỉ cho phép người mua loại nào mới được đặt mua hàng thuộc loại đó.
• Mỗi chi nhánh ngân hàng có thể đọc được dữ liệu khách hàng nhưng chỉ có ngân hàng nào mà khách hàng là thành viên mới được phép chỉnh sửa dữ liệu của khách hàng đó.
10
GV Phi Loan - Khoa CNTT – UIH
Yêu cầu bảo mật
• Để thực thi việc bảo mật mức hàng, cần 4 thành
phần sau:
1.
2.
3.
4.
Security table: chứa danh sách user bao gồm phòng ban nhân viên đó trực thuộc và các quyền read/write. Security procedure: kiểm tra quyền của user cùng với dữ liệu mà user đó yêu cầu. Fetch procedure: thông qua việc kiểm tra security procedure trả về dữ liệu thích hợp Triggers: gọi security procedure để kiểm tra quyền user khi thực thi các lệnh DML.
11
GV Phi Loan - Khoa CNTT – UIH
Bảng security
• Bảng security table dùng như bảng kết hợp many-to-many giữa 2 bảng contact và location tables.
• Mức độ bảo mật xác định mức truy xuất:
– 0 (or no rows): 0 access – 1: Read access – 2: Write access – 3: Admin access
12
GV Phi Loan - Khoa CNTT – UIH
Bảng security
• Bảng có 2 khóa ngoại tham chiếu đến 2 bảng contact và location theo cơ chế cascading deletes.
• Bảng có 2 ràng buộc (constraint):
– Hạn chế dữ liệu nhập cho cột security codes
(0–3)
– Ràng buộc duy nhất để bảo đảm mỗi contact và location chỉ có duy nhất 1 mã security.
13
GV Phi Loan - Khoa CNTT – UIH
Tạo Bảng security
USE OBXKites; CREATE TABLE dbo.Security (
SecurityID int identity NOT NULL PRIMARY KEY NONCLUSTERED, ContactID UniqueIdentifier NOT NULL
REFERENCES dbo.Contact(ContactID) ON DELETE CASCADE,
LocationID UniqueIdentifier NOT NULL
REFERENCES dbo.Location(LocationID) ON DELETE CASCADE,
SecurityLevel INT NOT NULL DEFAULT 0
);
14
GV Phi Loan - Khoa CNTT – UIH
Hai ràng buộc của bảng security
ALTER TABLE dbo.Security
ADD CONSTRAINT ValidSecurityCode CHECK (SecurityLevel IN (0,1,2,3));
ALTER TABLE dbo.Security
ADD CONSTRAINT ContactLocation UNIQUE (ContactID, LocationID);
15
GV Phi Loan - Khoa CNTT – UIH
Trigger bảo đảm
CREATE TRIGGER ContactID_RI
ON dbo.Security AFTER INSERT, UPDATE
AS
SET NOCOUNT ON; IF EXISTS(SELECT * FROM Inserted INNER JOIN dbo.Contact
ON Inserted.ContactID = Contact.ContactID WHERE Contact.ContactID IS NULL OR IsEmployee = CAST(0 AS bit))
BEGIN
RAISERROR (‘Foreign Key Constraint: Security.ContactID’, 16, 1); ROLLBACK TRANSACTION; RETURN;
Mục đích của Trigger??
END;
16
GV Phi Loan - Khoa CNTT – UIH
Admin procedures
• Thủ tục trả về quyền của mỗi user • Thủ tục gán quyền cho mỗi nhân viên • Thủ tục kiểm tra mức bảo mật của nhân
viên
• Hàm kiểm tra bảo mật
17
GV Phi Loan - Khoa CNTT – UIH
Thủ tục trả về quyền của user
CREATE PROCEDURE pSecurity_Fetch
@LocationCode VARCHAR(15) = NULL, @ContactCode VARCHAR(15) = NULL
AS
SET NOCOUNT ON; SELECT c.ContactCode, l.LocationCode, s.SecurityLevel FROM dbo.Security AS s INNER JOIN dbo.Contact AS c
ON s.ContactID = c.ContactID INNER JOIN dbo.Location AS l ON s.LocationID = l.LocationID
WHERE (l.LocationCode = @LocationCode
OR @LocationCode IS NULL)
AND (c.ContactCode = @ContactCode
OR @ContactCode IS NULL);
18
GV Phi Loan - Khoa CNTT – UIH
Thủ tục gán quyền security cho user
-- Get LocationID SELECT @LocationID = LocationID
CREATE PROCEDURE pSecurity_Assign @ContactCode VARCHAR(15), @LocationCode VARCHAR(15), @SecurityLevel
FROM dbo.Location WHERE LocationCode = @LocationCode;
INT
IF @@ERROR <> 0 RETURN -100; IF @LocationID IS NULL BEGIN
AS SET NOCOUNT ON; DECLARE @ContactID UNIQUEIDENTIFIER,
@LocationID UNIQUEIDENTIFIER;
RAISERROR (‘Location: "%s" not found’, 15,1,@LocationCode);
RETURN -100;
-- Get ContactID SELECT @ContactID = ContactID
FROM dbo.Contact WHERE ContactCode = @ContactCode;
END; -- Insert INSERT dbo.Security
(ContactID,LocationID, SecurityLevel)
VALUES
IF @@ERROR <> 0 RETURN -100 IF @ContactID IS NULL BEGIN
(@ContactID, @LocationID, @SecurityLevel);
RAISERROR (‘Contact: "%s" not found’, 15,1,@ContactCode);
IF @@ERROR <> 0 RETURN -100; RETURN;
RETURN -100; END;
19 GV Phi Loan - Khoa CNTT – UIH
Tìm thông tin nhân viên và chi nhánh
• Tìm ContactCode của nhân viên:
SELECT ContactCode FROM dbo.Contact WHERE IsEmployee = CAST(1 AS bit); • Tìm mã các chi nhánh (LocationCode):
SELECT LocationCode FROM dbo.Location;
20
GV Phi Loan - Khoa CNTT – UIH
Gán quyền bảo mật cho các nhân viên
• Gán cho nhân viên 118 các quyền khác nhau ở các chi
nhánh khác nhau: EXEC pSecurity_Assign @ContactCode = ‘118’, @LocationCode = ‘CH’, @SecurityLevel = 3;
EXEC pSecurity_Assign @ContactCode = ‘118’, @LocationCode = ‘Clt’, @SecurityLevel = 2;
EXEC pSecurity_Assign @ContactCode = ‘118’, @LocationCode = ‘Elc’, @SecurityLevel = 1;
21
GV Phi Loan - Khoa CNTT – UIH
Thủ tục kiểm tra bảo mật
CREATE PROCEDURE p_SecurityCheck
@ContactCode VARCHAR(15), @LocationCode VARCHAR(15), @SecurityLevel INT, @Approved BIT OUTPUT
AS
SET NOCOUNT ON; DECLARE @ActualLevel INT = 0; SELECT @ActualLevel = s.SecurityLevel FROM dbo.Security AS s INNER JOIN dbo.Contact AS c ON s.ContactID = c.ContactID INNER JOIN dbo.Location AS l ON s.LocationID = l.LocationID WHERE c.ContactCode = @ContactCode
AND l.LocationCode = @LocationCode;
22
GV Phi Loan - Khoa CNTT – UIH
Thủ tục kiểm tra bảo mật (tt)
IF @ActualLevel < @SecurityLevel
SET @Approved = CAST(0 AS bit);
ELSE
SET @Approved = CAST(1 AS bit);
RETURN 0;
• Chạy thử: DECLARE @OK BIT; EXEC p_SecurityCheck @ContactCode = ‘118’, @LocationCode = ‘Clt’, @SecurityLevel = 3, @Approved = @OK OUTPUT;
SELECT @OK;
23
GV Phi Loan - Khoa CNTT – UIH
Hàm kiểm tra bảo mật
• Hàm fSecurityCheck có cùng chức năng
như thủ tục pSecurity_Check • Mục đích của việc tạo hàm:
– Có thể dùng trực tiếp trong lệnh IF mà
không cần dùng biến để lưu trữ tham số output của thủ tục.
24
GV Phi Loan - Khoa CNTT – UIH
Hàm fSecurityCheck
CREATE FUNCTION dbo.fSecurityCheck ( @ContactCode VACHAR(15), @LocationCode VARCHAR(15), @SecurityLevel INT) RETURNS BIT AS BEGIN
DECLARE @Approved BIT = CAST(0 AS bit); IF (SELECT s.SecurityLevel FROM dbo.Security AS s INNER JOIN dbo.Contact AS c ON s.ContactID = c.ContactID INNER JOIN dbo.Location AS l ON s.LocationID = l.LocationID WHERE c.ContactCode = @ContactCode
AND l.LocationCode = @LocationCode) >= @SecurityLevel
25
GV Phi Loan - Khoa CNTT – UIH
Hàm fSecurityCheck (tt)
BEGIN
SET @Approved = CAST(1 AS bit);
END;
RETURN @Approved;
END;
26
GV Phi Loan - Khoa CNTT – UIH
Kiểm tra hàm fSecurityCheck (tt)
IF dbo.fSecurityCheck( ‘118’, ‘Clt’, 3) = CAST(0 AS bit) BEGIN
RAISERROR(‘Security Violation’, 16,1); ROLLBACK TRANSACTION; RETURN -100;
END;
27
GV Phi Loan - Khoa CNTT – UIH