এসএসএমএসকে সার্ভারের ফাইল সিস্টেমটি থেকে বিরত রাখুন


11

আমার বেশ কয়েকটি ব্যবহারকারী রয়েছেন যারা আমার প্রশাসনের অধীনে একটি এমএস এসকিউএল সার্ভার 2017 ভাগ করে নিন। তাদের অন্য ব্যবহারকারীদের এবং সেই সার্ভারে থাকা তাদের ডেটা (বা এমনকি সচেতন হওয়া) উচিত নয়। প্রতিটি ব্যবহারকারীর নিজস্ব ডাটাবেস রয়েছে। তারা তাদের ডাটাবেস দিয়ে যা খুশি করতে পারে।

আমি Partial Containmentব্যবহারকারীদের জায়গায় লক করতে এসকিউএল সার্ভারের বৈশিষ্ট্যটি ব্যবহার করছি । লগইনগুলি ডাটাবেসের ভিতরে তৈরি করা হয়। এটি ভালভাবে কাজ করে, কারণ তারা অন্য ব্যবহারকারীর অ্যাকাউন্ট বা ডাটাবেসগুলি এভাবে দেখেন না। এই কমান্ডটি দিয়ে আমি তৈরি করি এমন একটি ডেটাবেস ভূমিকাতে ডিবি লগইনগুলি যুক্ত করা হয়:

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

আমি নতুনভাবে একটি ডিবি লগইন অ্যাকাউন্ট তৈরি করেছি এবং কেবল এটির ভূমিকার সাথে যুক্ত করব। ব্যবহারকারীর অন্য কোনও অনুমতি নেই (যা আমি সচেতন)।

কেবলমাত্র সমস্যাটি হ'ল এসএসএমএস এখনও সার্ভারের ফাইল সিস্টেম ব্রাউজ করতে সক্ষম। আমি যদি ডাটাবেসে ডান ক্লিক করে চয়ন করি Tasks -> Restore -> Database, তবে নির্বাচন করুন Device: -> [...]এবং একটি ফাইল যুক্ত করুন। এটি এসএসএমএসকে সার্ভারের ফাইল সিস্টেম ব্রাউজ করার অনুমতি দেয়, যা আমি অস্বীকার করতে চাই। ব্যবহারকারী আসলে ডিবি পুনরুদ্ধার করতে পারবেন না, তবে তিনি ফাইল সিস্টেমটি ব্রাউজ করতে পারবেন।

এখানে এই প্রশ্নের দাড়ায় যে SSMS সঞ্চিত পদ্ধতি ব্যবহার করছে xp_fixeddrives, xp_dirtreeএবং xp_fileexist। যাইহোক, এই সঞ্চিত পদ্ধতিগুলি যখন উল্লিখিত গোষ্ঠীর অনুমতি নিয়ে ব্যবহারকারী হিসাবে মৃত্যুদন্ড কার্যকর করা হয় তখন খালি ফলাফল দেয়। আমি পড়েছি যে ব্যবহারকারী যখন সিসাদমিন ভূমিকার সদস্য না হন তখন এই আচরণটি হয়েছিল। এটি ইতিমধ্যে আমাকে কিছুটা বিভ্রান্ত করেছে যেহেতু আমি স্পষ্টভাবে ডাব্রোলটিতে এক্সেকটকে অস্বীকার করি, তবুও ব্যবহারকারী এখনও সঞ্চিত প্রক্রিয়াগুলি সম্পাদন করতে পারেন। তবুও, এসএসএমএসের মাধ্যমে ফাইল সিস্টেমটি ব্রাউজ করার সময়, এটি খালি নয়।

এসএসএমএস ফাইল সিস্টেমের তথ্য কোথা থেকে পায় এবং আমি কীভাবে এটি প্রতিরোধ করতে পারি?

সম্পাদনা: আমি আরও লক্ষ্য করেছি যে এসএসএমএস সমস্ত ডাটাবেসের জন্য সার্ভারে বিদ্যমান সমস্ত ডিবি ব্যাকআপের একটি তালিকা পুনরুদ্ধার করতে সক্ষম। আবার, আমি জানি না যে এটি কীভাবে এই তথ্যটি পায় এবং আমি কীভাবে এটি প্রতিরোধ করতে পারি।

উত্তর:


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\'

নিয়মিত লগইনের জন্য

নিয়মিত লগইনের জন্য ব্যবহারকারীরা ফোল্ডারগুলি তালিকাভুক্ত করতে সক্ষম না করার জন্য এই টিভিএফের নির্বাচিত অনুমতিগুলি অস্বীকার করার মতোই সহজ।

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

একটি ব্যাকআপ নির্বাচন করার চেষ্টা করার সময় ব্যবহারকারীর এই বার্তাটি দেখতে হবে:

এখানে চিত্র বর্ণনা লিখুন

এরপরে ব্যবহারকারী কেবল ড্রাইভের অক্ষরগুলি দেখতে সক্ষম হবেন।

এখানে চিত্র বর্ণনা লিখুন


ধারণকৃত ব্যবহারকারীদের জন্য

অন্তর্ভুক্ত ব্যবহারকারীর জন্য, সরাসরি টিভিএফ-তে নির্বাচন অস্বীকার করা কার্যকর হয় না

