Dies hat mit der Hierarchie der Berechtigungen und der Verwendung der Rollenmitgliedschaft zu tun, anstatt Berechtigungen direkt für jede Anmeldung zu erteilen. Dieser SQLMag-Artikel zeigt ein gutes Bild der Hierarchie in SQL Server. [Für den Fall, dass der Artikel jemals tot sein sollte, habe ich das Bild unten kopiert.]
Sie gewähren DENY
der Rolle, Employees
sodass die HR-Administratoren, die Mitglied einer übergeordneten Rolle sind, bedeuten sollten, dass sie die Rolle nicht direkt erben DENY
. Zumindest verstehe ich das so.
Der bestimmte Abschnitt des Artikels, auf den verwiesen wird, spricht über DENY
:
Die dritte Erlaubniserklärung lautet VERWEIGERN. Eine DENY-Anweisung widerruft ebenfalls eine Berechtigung, tut dies jedoch so, dass der Principal die Berechtigung nicht durch Rollenmitgliedschaft erben kann. Wenn Sie eine Berechtigung verweigern, hat dieser Principal sie nicht, Punkt. Wenn Sie Berechtigungen verweigern, können Sie die Berechtigungen sehr detailliert festlegen. Ein häufiges Beispiel besteht darin, jedem in einer Abteilung durch seine Mitgliedschaft in einer Rolle eine Reihe von Berechtigungen zu erteilen. Sie können das Schema dann jedoch optimieren, indem Sie bestimmten Benutzern oder einer anderen Rolle, zu der nur eine Teilmenge von Benutzern gehört, Berechtigungen verweigern und dabei die Fähigkeit von Benutzern nutzen, mehreren Rollen anzugehören.
Ich stehe korrigiert
Lassen Sie mich zunächst feststellen, dass ich mich dafür entschuldige, dass ich nicht zuerst getestet habe, was ich gesagt habe, als ich mich als falsch erwiesen habe. Ich hätte es besser wissen sollen.
Erste Lektion zu lernen: Testen Sie alles.
Zweite Lektion zu lernen: Nicht alle Microsoft Exam-Fragen sind perfekt. Ich würde vorschlagen, bei den von Microsoft unterstützten Test-Engines zu bleiben (z. B. MeasureUp.com ).
Antworte vor den Details
Ich werde Ihnen zuerst geben, was ich entdeckt habe, und Ihnen dann zeigen, wie ich es getestet habe. Mein Ergebnis ist also, dass Option D im Grunde genommen korrekt sein kann , wenn Sie REVOKE
anstelle von verwenden DENY
. Dies basiert auf der Aussage aus Bob Beauchemins Whitepaper zu SQL Server 2005-Best Practices für die Sicherheit:
In SQL Server erfolgt die Autorisierung über DAL (Data Access Language) anstelle von DDL oder DML. Zusätzlich zu den beiden DAL-Verben GRANT und REVOKE, die vom ISO-ANSI-Standard vorgeschrieben werden, enthält SQL Server auch ein DENY-DAL-Verb. DENY unterscheidet sich von REVOKE, wenn ein Benutzer Mitglied von mehr als einem Datenbankprinzipal ist. Wenn ein Benutzer Fred Mitglied von drei Datenbankrollen A, B und C ist und den Rollen A und B die Berechtigung für eine Sicherung erteilt wurde, kann Fred weiterhin auf die Sicherung zugreifen, wenn die Berechtigung von Rolle C REVOKEd ist. Wenn der Sicherung die Rolle C verweigert wird, kann Fred nicht auf die Sicherung zugreifen. Dadurch ähnelt die Verwaltung von SQL Server der Verwaltung anderer Teile der Windows-Betriebssystemfamilie.
Entfernt also im Grunde REVOKE
die Berechtigungen und würde im Grunde keine Berechtigungen auf die Tabelle selbst anwenden. Sie verweigern niemandem explizit den Zugriff auf die Tabelle. Wenn Sie also wirklich Berechtigungen verweigern möchten, müssen Sie die HRAdmins-Gruppe aus den Employees-Rollen entfernen, damit sie ordnungsgemäß funktioniert.
Ich habe keinen Zugriff auf Azure SQL, daher konnte ich dies nur auf einer lokalen SQL Server 2014-Instanz testen. Das folgende Skript ist das, was ich durchgemacht habe, und enthält Kommentare, während ich gehe.
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;