VERWEIGERN überschreibt GRANT in SQL Server?

7

Ich lerne für die Prüfung 70-462 und übe mit einigen Übungen, die ich im Internet finde. Auf der Website "Microsoft Questions and Answers" gibt es eine Lösung, die ich nicht verstehe.

Der letzte Schritt der Lösung besteht darin, "SELECT-Zugriff auf die SalaryDetails-Tabelle für die Employees-Rolle zu verweigern". Alle Mitarbeiter des Unternehmens wurden jedoch zu dieser Rolle hinzugefügt. Da "HR-Administratoren auch Mitarbeiter des Unternehmens sind", sollten HR-Administratoren keinen Zugriff auf die Tabelle "Gehaltsdetails" haben, was nicht erforderlich ist.

Ist die Lösung falsch oder fehlt mir etwas?

Vielen Dank im Voraus für jede Hilfe!

John Smith
quelle

Antworten:

4

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.] Geben Sie hier die Bildbeschreibung ein

Sie gewähren DENYder Rolle, Employeessodass 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 REVOKEanstelle 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 REVOKEdie 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;

quelle
Was bedeutet "die HR-Administratoren sind Mitglieder einer übergeordneten Rolle"? Ich habe möglicherweise etwas in der Frage übersehen, aber ich dachte, dass sich in diesem Beispiel sowohl die Rollen "Mitarbeiter" als auch "db_datareader" auf der Ebene "db" befinden.
BateTech
Ich stimme auch BateTech zu . Der Mitarbeiter ist eine Datenbankrolle , wie in der Lösung angegeben. Der db_datareader ist unter " Rollen auf Datenbankebene " in MSDN aufgeführt . Es gibt also auch keine Serverrolle , die sie in der Hierarchie des von Shawn Melton geposteten Bildes höher positionieren würde . Ein weiterer Kritikpunkt, den ich an der richtigen Lösung habe, ist, dass alle Mitarbeiter zur Mitarbeiterrolle hinzugefügt werden, während andere Lösungen (z. B. A) mehr
John Smith,
Wenn Ihr Datenbankbenutzer Mitglied einer Gruppe, Rolle usw. ist und der Benutzer in einer beliebigen Rolle eine DENY hat, überschreibt die DENY die GRANTs. Wenn Sie ein Datenbankbesitzer oder ein Systemadministrator sind, überschreiben diese Rollen die detaillierten Rechte.
RLF
Ich denke immer an das Widerrufen als Entfernen / Rückgängigmachen einer vorhandenen Berechtigung, nicht als Anwenden von Einschränkungen. Die Verwendung von Widerruf entspricht im Wesentlichen dem Deaktivieren eines Kontrollkästchens zum Gewähren (oder Verweigern) in der Benutzeroberfläche. Zu sagen, dass Widerruf "die Einschränkung anwendet, ohne explizit zu sein", ist ein wenig irreführend. Revoke wendet keine Einschränkung innerhalb der Datenbank an, sondern wird zum Rückgängigmachen einer Gewährung oder Verweigerung verwendet.
BateTech
Nun, Ihr Code hat das Problem wirklich behoben! Vielen Dank an Shawn Melton für die Mühe ... Ich bin derzeit unentschlossen zwischen den Antworten A und B ... Beide scheinen zu funktionieren. B scheint jedoch besser zu sein, da ein expliziter Zusatz zur HRAdmins-Rolle erforderlich ist, damit ein neuer Mitarbeiter auf vernünftige Informationen zugreifen kann ...
John Smith