DENY ghi đè GRANT trong SQL Server?


7

Tôi đang học bài kiểm tra 70-462 và tôi đang luyện tập với một số bài tập tôi tìm thấy trên web. Trong trang web "Câu hỏi và câu trả lời của Microsoft"một giải pháp tôi không hiểu.

Bước cuối cùng của giải pháp là "Từ chối quyền truy cập CHỌN vào bảng SalaryDetails cho vai trò Nhân viên." Tuy nhiên, tất cả nhân viên của công ty đã được thêm vào vai trò này và vì "Quản trị viên nhân sự cũng là nhân viên của công ty", nên Quản trị viên nhân sự sẽ kết thúc mà không có bất kỳ quyền truy cập nào vào bảng SalaryDetails, đây không phải là điều được yêu cầu.

Là giải pháp sai, hoặc tôi đang thiếu một cái gì đó?

Cảm ơn trước sự giúp đỡ nào!

Câu trả lời:


4

Nó phải được thực hiện với hệ thống phân cấp quyền và sử dụng tư cách thành viên qua việc cấp quyền trực tiếp cho mỗi lần đăng nhập. Bài viết SQLMag này cho thấy một hình ảnh tốt về chữ tượng hình trong SQL Server. [Trong trường hợp bài báo bị chết, tôi đã sao chép hình ảnh bên dưới.] nhập mô tả hình ảnh ở đây

Bạn đang cấp DENYcho vai trò Employeesđể Quản trị viên nhân sự là thành viên của vai trò cấp cao hơn có nghĩa là họ không trực tiếp kế thừa DENY. Ít nhất đó là cách tôi hiểu nó.

Phần cụ thể của bài viết được tham chiếu nói về DENY:

Tuyên bố cho phép thứ ba là DENY. Một tuyên bố DENY cũng thu hồi sự cho phép, nhưng thực hiện nó theo cách mà hiệu trưởng không thể kế thừa quyền thông qua vai trò thành viên. Khi bạn từ chối một sự cho phép, hiệu trưởng đó không có nó, khoảng thời gian. Từ chối quyền có thể cho phép bạn có được rất chi tiết với quyền. Một ví dụ phổ biến là cấp cho mọi người trong bộ phận một bộ quyền thông qua tư cách thành viên của họ trong một vai trò. Nhưng sau đó, bạn có thể tinh chỉnh lược đồ bằng cách từ chối cấp phép cho một số người dùng nhất định hoặc cho một vai trò khác mà chỉ một tập hợp con của người dùng thuộc về, tận dụng khả năng của người dùng thuộc nhiều vai trò.

Tôi đứng sửa

Hãy để tôi nói trước là tôi xin lỗi vì đã không kiểm tra những gì tôi đang nói khi tôi chứng minh mình đã sai. Đáng lẽ ra tôi phải biết nhiều hơn thế.

Bài học đầu tiên để học: Kiểm tra mọi thứ.

Bài học thứ hai để học: Không phải tất cả các câu hỏi của Microsoft thi đều hoàn hảo. Tôi sẽ đề nghị gắn bó với các công cụ kiểm tra mà Microsoft hỗ trợ (ví dụ: Đo lường.com )

Trả lời trước chi tiết

Trước tiên tôi sẽ cung cấp cho bạn những gì tôi khám phá, sau đó cho bạn thấy tôi đã thử nghiệm nó như thế nào. Vì vậy, phát hiện của tôi là về cơ bản tùy chọn D thể đúng nếu bạn sử dụng REVOKEthay vì DENY. Điều này dựa trên tuyên bố từ whitepaper của Bob Beauchemin về Thực tiễn tốt nhất về bảo mật SQL Server 2005:

Trong SQL Server, ủy quyền được thực hiện thông qua Ngôn ngữ truy cập dữ liệu (DAL) thay vì DDL hoặc DML. Ngoài hai động từ DAL, GRANT và REVOKE, được ủy quyền bởi tiêu chuẩn ISO-ANSI, SQL Server còn chứa động từ DENY DAL. DENY khác với REVOKE khi người dùng là thành viên của nhiều cơ sở dữ liệu. Nếu người dùng Fred là thành viên của ba vai trò cơ sở dữ liệu A, B và C và vai trò A và B được cấp phép cho bảo mật, nếu quyền đó là REVOKEd từ vai trò C, Fred vẫn có thể truy cập bảo mật. Nếu bảo mật được DENYed cho vai trò C, Fred không thể truy cập vào bảo mật. Điều này làm cho việc quản lý SQL Server tương tự như quản lý các phần khác trong họ hệ điều hành Windows.

Vì vậy, về cơ bản REVOKEloại bỏ các quyền và về cơ bản sẽ không áp dụng bất kỳ quyền nào cho chính bảng. Bạn không từ chối rõ ràng bất cứ ai truy cập vào bảng. Vì vậy, nếu bạn thực sự muốn từ chối quyền, bạn sẽ phải xóa nhóm HRAdmins khỏi vai trò Nhân viên để nó hoạt động chính xác.

