2016-04-05 4 views
0

Mein Team ist kürzlich in ein formalisierteres System der SQL Server-Datenbanküberwachungs- und -bereitstellungssteuerelemente gewechselt, und als Ergebnis wurden mehrere Berechtigungen eingeschränkt.SQL Server-Berechtigungstypen

Viele von uns sind mit der SQL Server-Sicherheit nicht vertraut und haben Szenarien kennengelernt, in denen wir nur eine Zugriffsbeschränkung für beispielsweise TRUNCATE TABLE in der Produktion bereitstellen.

Es ist nur ein Ärgernis in diesem Stadium, aber ich habe versucht, eine konsolidierte Liste zu finden (cheatsheet? Cabsheet? Referenzsuche?), Leicht gegen solche Funktionen zu überprüfen, so dass es nicht so einfach passiert, aber ich habe keine gefunden.

Ich weiß, dass der MSN-Artikel für jede Funktion diese auflistet, aber ich möchte nicht einzeln auf die spezifische Website für jede gebräuchliche und seltene Funktion nur zu überprüfen suchen, besonders wenn ich es mehr als tun muss Einmal, weil ich (zum Beispiel) vergessen habe.

Die nächstgelegene ich fand, waren Orte wie diese:

https://www.mssqltips.com/sqlservertip/1718/database-level-permissions-for-sql-server-2005-and-2008/

https://www.simple-talk.com/sql/database-administration/sql-server-security-cribsheet/

... aber sie waren unvollständig (konnte nicht in beide finden TRUNCATE) und ein wenig lang: Ich hoffe, es gibt irgendwo eine Tabelle, die einfach 'Aktion -> Aktionsname -> Berechtigungsname -> Server-/Tabellenebene -> Standardrolle' oder etwas zusammen an einer Stelle setzt.

Gibt es irgendwo eine solche Liste?

+0

Eigentlich stolperte auf diese fast nach der Veröffentlichung dieses Artikels, aber nicht über Google (auf der Website mssqltips). Diese sind definitiv hilfreich, aber decken Berechtigungen auf Tabellenebene immer noch nicht ab, sodass TRUNCATE weiterhin fehlt ... https://www.mssqltips.com/sqlservertip/1714/server-level-permissions-for-sql-server -2005-and-sql-server-2008/ https://www.mssqltips.com/sqlservertip/1718/database-level-permissions-for-sql-server-2005-and-2008/ –

+0

Für Bereitstellungszwecke Sie sollten ein Benutzerkonto erstellen, das mit der Rolle "db_owner" oder "db_ddladmin" erstellt wurde, und dieses Konto (über ein Bereitstellungsdienstprogramm?) verwenden, um die Datenbankänderungen in der Produktion bereitzustellen. Dies würde auch beim Auditing und bei den besseren Bereitstellungskontrollen helfen, da nur ein Konto Bereitstellungen durchführen würde. – AKS

+0

Nicht ... ganz was ich meinte. Wenn Sie die Tabelle als Beispiel abschneiden, sollte die Aktion regelmäßig in einer gespeicherten Prozedur ausgeführt werden, in diesem Fall durch ein Benutzerkonto, das noch kein "db_owner" war. Der Benutzer, der die Bereitstellung durchgeführt hat, war "db_owner", aber es war nicht das Konto, das diesen SP ausführen sollte. Da wir als Eigentümer in unseren lokalen Datenbanken verschlüsselt waren, kam es nie zu einem Genehmigungsproblem, so dass niemand etwas vermutete, bis es eingesetzt wurde und verwendet wurde. –

Antwort

0

Leider ist mir kein Dokument bekannt, das jede Aktion in SQL Server mit den erforderlichen Berechtigungen zeigt. Solch eine Tabelle wäre unpraktisch, da es sehr viele mögliche Aktionen gibt und einige Aktionen mehrere Berechtigungen erfordern, einschließlich Szenarien, in denen sich die Berechtigungsanforderungen je nach Teilbereichen der Aktion ändern würden.

Für das Szenario, das Sie versuchen zu lösen, scheint es, als ob Sie Module (SPs) verwenden, um die Aktionen zu definieren, die den Benutzern ohne Administratorrechte erlaubt sind, richtig? In diesem Fall können Sie möglicherweise digital signierte Module verwenden, um beim Ausführen des SP die entsprechenden Berechtigungen zu erteilen, anstatt die Berechtigung direkt zuzuweisen. Zum Beispiel:

