Ngăn SSMS nhìn thấy hệ thống tệp của máy chủ


11

Tôi có một số người dùng chia sẻ máy chủ MS SQL 2017 dưới quyền quản trị của tôi. Họ không nên nhìn thấy (hoặc thậm chí nhận thức được) về những người dùng khác và dữ liệu của họ trên máy chủ đó. Mỗi người dùng có cơ sở dữ liệu riêng của mình. Họ có thể làm bất cứ điều gì họ muốn với cơ sở dữ liệu của họ.

Tôi đang sử dụng Partial Containmenttính năng của SQL Server để khóa người dùng tại chỗ. Các thông tin đăng nhập được tạo bên trong cơ sở dữ liệu. Điều này hoạt động tốt, vì họ không thấy các tài khoản người dùng hoặc cơ sở dữ liệu khác theo cách này. Thông tin đăng nhập DB được thêm vào Vai trò cơ sở dữ liệu mà tôi tạo bằng lệnh này:

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

Tôi mới tạo một tài khoản đăng nhập db và chỉ thêm nó vào vai trò đã nói. Người dùng không có quyền nào khác (mà tôi biết).

Vấn đề duy nhất còn lại là SSMS vẫn có thể duyệt hệ thống tệp của máy chủ. Nếu tôi nhấp chuột phải vào cơ sở dữ liệu và chọn Tasks -> Restore -> Database, sau đó chọn Device: -> [...]và Thêm tệp. Điều này cho phép SSMS duyệt hệ thống tệp của máy chủ mà tôi muốn từ chối. Người dùng thực sự không thể khôi phục DB, nhưng anh ta có thể duyệt hệ thống tệp.

Câu hỏi này ở đây gợi ý rằng SSMS đang sử dụng thủ tục lưu trữ xp_fixeddrives, xp_dirtreexp_fileexist. Tuy nhiên, các quy trình được lưu trữ đó trả về kết quả trống khi được thực thi với tư cách là người dùng có quyền của nhóm đã nói. Tôi đã đọc rằng đây là hành vi khi người dùng không phải là thành viên của vai trò sysadmin. Điều này đã làm tôi hơi bối rối vì tôi từ chối rõ ràng EXECUTE với dbrole, nhưng người dùng vẫn có thể thực hiện các thủ tục được lưu trữ. Tuy nhiên, khi duyệt hệ thống tệp qua SSMS, nó không trống.

SSMS lấy thông tin hệ thống tệp từ đâu và làm cách nào tôi có thể ngăn chặn điều này?

chỉnh sửa: Tôi cũng nhận thấy rằng SSMS có thể truy xuất danh sách tất cả các bản sao lưu DB hiện có trên máy chủ cho tất cả các cơ sở dữ liệu. Một lần nữa, tôi không biết làm thế nào nó có được thông tin này và làm thế nào tôi có thể ngăn chặn nó.

Câu trả lời:


10

Truy tìm các truy vấn

Khi theo dõi các truy vấn được thực hiện, bên dưới truy vấn được tìm thấy liệt kê các thư mục trên các ổ đĩa từng cái một.

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

Hàm chính được sử dụng là sys.dm_os_enumerate_filesystem, đối với mỗi thư mục được mở, nó sẽ đi sâu hơn một cấp, một ví dụ về cấp độ thứ hai:

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

Đối với thông tin đăng nhập thường xuyên

Đối với thông tin đăng nhập thông thường, dễ dàng như việc từ chối các quyền được chọn trên TVF này để khiến người dùng không thể liệt kê các thư mục.

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

Khi cố gắng chọn một bản sao lưu, người dùng sẽ thấy thông báo này:

nhập mô tả hình ảnh ở đây

Người dùng sau đó sẽ chỉ có thể nhìn thấy các ký tự ổ đĩa.

nhập mô tả hình ảnh ở đây


Đối với người dùng có chứa

Đối với người dùng được chứa, từ chối lựa chọn trực tiếp trên TVF không hoạt động

Người dùng có thể thành công có thể chạy ví dụ truy vấn tiếp theo

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