অন্তর্ভুক্ত ব্যবহারকারী সফলভাবে পরবর্তী ক্যোয়ারির উদাহরণ চালাতে পারেন

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

কি কাজ করে? ধারণায়

যেহেতু অন্তর্ভুক্ত ব্যবহারকারী অতিথি অ্যাকাউন্ট / পাবলিক ভূমিকাটি সংযুক্ত করে এবং ডিএমভি'র থেকে নির্বাচন করার জন্য ব্যবহার করে, (জনগণের ভূমিকাটি নির্দিষ্ট কিছুতে ডিফল্টরূপে অ্যাক্সেস পায়) আমরা জনসাধারণের ভূমিকা সীমাবদ্ধ করার চেষ্টা করতে পারি।

এটি বিভিন্ন কারণে আদর্শ নয়। উদাহরণস্বরূপ, অস্বীকার করুন> অনুদান দিন এবং ফলস্বরূপ sysadminভূমিকায় কেবল সদস্যরা এই টিভিএফ থেকে নির্বাচন করতে সক্ষম হবেন।

আরেকটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল অতিথি ব্যবহারকারী / জনসাধারণের ভূমিকা পাল্টে দেওয়া উদাহরণ বা নির্দিষ্ট কার্যকারিতার উপর অজানা পার্শ্ব-প্রতিক্রিয়া থাকতে পারে।

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

সর্বজনীন / অতিথি অনুমতি পরিবর্তন করা হয় না একটি আদর্শ দৃশ্যকল্প।

উদাহরণস্বরূপ, অতিথির ব্যবহারকারীকে অক্ষম করা এমএসডিবি ডাটাবেসকে ভেঙে ফেলতে পারে

অন্তর্ভুক্ত ব্যবহারকারীর প্রসঙ্গে নির্বাচনটি পুনরায় পরিচালনা করা:

এমএসজি 229, স্তর 14, রাজ্য 5, লাইন 7 'dm_os_enumerate_filesystem', ডাটাবেস 'mssqlsystemresource', স্কিমা 'sys' অবজেক্টে SELECT অনুমতি অস্বীকার করা হয়েছিল।

আদর্শ পদ্ধতির থেকে দূরে কোনও পথ থাকতে পারে বা নাও হতে পারে, আমি এটি খুঁজে পাইনি।

জনগণের ভূমিকার অনুমতিগুলির উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

এগুলি কোনও কারণে মঞ্জুর করা হয়, কারণ এই বিষয়গুলি অস্বীকার / প্রত্যাহার করার সময় এই জাতীয় কিছু কার্যকারিতা ভঙ্গ হতে পারে। সাবধানতার সাথে এগিয়ে যান.

অতিথি ব্যবহারকারী / জনগণের ভূমিকা সম্পর্কে আরও কিছু তথ্য এখানে


1
এই উদ্দেশ্যে (জনসাধারণের বিপরীতে) মাস্টার হিসাবে নতুন ভূমিকা তৈরি করার জন্য কি কোনও গোটচা রয়েছে?
জ্যাকব এইচ

@ জ্যাকোবএইচটি আদর্শ হবে, মূল সমস্যাটি হ'ল সংযুক্ত ব্যবহারকারীর মাস্টারে কোনও সম্পর্কিত ব্যবহারকারী নেই (বা উদাহরণটিতে লগইন) এবং ফলস্বরূপ অতিথি / জনসাধারণের কাছে ডিফল্ট। আমি মনে করি না যে এটি মাস্টার / এমএসডিবিতে সংযুক্ত হওয়ার সাথে সাথে ব্যবহারকারীকে নিয়ন্ত্রণ করা সম্ভব। দাবি অস্বীকার: আমি কোনও উপায়ে কোনও ডাটাবেস বিশেষজ্ঞ নই। আমার কাছে মনে হচ্ছে অতিথির গ্রানুলারিটি অতিথি ব্যবহারকারী / জনসাধারণের ভূমিকাতে রয়েছে, যা আদর্শ নয়।
রেন্ডি ভার্টনজেন

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; এখন পর্যন্ত, আমি এগুলি নিয়ে সমস্যায় পড়ি না, তবে আমি নিবিড় পরীক্ষাও করি নি।
চূড়ান্ত

@ ফাইনাল গ্রেট, একটি আপডেট পোস্ট করার জন্য ধন্যবাদ :)।
রেন্ডি ভার্টনজেন

3

আমি অন্যান্য ডাটাবেসগুলি সম্পর্কে তথ্য ফাঁস করে এমন আরও সারণীগুলি সন্ধান করি, তাই আমি জনগণের ভূমিকায় অবরুদ্ধ জিনিসগুলির এই সংগ্রহটি পোস্ট করার সিদ্ধান্ত নিয়েছি। তারা কোনও ডিবি কার্যকারিতা প্রভাবিত করবে বলে মনে হচ্ছে না, যদিও আমি এসকিউএল সার্ভারের যে প্রস্তাবিত তা কেবল একটি ছোট উপসেট ব্যবহার করছি বলে আমি এতে কোনও দায় নিই না। এটি খুব ভাল হতে পারে যে এটি এমন কিছু ভেঙে দেয় যা সম্পর্কে আমি অজানা।

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.