CREATE USER [low_priv_user] WITHOUT LOGIN 
go 

CREATE TABLE [dbo].[myTable](data int); 
go 

CREATE PROC [dbo].[sp_truncate_my_table] 
AS 
    TRUNCATE TABLE [dbo].[sp_truncate_my_table]; 
go 

GRANT EXECUTE ON [dbo].[sp_truncate_my_table] TO [low_priv_user] 
go 

-- Will fail due to permission 
EXECUTE ('EXEC [dbo].[sp_truncate_my_table];')AS USER = 'low_priv_user'; 
go 

-- Create a certificate to sign the SP, 
CREATE CERTIFICATE [signing_cert] 
    ENCRYPTION BY PASSWORD = '<[email protected]>' 
    WITH SUBJECT = 'demo - module signature'; 
go 
-- sign the SP 
ADD SIGNATURE TO [dbo].[sp_truncate_my_table] BY CERTIFICATE [signing_cert] 
    WITH PASSWORD = '<[email protected]>'; 
go 
-- destroy the private key 
ALTER CERTIFICATE [signing_cert] REMOVE PRIVATE KEY; 
go 

-- Create a user for the certificate & grant it all the permissions you would need for running teh SP 
CREATE USER [signing_cert] FROM CERTIFICATE [signing_cert]; 
go 
GRANT ALTER ON [myTable] TO [signing_cert]; 
go 

-- Permission check will be OK for the low privileged user 
-- You control what this user is allowed to do via SPs 
EXECUTE ('EXEC [dbo].[sp_truncate_my_table];')AS USER = 'low_priv_user'; 
go 

Wie Sie sehen können, habe ich ein Modul, das den Anrufer anrufen TRUNCATE auf einem Tisch, ohne Gewährung ALTER Erlaubnis direkt an den Benutzer ermöglicht.

Im Idealfall möchten Sie bei der Verwendung dieses Mechanismus dem Prinzip der geringsten Rechte folgen und nur die erforderlichen Berechtigungen und nichts anderes gewähren. Wenn Sie jedoch Schwierigkeiten haben, die benötigten Berechtigungen zu finden, können Sie eine Verknüpfung verwenden: GRANT CONTROL TO [signing_cert].

Offensichtlich hat eine solche Verknüpfung erhebliche Auswirkungen auf die Sicherheit, da Sie dem signierten Code buchstäblich die volle Kontrolle über Ihre Datenbank gewähren (einschließlich dynamischem SQL innerhalb dieser Module), aber wenn Sie sich dafür entscheiden, würde ich die folgenden Vorsichtsmaßnahmen empfehlen :

  • den privaten Schlüssel zerstören, damit niemand es
  • missbrauchen nicht dynamische SQL in Ihrer signierten Module (oder zumindest sicherstellen, dass unter SQL-Injection Sie sind nicht)
  • verwenden Sie nach Möglichkeit vermeiden Geben Sie CONTROL Erlaubnis auf Modulen, wo Sie kann die minimalen Privilegien gewähren.
  • Überwachen Sie alle Aktivitäten in Ihrer Datenbank.

Ich schließe auch eine Kopie der SQL Database Engine Permission Poster Verbindung ein, die nützlich sein kann.

Ich hoffe, diese Informationen helfen.

+0

Danke! Ich habe noch nie Zertifikate verwendet, aber ich denke, ich kann sehen, was Sie meinen. Ihre Vorsichtsmaßnahmen sind auch sehr nützlich, danke. –

+0

Auch der Poster-Link ist genau das, was wir brauchen - obwohl es immer noch nicht "TRUNCATE" hat, es hat einfach alles andere. Unser Problem war nicht, dass wir Probleme hatten, die erforderlichen Berechtigungen zu erteilen, sondern dass wir nicht wussten, welche Berechtigungen benötigt wurden. In diesem Beispiel dachten wir, Berechtigungen für 'TRUNCATE' wären im Wesentlichen die gleichen wie' DELETE' und hätten sie daher fälschlicherweise vergeben. –