SSMS가 서버의 파일 시스템을 보지 못하도록 방지


11

내 관리하에 MS SQL Server 2017을 공유하는 여러 사용자가 있습니다. 그들은 그 서버에있는 다른 사용자들과 그들의 데이터를 보거나 알지 않아야합니다. 각 사용자는 자신의 데이터베이스를 가지고 있습니다. 데이터베이스로 원하는 것을 할 수 있습니다.

SQL Server Partial Containment기능을 사용하여 사용자를 제자리에 고정하고 있습니다. 로그인은 데이터베이스 내부에서 작성됩니다. 이 방법으로 다른 사용자 계정이나 데이터베이스를 볼 수 없으므로 잘 작동합니다. 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가 서버의 파일 시스템을 탐색 할 수 있도록 허용합니다. 사용자는 실제로 DB를 복원 할 수 없지만 파일 시스템을 찾아 볼 수 있습니다.

여기에이 질문은 SSMS는 저장 프로 시저를 사용하고 있음을 시사 xp_fixeddrives, xp_dirtreexp_fileexist. 그러나 이러한 저장 프로시 저는 해당 그룹의 권한이있는 사용자로 실행될 때 빈 결과를 반환합니다. 사용자가 sysadmin 역할의 구성원이 아닌 경우의 동작이라는 것을 읽었습니다. dbrole에 대한 EXECUTE를 명시 적으로 거부했기 때문에 이미 약간 혼란 스럽지만 사용자는 여전히 저장 프로 시저를 실행할 수 있습니다. 그러나 여전히 SSMS를 통해 파일 시스템을 탐색 할 때 비어 있지 않습니다.

SSMS는 파일 시스템 정보를 어디서 가져 오며 어떻게 방지 할 수 있습니까?

편집 : 또한 SSMS가 모든 데이터베이스의 서버에 존재하는 모든 DB 백업 목록을 검색 할 수 있음을 알았습니다. 다시 한 번,이 정보를 얻는 방법과이를 방지 할 수있는 방법은 없습니다.

답변:


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

메시지 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역할의 멤버 만이 TVF에서 선택할 수 있습니다.

게스트 사용자 / 퍼블릭 역할을 변경하면 인스턴스 나 특정 기능에 대해 알 수없는 부작용이있을 수 있습니다.

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

퍼블릭 / 게스트 권한 변경 은 이상적인 시나리오 가 아닙니다 .

예를 들어 게스트 사용자를 비활성화하면 msdb 데이터베이스가 손상 될 수 있습니다 .

포함 된 사용자의 컨텍스트에서 선택을 다시 실행하십시오.

메시지 229, 수준 14, 상태 5, 줄 7 개체 'dm_os_enumerate_filesystem', 데이터베이스 'mssqlsystemresource', 스키마 'sys'에 대한 SELECT 권한이 거부되었습니다.

이상적인 접근 방식과는 거리가 멀거나 다른 방법이있을 수 있습니다.

퍼블릭 역할 권한의 예 :

여기에 이미지 설명을 입력하십시오

이러한 개체는 이러한 개체를 거부 / 취소 할 때 특정 기능이 작동하지 않을 수 있으므로 이유가 있습니다. 조심해서 진행해라.

여기 에서 게스트 사용자 / 공개 역할에 대한 추가 정보


1
이 목적을 위해 (공공이 아닌) 마스터에서 새로운 역할을 만드는 데 어려움이 있습니까?
Jacob H

@JacobH 이상적으로, 가장 큰 문제는 포함 된 사용자가 마스터에 해당하는 사용자가 없거나 인스턴스에 로그인하는 것이므로 기본적으로 guest / public으로 설정됩니다. master / msdb에 연결할 때 사용자를 제어 할 수 있다고 생각하지 않습니다. 면책 조항 : 나는 결코 데이터베이스 전문가가 아닙니다. 가장 낮은 세분성은 게스트 사용자 / 공개 역할에 있으며 이는 이상적이지 않습니다.
Randi Vertongen

1
참고로, 다음 권한을 사용하여 포함 된 데이터베이스 사용자로부터 다른 DB / 백업 / 파일 시스템에 대한 정보를 숨기고 있습니다. 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 업데이트를 게시 해 주셔서 감사합니다. :).
Randi Vertongen

3

다른 데이터베이스에 대한 정보를 유출하는 더 많은 테이블을 계속 찾아서 공개 역할에 차단하는이 컬렉션을 게시하기로 결정했습니다. SQL Server가 실제로 제공하는 것의 작은 하위 집합 만 사용하기 때문에 DB 기능에 영향을 미치지 않는 것 같습니다. 이것이 내가 알지 못하는 것을 깨뜨릴 수 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.