Mencegah SSMS melihat sistem file server

11

Saya memiliki beberapa pengguna yang berbagi MS SQL server 2017 di bawah administrasi saya. Mereka seharusnya tidak melihat (atau bahkan menyadari) dari pengguna lain dan data mereka di server itu. Setiap pengguna memiliki basis datanya sendiri. Mereka dapat melakukan apapun yang mereka inginkan dengan database mereka.

Saya menggunakan Partial Containmentfitur SQL Server untuk mengunci pengguna di tempat. Info masuk dibuat di dalam basis data. Ini berfungsi dengan baik, karena mereka tidak melihat akun atau basis data pengguna lain dengan cara ini. Login DB ditambahkan ke Peran Database yang saya buat dengan perintah ini:

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

Saya baru saja membuat akun login db dan hanya menambahkannya ke peran tersebut. Pengguna tidak memiliki izin lain (yang saya ketahui).

Satu-satunya masalah yang tersisa adalah SSMS masih dapat menelusuri sistem file server. Jika saya klik kanan pada database dan pilih Tasks -> Restore -> Database, lalu pilih Device: -> [...]dan Tambah file. Ini memungkinkan SSMS untuk menelusuri sistem file server, yang ingin saya tolak. Pengguna tidak dapat benar-benar mengembalikan DB, tetapi ia dapat menelusuri sistem file.

Pertanyaan ini di sini menunjukkan bahwa SSMS menggunakan prosedur yang tersimpan xp_fixeddrives, xp_dirtreedan xp_fileexist. Namun, prosedur yang disimpan tersebut mengembalikan hasil kosong ketika dijalankan sebagai pengguna dengan izin grup tersebut. Saya telah membaca bahwa ini adalah perilaku ketika pengguna bukan anggota dari peran sysadmin. Ini sudah sedikit membingungkan saya karena saya secara eksplisit menolak EXECUTE ke dbrole, namun pengguna masih dapat menjalankan prosedur yang tersimpan. Tapi tetap saja, saat browsing sistem file melalui SSMS, itu tidak kosong.

Dari mana SSMS mendapatkan informasi sistem file dan bagaimana cara mencegahnya?

sunting: Saya juga baru memperhatikan bahwa SSMS dapat mengambil daftar semua cadangan DB yang ada di server untuk semua basis data. Sekali lagi, saya tidak mengerti bagaimana mendapatkan informasi ini dan bagaimana saya bisa mencegahnya.

terakhir
sumber

Jawaban:

10

Menelusuri kueri

Saat menelusuri kueri yang dijalankan, ditemukan kueri di bawah ini yang mencantumkan folder pada drive satu per satu.

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

Fungsi utama yang digunakan adalah sys.dm_os_enumerate_filesystem, untuk setiap folder yang dibuka, ia bergerak lebih dalam, contoh dari tingkat kedua:

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

Untuk login reguler

Untuk login reguler semudah menyangkal izin pilih pada TVF ini untuk membuat pengguna tidak dapat membuat daftar folder.

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

Saat mencoba memilih cadangan, pengguna harus melihat pesan ini:

masukkan deskripsi gambar di sini

Pengguna kemudian hanya dapat melihat huruf drive.

masukkan deskripsi gambar di sini


Untuk pengguna yang ada

Untuk pengguna yang ada, menolak pemilihan pada TVF secara langsung tidak berfungsi

Pengguna yang terkandung dapat berhasil menjalankan contoh kueri berikutnya

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

Dan .... ini tidak berhasil:

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

Msg 4629, Level 16, State 10, Line 34 Izin pada tampilan katalog yang melingkupi server atau prosedur yang tersimpan sistem atau prosedur tersimpan yang diperpanjang dapat diberikan hanya ketika database saat ini adalah master.

Pernyataan di bawah berfungsi tetapi tidak membatasi pengguna, meskipun itu bukan bagian dari dbroleperan

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];

Apa yang berhasil? Dalam teori

Karena pengguna yang terkandung menggunakan akun tamu / peran publik untuk terhubung dan memilih dari dmv, (peran publik memiliki akses ke objek tertentu secara default) kami dapat mencoba membatasi peran publik.

Ini tidak ideal karena sejumlah alasan. Misalnya, menolak> berikan dan sebagai akibatnya hanya anggota yang sysadmindapat memilih dari TVF ini.

Hal penting lain yang perlu diperhatikan adalah bahwa mengubah pengguna tamu / peran publik dapat memiliki efek samping yang tidak diketahui pada instance atau fungsi tertentu.

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

Mengubah izin publik / tamu bukan skenario ideal.

Misalnya, menonaktifkan pengguna tamu dapat merusak basis data msdb .

Menjalankan kembali pemilihan dalam konteks pengguna yang ada:

Msg 229, Level 14, Negara 5, Baris 7 Izin SELECT ditolak pada objek 'dm_os_enumerate_filesystem', basis data 'mssqlsystemresource', schema 'sys'.

Mungkin ada atau tidak ada jalan lain yang jauh dari pendekatan ideal ini, saya belum menemukannya.

Contoh izin peran publik:

masukkan deskripsi gambar di sini

Ini diberikan karena suatu alasan, karena fungsionalitas tertentu mungkin rusak ketika menolak / mencabut benda-benda ini. Lanjutkan dengan hati hati.

Beberapa informasi lebih lanjut tentang pengguna tamu / peran publik di sini

Randi Vertongen
sumber
1
Apakah ada gotcha untuk menciptakan peran baru dalam master untuk tujuan ini (sebagai lawan publik)?
Yakub H
@ JacobH Itu akan ideal, masalah utama adalah bahwa pengguna yang terkandung tidak memiliki pengguna yang sesuai dalam master (atau login pada contoh) dan sebagai akibatnya Default untuk tamu / publik. Saya tidak berpikir bahwa itu mungkin untuk mengontrol pengguna karena terhubung ke master / msdb. disclaimer: Saya bukan ahli database yang terkandung. Tampak bagi saya bahwa rincian terendah ada pada peran pengguna / publik tamu, yang tidak ideal.
Randi Vertongen
1
Untuk referensi, saya menggunakan izin berikut untuk menyembunyikan informasi tentang DB / Backup / Filesystem lain dari pengguna database yang terkandung: 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; Sejauh ini, saya belum mengalami masalah dengan ini, tapi saya belum melakukan pengujian intensif juga.
final
@Final Hebat, terima kasih telah mengirim pembaruan :).
Randi Vertongen
3

Saya terus menemukan lebih banyak tabel yang membocorkan informasi tentang database lain, maka saya memutuskan untuk mengirim kumpulan hal-hal yang saya blokir ke peran publik. Mereka tampaknya tidak mempengaruhi fungsionalitas db, meskipun saya tidak bertanggung jawab karena saya hanya menggunakan sebagian kecil dari apa yang sebenarnya ditawarkan SQL Server. Bisa jadi ini merusak sesuatu yang saya tidak sadari.

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
terakhir
sumber