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:
Der Benutzer kann dann nur die Laufwerksbuchstaben sehen.
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 dbrole
Rolle 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 sysadmin
Rolle 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:
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