Và .... điều này không hoạt động:

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

Msg 4629, Cấp 16, Trạng thái 10, Dòng 34 Quyền đối với chế độ xem danh mục trong phạm vi máy chủ hoặc quy trình lưu trữ hệ thống hoặc quy trình lưu trữ mở rộng chỉ có thể được cấp khi cơ sở dữ liệu hiện tại là chính.

Các câu lệnh dưới đây hoạt động nhưng chúng không hạn chế người dùng, ngay cả khi nó không phải là một phần của dbrolevai trò

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

Làm việc gì Về lý thuyết

Vì người dùng được sử dụng sử dụng tài khoản khách / vai trò chung để kết nối và chọn từ dmv, (vai trò công khai có quyền truy cập vào một số đối tượng theo mặc định), chúng tôi có thể thử hạn chế vai trò chung.

Điều này không lý tưởng do một số lý do. Ví dụ: từ chối> cấp và kết quả là chỉ các thành viên trong sysadminvai trò mới có thể chọn từ TVF này.

Một điều quan trọng khác cần lưu ý là việc thay đổi vai trò người dùng / công khai của khách có thể có tác dụng phụ không xác định đối với thể hiện hoặc chức năng nhất định.

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

Thay đổi quyền công khai / khách không phải là một kịch bản lý tưởng.

Ví dụ: vô hiệu hóa người dùng khách có thể phá vỡ cơ sở dữ liệu msdb .

Chạy lại lựa chọn trong ngữ cảnh của người dùng chứa:

Msg 229, Cấp 14, Trạng thái 5, Dòng 7 Quyền đã bị từ chối trên đối tượng 'dm_os_enum Cả_filesystem', cơ sở dữ liệu 'mssqlsystemresource', lược đồ 'sys'.

Có thể có hoặc không có cách nào khác xa cách tiếp cận lý tưởng này, tôi đã không tìm thấy nó.

Một ví dụ về các quyền của vai trò công cộng:

nhập mô tả hình ảnh ở đây

Chúng được cấp vì một lý do, vì các chức năng nhất định như vậy có thể bị phá vỡ khi từ chối / thu hồi các đối tượng này. Tiến hành thận trọng.

Một số thông tin thêm về vai trò người dùng / công chúng ở đây


1
Có một gotcha để tạo ra một vai trò mới trong chủ cho mục đích này (trái ngược với công chúng)?
Jacob H

@JacobH Điều đó thật lý tưởng, vấn đề chính là người dùng được chứa không có người dùng tương ứng trong tổng thể (hoặc đăng nhập trên ví dụ) và kết quả là Mặc định cho khách / công khai. Tôi không nghĩ rằng có thể kiểm soát người dùng khi nó kết nối với master / msdb. từ chối trách nhiệm: Tôi không phải là một chuyên gia cơ sở dữ liệu có chứa. Theo tôi, mức độ chi tiết thấp nhất thuộc về vai trò người dùng / công khai của khách, điều này không lý tưởng.
Randi Vertongen

1
Để tham khảo, tôi đang sử dụng các quyền sau để ẩn thông tin về các DB / Sao lưu / Hệ thống tập tin khác khỏi người dùng cơ sở dữ liệu có chứa: 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; Cho đến nay, tôi không gặp phải vấn đề nào với điều này, nhưng tôi cũng chưa thực hiện kiểm tra chuyên sâu.
trận chung kết

@final Tuyệt vời, cảm ơn bạn đã đăng cập nhật :).
Randi Vertongen

3

Tôi tiếp tục tìm thêm các bảng rò rỉ thông tin về các cơ sở dữ liệu khác, do đó tôi quyết định đăng bộ sưu tập những thứ mà tôi chặn sang vai trò công khai. Chúng dường như không ảnh hưởng đến bất kỳ chức năng db nào, mặc dù tôi không chịu trách nhiệm về điều đó vì tôi chỉ sử dụng một tập hợp con nhỏ của những gì SQL Server thực sự cung cấp. Nó rất có thể là điều này phá vỡ một cái gì đó tôi không biết.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.