Заборона SSMS бачити файлову систему сервера


11

У мене є кілька користувачів, які діляться MS SQL сервером 2017 під моєю адміністрацією. Вони не повинні бачити (або навіть знати) інших користувачів та їх дані на цьому сервері. У кожного користувача є своя база даних. Вони можуть робити все, що завгодно, зі своєю базою даних.

Я використовую Partial Containmentфункцію SQL Server, щоб блокувати користувачів на місці. Логіни створюються всередині бази даних. Це добре працює, оскільки вони не бачать інших облікових записів або баз даних таким чином. Логіни DB додаються до ролі бази даних, яку я створюю за допомогою цієї команди:

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

Я свіжо створюю обліковий запис для входу в db і лише додаю його до зазначеної ролі. У користувача немає інших дозволів (про які я знаю).

Єдина проблема, що залишилася - SSMS все ще може переглядати файлову систему сервера. Якщо я клацну правою кнопкою миші на базі даних і виберу Tasks -> Restore -> Database, то виберіть Device: -> [...]і Додати файл. Це дозволяє SSMS переглядати файлову систему сервера, що я хотів би заперечити. Користувач фактично не може відновити БД, але він може переглядати файлову систему.

Це питання тут передбачає , що SSMS використовує збережені процедури xp_fixeddrives, xp_dirtreeі xp_fileexist. Однак ці збережені процедури повертають порожні результати, коли вони виконуються як користувач з дозволами вказаної групи. Я читав, що така поведінка, коли користувач не є членом ролі sysadmin. Це мене вже трохи бентежить, оскільки я відмовляю EXECUTE від dbrole, але користувач може виконувати збережені процедури. Але все-таки при перегляді файлової системи через SSMS вона не порожня.

Звідки SSMS бере інформацію про файлову систему і як я можу це запобігти?

редагувати: Я також щойно помітив, що SSMS здатний отримати список усіх резервних копій БД, існуючих на сервері для всіх баз даних. Знову ж таки, я не знаю, як вона отримує цю інформацію і як я можу її запобігти.

Відповіді:


10

Відстеження запитів

Під час відстеження виконаних запитів нижче знайдено запит, який перераховує папки на накопичувачах одна за одною.

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

Основна використовувана функція полягає в тому sys.dm_os_enumerate_filesystem, що для кожної папки, що відкривається, вона йде на рівень глибше, приклад другого рівня:

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

Для регулярних входів

Для регулярного входу в систему так само просто, як і заборона дозволу на вибір на цьому TVF, щоб користувач не міг перелічити папки.

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

При спробі вибрати резервну копію, користувач повинен побачити це повідомлення:

введіть тут опис зображення

Користувач зможе бачити лише літери диска.

введіть тут опис зображення


Для вміщених користувачів

Для користувача, що міститься у програмі, заборона відбору на TVF безпосередньо не працює

Вміщений користувач може успішно запустити наступний приклад запиту

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

І .... це не працює:

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

Msg 4629, Рівень 16, Стан 10, Рядок 34 Дозвіл на перегляди каталогів на сервері або в системно збережених процедурах або розширених збережених процедурах можна надати лише тоді, коли поточна база даних є основним.

Нижче висловлювання працюють, але вони не обмежують користувача, навіть якщо це не є частиною dbroleролі

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

Що працює? Теоретично

Оскільки вміщений користувач використовує обліковий запис гостя / загальнодоступну роль для підключення та вибору з dmv, (загальнодоступна роль має доступ до певних об'єктів за замовчуванням), ми можемо спробувати обмежити публічну роль.

Це не ідеально через низку причин. Наприклад, відмовити> надавати, і в результаті лише учасники sysadminролі зможуть вибрати з цього ТВФ.

Ще одна важлива річ, яку слід зазначити, це те, що зміна ролі гостя користувача / громадськості може мати невідомі побічні ефекти на екземпляр або певні функції.

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

Зміна дозволів громадськості та гостей не є ідеальним сценарієм.

Наприклад, відключення гостьового користувача може зламати базу даних msdb .

Поновлення вибору в контексті користувача, що міститься:

Msg 229, рівень 14, стан 5, рядок 7 Дозвіл SELECT відмовлено в об'єкті "dm_os_enumerate_filesystem", базі даних "mssqlsystemresource", схемі "sys".

Може бути, а може і не бути способу, який би не був ідеальним підходом, я не знайшов.

Приклад дозволів громадської ролі:

введіть тут опис зображення

Вони надаються з причини, оскільки такі функції можуть порушитися при відмові / відкликанні цих об'єктів. Продовжуйте обережно.

Більше інформації про гостьового користувача / громадську роль тут


1
Чи є завдання для створення нової ролі майстра для цієї мети (на відміну від публічної)?
Яків Н

@JacobH Це було б ідеально, головна проблема полягає в тому, що користувач, що міститься, не має відповідного користувача у програмі master (або логін для інстанції), і як результат, за замовчуванням для гостя / публіка. Я не думаю, що можна керувати користувачем під час підключення до master / msdb. відмова від відповідальності: Я жодним чином не є експертом із бази даних. Мені здається, що найнижча деталізація - це роль гостя користувача / громадськості, що не є ідеальним.
Ранді Вертонген

1
Для довідки я використовую наступні дозволи, щоб приховати інформацію про інші БД / резервні копії / файлову систему від користувачів баз даних, що містяться: 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; Досі я з цим не стикався з проблемами, але також не робив інтенсивного тестування.
фінал

@final Чудово, дякую за публікацію оновлення :).
Ранді Вертонген

3

Я продовжую знаходити більше таблиць, які просочують інформацію про інші бази даних, тому я вирішив опублікувати цю колекцію речей, які я блокую на загальнодоступну роль. Вони, схоже, не впливають на функціональність db, хоча я не несу відповідальності за це, оскільки я використовую лише невеликий підмножина того, що насправді пропонує SQL Server. Цілком може бути, що це порушує щось, про що я не знаю.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.