Verhindern Sie, dass SSMS das Dateisystem des Servers sieht

11

Ich habe mehrere Benutzer, die einen MS SQL Server 2017 unter meiner Verwaltung freigeben. Sie sollten die anderen Benutzer und ihre Daten auf diesem Server nicht sehen (oder gar kennen). Jeder Benutzer hat seine eigene Datenbank. Sie können mit ihrer Datenbank machen, was sie wollen.

Ich verwende die SQL Server- Partial ContainmentFunktion, um die Benutzer an Ort und Stelle zu sperren. Die Anmeldungen werden in der Datenbank erstellt. Dies funktioniert gut, da andere Benutzerkonten oder Datenbanken auf diese Weise nicht angezeigt werden. Die DB-Anmeldungen werden einer Datenbankrolle hinzugefügt, die ich mit diesem Befehl erstelle:

USE dbname
CREATE ROLE dbrole
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole
DENY EXECUTE TO dbrole

Ich erstelle frisch ein DB-Login-Konto und füge es nur dieser Rolle hinzu. Der Benutzer hat keine anderen Berechtigungen (die mir bekannt sind).

Das einzige verbleibende Problem ist, dass SSMS weiterhin das Dateisystem des Servers durchsuchen kann. Wenn ich mit der rechten Maustaste auf die Datenbank klicke und wähle Tasks -> Restore -> Database, dann wähle Device: -> [...]und füge eine Datei hinzu. Dadurch kann SSMS das Dateisystem des Servers durchsuchen, was ich ablehnen möchte. Der Benutzer kann die Datenbank nicht wiederherstellen, aber er kann das Dateisystem durchsuchen.

Diese Frage hier legt nahe, dass SSMS die gespeicherten Prozeduren verwendet xp_fixeddrives, xp_dirtreeund xp_fileexist. Diese gespeicherten Prozeduren geben jedoch leere Ergebnisse zurück, wenn sie als Benutzer mit den Berechtigungen dieser Gruppe ausgeführt werden. Ich habe gelesen, dass dies das Verhalten ist, wenn ein Benutzer kein Mitglied der Sysadmin-Rolle ist. Dies verwirrt mich bereits ein wenig, da ich EXECUTE der Datenbank explizit verweigere, der Benutzer die gespeicherten Prozeduren dennoch ausführen kann. Beim Durchsuchen des Dateisystems über SSMS ist es jedoch nicht leer.

Woher bezieht SSMS die Dateisysteminformationen und wie kann ich dies verhindern?

Bearbeiten: Ich habe auch gerade bemerkt, dass SSMS eine Liste aller auf dem Server vorhandenen DB-Sicherungen für alle Datenbanken abrufen kann. Auch hier weiß ich nicht, wie es diese Informationen erhält und wie ich sie verhindern kann.

Finale
quelle

Antworten:

10

Verfolgung der Abfragen

Bei der Verfolgung der ausgeführten Abfragen wird die folgende Abfrage gefunden, in der die Ordner auf den Laufwerken nacheinander aufgelistet sind.

declare @Path nvarchar(255)
declare @Name nvarchar(255)


select @Path = N'D:\'