Tôi không có quyền truy cập vào Azure SQL vì vậy tôi chỉ có thể kiểm tra điều này trên phiên bản SQL Server 2014 cục bộ. Kịch bản dưới đây là những gì tôi đã trải qua, bao gồm các ý kiến ​​khi tôi đi.

USE [master];
GO
--Create a database to work with
CREATE DATABASE [Database_WorkingWithPermissions];
GO

--Create the logins (I can't create Windows Groups but should work the same way)
CREATE LOGIN HRAdmin1 WITH PASSWORD = N'Apple123';

CREATE LOGIN Employee1 WITH PASSWORD = N'Apple123';

--Create the users in the database
USE [Database_WorkingWithPermissions];
GO

CREATE USER Employee1 FROM LOGIN Employee1;
CREATE USER HRAdmin1 FROM LOGIN HRAdmin1;
GO

--Create the role
CREATE ROLE Employees

--Create the tables noted in the question
CREATE TABLE [Employees] (employeeID int IDENTITY(1,1), employeeName varchar(15));
CREATE TABLE [SalaryDetails] (employeeID int, salaryAmount decimal(12,3));
CREATE TABLE [OtherTable] (column1 int);

--Grant permissions to the roles according to requirements
GRANT SELECT ON [dbo].[Employees] TO [Employees];
GO
GRANT SELECT ON [dbo].[OtherTable] TO [Employees];
GO
DENY SELECT ON [dbo].[SalaryDetails] TO [Employees];
GO

--Assign membership to the role based on requirements
ALTER ROLE [Employees] ADD MEMBER [Employee1];
GO
ALTER ROLE [Employees] ADD MEMBER [HRAdmin1]
GO
ALTER ROLE [db_datareader] ADD MEMBER [HRAdmin1];
GO

--Go through and see what permissions
EXECUTE AS USER = 'HRAdmin1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

EXECUTE AS USER = 'Employee1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

--So HRAdmin1 does not have permissions as it should
-- So they need to be removed from the Employee role
ALTER ROLE [Employees] DROP MEMBER [HRAdmin1]
GO

--Run the test again
--Go through and see what permissions
EXECUTE AS USER = 'HRAdmin1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

EXECUTE AS USER = 'Employee1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

--According to a SQL Server 2005 whitepaper Bob Beauchemin wrote on Security Best Practices
-- Revoke should be used
ALTER ROLE [Employees] ADD MEMBER [HRAdmin1]
GO
REVOKE SELECT ON [dbo].[SalaryDetails] TO [Employees];
GO

--Run the test again
--Go through and see what permissions
EXECUTE AS USER = 'HRAdmin1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

EXECUTE AS USER = 'Employee1'
SELECT * FROM [dbo].[Employees];
SELECT * FROM [dbo].[SalaryDetails];
REVERT;

"Quản trị viên nhân sự là thành viên của vai trò cấp cao hơn" nghĩa là gì? Tôi có thể đã bỏ lỡ điều gì đó trong câu hỏi, nhưng tôi nghĩ cả hai vai trò Nhân viên và db_datareader đều ở cấp db trong ví dụ này.
BateTech

Tôi cũng đồng ý với BateTech . Nhân viên là một vai trò cơ sở dữ liệu , như đã nêu trong giải pháp; db_datareader được liệt kê trong " Vai trò cấp cơ sở dữ liệu " trên MSDN . Vì vậy, không phải là một vai trò máy chủ , mà sẽ định vị nó cao hơn trong hệ thống phân cấp của hình ảnh Shawn Melton đăng. Một cách giải quyết khác mà tôi có với giải pháp chính xác là nó bổ sung tất cả nhân viên vào vai trò Nhân viên, trong khi các giải pháp khác (ví dụ: A) thì nhiều hơn
John Smith

Nếu người dùng cơ sở dữ liệu của bạn là thành viên của một nhóm, vai trò, v.v. và người dùng có DENY trong bất kỳ vai trò nào thì DENY sẽ ghi đè GRANT. Nếu bạn là db_owner hoặc sysadmin thì các vai trò đó sẽ ghi đè các quyền chi tiết.
RLF

Tôi luôn nghĩ về việc thu hồi là xóa / hoàn tác một quyền hiện có, không áp dụng bất kỳ hạn chế nào. Sử dụng thu hồi về cơ bản là tương đương với "bỏ chọn" hộp kiểm cấp (hoặc từ chối) trong giao diện người dùng. Vì vậy, nói rằng thu hồi "áp dụng các hạn chế mà không rõ ràng" là một chút sai lầm. Thu hồi không áp dụng bất kỳ hạn chế nào trong cơ sở dữ liệu, nó được sử dụng để hoàn tác cấp hoặc từ chối.
BateTech

Vâng, mã của bạn thực sự làm sáng tỏ vấn đề! Cảm ơn Shawn Melton vì những nỗ lực ... Tôi hiện chưa quyết định giữa câu trả lời A và B ... Cả hai dường như đều hoạt động. Tuy nhiên, B có vẻ tốt hơn, vì cần thêm một vai trò rõ ràng cho vai trò HRAdmins cho một nhân viên mới để truy cập thông tin hợp lý ...
John Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.