select @Name = null;


        create table #filetmpfin (Name nvarchar(255) NOT NULL, IsFile bit NULL, FullName nvarchar(300) not NULL)
        declare @FullName nvarchar(300)  
        if exists (select 1 from sys.all_objects where name = 'dm_os_enumerate_filesystem' and type = 'IF' and is_ms_shipped = 1)
        begin 
          if (@Name is null)
          begin 
              insert #filetmpfin select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0
          end 
          if (NOT @Name is null)
          begin 
            if(@Path is null) 
              select @FullName = @Name 
            else
              select @FullName = @Path  + convert(nvarchar(1), serverproperty('PathSeparator')) + @Name 
              create table #filetmp3 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL ) 
              insert #filetmp3 select file_exists, file_is_a_directory, parent_directory_exists from sys.dm_os_file_exists(@FullName) 
              insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp3 where Exist = 1 or IsDir = 1 
              drop table #filetmp3 
          end
        end 
        else      
        begin         
          if(@Name is null)
          begin
            if (right(@Path, 1) = '\')
              select @Path= substring(@Path, 1, len(@Path) - charindex('\', reverse(@Path)))
            create table #filetmp (Name nvarchar(255) NOT NULL, depth int NOT NULL, IsFile bit NULL )
            insert #filetmp EXECUTE master.dbo.xp_dirtree @Path, 1, 1
            insert #filetmpfin select Name, IsFile, @Path + '\' + Name from #filetmp f
            drop table #filetmp
          end 
          if(NOT @Name is null)
          begin
            if(@Path is null)
              select @FullName = @Name
            else
              select @FullName = @Path +  '\' + @Name
            if (right(@FullName, 1) = '\')
              select @Path= substring(@Path, 1, len(@FullName) - charindex('\', reverse(@FullName)))
            create table #filetmp2 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL )
            insert #filetmp2 EXECUTE master.dbo.xp_fileexist @FullName
            insert #filetmpfin select @Name, 1-IsDir, @FullName from #filetmp2 where Exist = 1 or IsDir = 1 
            drop table #filetmp2
          end 
        end 



SELECT
Name AS [Name],
IsFile AS [IsFile],
FullName AS [FullName]
FROM
#filetmpfin
ORDER BY
[IsFile] ASC,[Name] ASC
drop table #filetmpfin

Die Hauptfunktion besteht darin sys.dm_os_enumerate_filesystem, dass jeder geöffnete Ordner eine Ebene tiefer geht, ein Beispiel für eine zweite Ebene:

select @Path = N'D:\Data\'

Für regelmäßige Anmeldungen

Bei regulären Anmeldungen ist es so einfach wie das Verweigern der Auswahlberechtigungen für diese TVF, damit der Benutzer die Ordner nicht auflisten kann.

DENY SELECT ON master.sys.dm_os_enumerate_filesystem TO [Domain\LoginName]

Beim Versuch, ein Backup auszuwählen, sollte dem Benutzer folgende Meldung angezeigt werden:

Geben Sie hier die Bildbeschreibung ein

Der Benutzer kann dann nur die Laufwerksbuchstaben sehen.

Geben Sie hier die Bildbeschreibung ein


Für enthaltene Benutzer

Für den enthaltenen Benutzer funktioniert es nicht, die Auswahl auf dem TVF direkt zu verweigern

Der enthaltene Benutzer kann das nächste Abfragebeispiel erfolgreich ausführen

declare @Path nvarchar(255)
declare @Name nvarchar(255)


select @Path = N'D:\'
select file_or_directory_name, 1 - is_directory, full_filesystem_path from sys.dm_os_enumerate_filesystem(@Path, '*') where [level] = 0

Und .... das funktioniert nicht:

use [PartialDb]
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO [PartialUser];
GO

Meldung 4629, Ebene 16, Status 10, Zeile 34 Berechtigungen für Katalogansichten mit Serverbereich oder gespeicherte Systemprozeduren oder erweiterte gespeicherte Prozeduren können nur erteilt werden, wenn die aktuelle Datenbank Master ist.

Die folgenden Anweisungen funktionieren, schränken den Benutzer jedoch nicht ein, auch wenn sie nicht Teil der dbroleRolle sind

DENY VIEW DATABASE STATE TO [PartialUser];

DENY VIEW DEFINITION ON SCHEMA :: information_schema TO [PartialUser];

DENY VIEW DEFINITION ON SCHEMA :: sys TO [PartialUser];

DENY SELECT ON SCHEMA :: information_schema TO [PartialUser];

DENY SELECT ON SCHEMA :: sys TO [PartialUser];

Was funktioniert? In der Theorie

Da der enthaltene Benutzer das Gastkonto / die öffentliche Rolle verwendet, um eine Verbindung herzustellen und aus dmvs auszuwählen (die öffentliche Rolle hat standardmäßig Zugriff auf bestimmte Objekte), können wir versuchen, die öffentliche Rolle einzuschränken.

Dies ist aus mehreren Gründen nicht ideal. Verweigern Sie beispielsweise> Gewähren, und daher können nur Mitglieder der sysadminRolle aus dieser TVF auswählen.

Ein weiterer wichtiger Punkt ist, dass das Ändern der Rolle des Gastbenutzers / der öffentlichen Person unbekannte Nebenwirkungen auf die Instanz oder bestimmte Funktionen haben kann.

USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public;
GO

Das Ändern von öffentlichen / Gastberechtigungen ist kein ideales Szenario.

Durch Deaktivieren des Gastbenutzers kann beispielsweise die msdb-Datenbank beschädigt werden .

Ausführen der Auswahl im Kontext des enthaltenen Benutzers:

Nachricht 229, Ebene 14, Status 5, Zeile 7 Die SELECT-Berechtigung wurde für das Objekt 'dm_os_enumerate_filesystem', Datenbank 'mssqlsystemresource', Schema 'sys' verweigert.

Es kann einen Weg geben oder auch nicht, der weit vom idealen Ansatz entfernt ist. Ich habe ihn nicht gefunden.

Ein Beispiel für die Berechtigungen der öffentlichen Rolle:

Geben Sie hier die Bildbeschreibung ein

Diese werden aus einem bestimmten Grund gewährt, da bestimmte Funktionen beim Verweigern / Widerrufen dieser Objekte möglicherweise nicht mehr funktionieren. Mit Vorsicht fortfahren.

Weitere Informationen zum Gastbenutzer / zur öffentlichen Rolle finden Sie hier

Randi Vertongen
quelle
1
Gibt es ein Problem, zu diesem Zweck eine neue Rolle im Master zu schaffen (im Gegensatz zur Öffentlichkeit)?
Jacob H
@JacobH Das wäre ideal, das Hauptproblem ist, dass der enthaltene Benutzer keinen entsprechenden Benutzer im Master hat (oder ein Login auf der Instanz) und daher standardmäßig Gast / Öffentlich ist. Ich glaube nicht, dass es möglich ist, den Benutzer zu steuern, wenn er eine Verbindung zu master / msdb herstellt. Haftungsausschluss: Ich bin keineswegs ein Experte für geschlossene Datenbanken. Es scheint mir, dass die niedrigste Granularität in der Rolle des Gastbenutzers / der Öffentlichkeit liegt, was nicht ideal ist.
Randi Vertongen
1
Als Referenz verwende ich die folgenden Berechtigungen, um Informationen über andere DBs / Backups / Dateisysteme vor enthaltenen Datenbankbenutzern zu verbergen: USE MASTER; DENY SELECT ON [sys].[dm_os_enumerate_fixed_drives] TO public; DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public; USE msdb; DENY SELECT ON msdb.dbo.backupset TO public; Bisher sind keine Probleme damit aufgetreten, aber ich habe auch keine intensiven Tests durchgeführt.
Finale
@final Großartig, danke für das Posten eines Updates :).
Randi Vertongen
3

Ich finde immer mehr Tabellen, in denen Informationen über andere Datenbanken verloren gehen. Daher habe ich beschlossen, diese Sammlung von Dingen, die ich blockiere, für die öffentliche Rolle zu veröffentlichen. Sie scheinen keine Datenbankfunktionalität zu beeinträchtigen, obwohl ich keine Verantwortung dafür übernehme, da ich nur eine kleine Teilmenge dessen verwende, was SQL Server tatsächlich bietet. Es könnte sehr gut sein, dass dies etwas kaputt macht, von dem ich nichts weiß.

USE MASTER
GO
DENY SELECT ON [sys].[dm_os_enumerate_fixed_drives] TO public
DENY SELECT ON [sys].[dm_os_enumerate_filesystem] TO public
GO
USE msdb
GO
DENY SELECT ON msdb.dbo.backupfile TO public
DENY SELECT ON msdb.dbo.backupfilegroup TO public
DENY SELECT ON msdb.dbo.backupmediafamily TO public
DENY SELECT ON msdb.dbo.backupmediaset TO public
DENY SELECT ON msdb.dbo.restorefile TO public
DENY SELECT ON msdb.dbo.restorefilegroup TO public
DENY SELECT ON msdb.dbo.restorehistory TO public
GO
Finale
quelle