এসকিউএল সার্ভারে তথ্য স্কিমে অ্যাক্সেস অস্বীকার করুন


13

আমি অক্ষম অ্যাক্সেস করতে সবচেয়ে ভালো উপায় খোঁজ করছি sys.tables/ Information SchemaSQL সার্ভার একটি ব্যবহারকারী / দলের জন্য।

আমি এই থ্রেডটি ২০০৮ সাল থেকে পেয়েছি

এটি এমনভাবে কীভাবে অ্যাক্সেসকে অস্বীকার করার উপায় দেখায় [sys].[something]:

 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
 GO

তবে এতে অ্যাক্সেস অক্ষম করার উপায় নেই Information Schema:

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole

এটি কাজ করে না বলে মনে হচ্ছে।

আমি কীভাবে তথ্য_সেমায় অ্যাক্সেস অক্ষম করতে পারি?

এবং কোনও সহজ উপায় কি সমস্ত sys/ এ অ্যাক্সেস অক্ষম করতে হবে information_schema?

আপডেট: আসলে আমি নিম্নলিখিত বিবৃতি দুটিই চালাতে পারি না:

DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO

আমি তাদের নির্দিষ্ট ডিবিতে চালানোর চেষ্টা করেছি যেখানে ব্যবহারকারীর উপস্থিতি রয়েছে এবং আমি "মাস্টার" এর উপরও চেষ্টা করেছি।

আমি এখনও চালাতে পারি:

 SELECT * from
 INFORMATION_SCHEMA.TABLES 

-> এখনও ফলাফল দেয়

 SELECT * from
 sys.TABLES 

-> কোনও ফলাফল নেই

SCHEMA::ক্যোয়ারী সহ সিকিউরিবলগুলি তৈরি করা সম্ভব করেছে

DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO

তবে এখন আমি ডিবি থেকে সমস্ত তথ্য নির্বাচন করতে পারি।

ম্যানেজমেন্ট স্টুডিও ২০০৮-এর ব্যবহারকারীদের সম্পত্তি-উইন্ডোতে আমি "সিকিউরিবলস" -ট্যাব একবার দেখেছিলাম, এটি দেখতে এটির মতো দেখাচ্ছে:

Sys.tables এর selecion অবরুদ্ধ করে এমন এন্ট্রি

স্কিমা: সিএস, নাম: সারণী, প্রকার: দেখুন

Sys.tables এর জন্য অনুমতি: অনুমতি: নির্বাচন করুন, অনুদানকারী: dbo, অস্বীকার চেক করা হয়েছে

কোনও নির্বাচন বাধা দেয় না এমন এন্ট্রি

স্কিমা:, নাম: INFORMATION_SCHEMA, প্রকার: স্কিমা

INFORMATION_SCHEMA এর জন্য অনুমতি: অনুমতি: নির্বাচন করুন, অনুদানকারী: ডিবিও, অস্বীকৃত নয় যাচাই করা হয়নি (আমি এটি পরীক্ষা করার চেষ্টা করেছি, তবে কোনও সুযোগ নেই ..)

অনুমতি: নির্বাচন করুন, অনুদানকারী: INFORMATION_SCHEMA, অস্বীকৃতি চেক করা হয়েছে


আমি জিইউআইয়ের উপর অনুমতিগুলি সেট করার চেষ্টা করেছি, তবে তারপরে আমি একই ত্রুটি পেয়েছি যে অনুমতিগুলি নির্ধারণ করা কেবলমাত্র মাস্টার ডিবিতেই সম্ভব হবে। তবে আমার কাছে মাস্টার ডিবিএস সুরক্ষায় ব্যবহারকারী / লগইন যুক্ত হয়নি।

সমাধান:

আমি কেবলমাত্র উপায়টির জন্য denyকাজটি করতে পারি তা information_schemaহ'ল ব্যবহারকারীকে মাস্টার-ডিবিতে যুক্ত করা এবং মাস্টারটি চালানো deny select:

DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO

এবং এই কোড হিসাবে, এটি কেবল একক টেবিলের জন্যই কার্যকর করা যেতে পারে।


1
এছাড়াও চেক আউট এই dba.se প্রশ্ন ও রেমাস Rusanu দ্বারা তার উত্তর একই বিষয়ের কভার সাজানোর -
marc_s

হ্যাঁ ধন্যবাদ. প্রকৃতপক্ষে [তথ্য_সেমিমা] -দর্শনগুলি এবং [sys]-দর্শনগুলি অস্বীকার করার মধ্যে পার্থক্যটি হ'ল [তথ্য_সেমিমা] মাস্টারকে অক্ষম করতে হবে (এবং এটি সমস্ত ডিবিগুলিকে প্রভাবিত করবে) যেখানে [সিস] ভিউটি অক্ষম করতে হবে প্রতিটি ডিবি নিজেই, এবং এমনকি মাস্টারটিতে অক্ষম থাকলেও ব্যবহারকারী বর্তমান ভিবিতে এটি অক্ষম না করে থাকলেও এখনও ভিউ থেকে নির্বাচন করতে সক্ষম হবে।
সুইসকোডার

উত্তর:


10

আপনার সম্পূর্ণ sysএবং সম্পূর্ণরূপে information_schemaস্কিমাতে অনুমতিগুলি অস্বীকার করতে সক্ষম হওয়া উচিত :

DENY SELECT On SCHEMA::sys To [user_name]
DENY SELECT On SCHEMA::INFORMATION_SCHEMA To [user_name]

এটি মূলত সেই ব্যবহারকারীকে সেই দুটি স্কিমায় কোনও নির্বাচন করতে বাধা দেওয়া উচিত।


উত্তর হিসাবে চিহ্নিত হয়েছে, তবে জিনিসটি SCHEMA :: সাহায্য করেনি, আরও ভাল করে আবার এটি সরিয়ে ফেলুন। সমাধানটি হ'ল ব্যবহারকারীকে মাস্টার ডাটাবেসে যুক্ত করুন এবং তারপরে মাস্টারে অস্বীকার স্ক্রিপ্টটি চালানো। আপনার সাহায্যের জন্য ধন্যবাদ!
সুইসকডার

ওহ এবং আসলে আমি সম্পূর্ণ SCHEMA অক্ষম করাও সম্ভব নয়, কেবলমাত্র একক টেবিলগুলিতে অ্যাক্সেস এইভাবে অক্ষম করা যায়।
সুইসকডার

5

প্রথমত, আপনি ঠিক বলেছেন যে [সিস্টেমে] এবং [ইনফরমেশন_সেসিইএমএ] স্কিমাতে অ্যাক্সেস রোধ করার জন্য কিছুটা (সামান্য পাল্টা-স্বজ্ঞাত) উপায় হ'ল লগইন (ভাল, সার্ভার-স্তরের অধ্যক্ষ) একজন ব্যবহারকারী হিসাবে উপস্থিত রয়েছে তা নিশ্চিত করা (এআরএম, মাস্টার ডাটাবেসে ডাটাবেস-স্তরের অধ্যক্ষ)।

ধরুন সরলতার জন্য আপনার কাছে এসকিউএল লগইন রয়েছে:

CREATE LOGIN [testy] WITH PASSWORD=N'SCoBIqlJELGzrY9zYsKWC5z3kHtMsyCAP6yBHLUYQ0w='
go

এখন মাস্টার ডাটাবেসে একটি সম্পর্কিত ব্যবহারকারী তৈরি করুন:

use [master]
go
CREATE USER [testy] FOR LOGIN [testy]
go

এখন আপনি এই লগইনটিকে সিস্টেম-সরবরাহিত স্কিমার - [সিস্টেমে] এবং [INFORMATION_SCHEMA] এর যে কোনও সারণিতে অ্যাক্সেস করা থেকে বিরত রাখতে চান।

এটি উপস্থিত হয় যে এসকিউএল সার্ভার ২০০৮ আর 2 এবং এসকিউএল সার্ভার ২০১২ এর মধ্যে একটি আচরণ পরিবর্তন ছিল:

এসকিউএল সার্ভার ২০১২ (এবং সম্ভবত পরবর্তী সংস্করণগুলিতে), [মাস্টার] ডাটাবেসে নিম্নলিখিতটি চালানো আপনার প্রত্যাশার মতো করে:

DENY SELECT, VIEW DEFINITION ON SCHEMA::[sys] to [testy];
GO
DENY SELECT, VIEW DEFINITION ON SCHEMA::[INFORMATION_SCHEMA] to [testy];
GO

যাইহোক, এসকিউএল সার্ভার ২০০৮ আর 2 (এবং সম্ভবত পূর্ববর্তী সংস্করণ) এ, [জনসাধারণের] সদস্যদের এই স্কিমায় বস্তুগুলিতে অ্যাক্সেস দেওয়ার স্টক গ্রান্ট স্টেটমেন্টগুলি উপরের DENY বিবৃতিগুলিকে ওভাররাইড করে বলে মনে হচ্ছে যা আমার কাছে ব্যর্থতার এক বিশাল স্তূপ বলে মনে হচ্ছে। ফলস্বরূপ ২০০৮ আর ২-এ আপনাকে প্রতিটি অনুদানের জন্য [পাবলিক] স্পষ্টভাবে DENY করতে হবে। এটি করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে:

declare
    @database_principal sysname,
    @cur cursor,
    @sql nvarchar( 4000 );

set @database_principal = 'testy';

set @cur = cursor local forward_only static for
    select 
        'DENY ' +
        permission_name + ' on ' +
        case class 
            when 1 then
                case minor_id
                    when 0 then 'OBJECT'
                    else 'COLUMN'
                end
            else
                class_desc
        end + '::' +
        case class
            when 0 then db_name()
            when 1 then quotename( OBJECT_SCHEMA_NAME(major_id) ) + '.' + quotename( object_name( major_id ) ) + case minor_id when 0 then '' else ( select '.' + quotename( name ) collate database_default from sys.columns where column_id=minor_id) end
            when 3 then schema_name( major_id )
        end + ' to ' +
        quotename( @database_principal )
    from
        sys.database_permissions
    where
        [grantee_principal_id] = 0 -- public
        and
        [state_desc] = 'GRANT'
        and
        [permission_name] = 'SELECT'
;

open @cur;

while
    1 = 1
begin
    fetch @cur into @sql;
    if @@fetch_status <> 0 break;

    print @sql;
    exec sys.sp_executesql @sql;
end;

close @cur;

deallocate @cur;

উপরের মাস্টার ডাটাবেসে চালনা করুন এবং আপনি সেই স্কিমার সামগ্রীতে অ্যাক্সেস সরিয়ে ফেলেছেন।

মন্তব্য:

  1. কারণ এগুলি স্পষ্টভাবে DENY বিবৃতি, স্ক্রিপ্টটি চালিত হওয়ার সময়ে এগুলি সঠিক। যদি পরবর্তীতে কেউ সর্বজনীনকে দেওয়া অনুমতিগুলি পরিবর্তন করে (যেমন একটি সার্ভিস প্যাক একটি নতুন সিস্টেম টেবিল তৈরি করে) তবে তা অস্বীকারকারীর কাছে প্রকাশ করা হবে
  2. DENY বিবৃতিগুলির লক্ষ্য হিসাবে একটি ডেটাবেস ভূমিকা ব্যবহার করা এবং প্রত্যাখাত ব্যবহারকারীদের সেই ভূমিকাতে রাখা ভাল ধারণা।
  3. আপনি DENY কে একটি রিভোকে পরিবর্তন করে এটিকে পূর্বাবস্থায় ফেরাতে পারেন
  4. যদি আপনি উপরের স্ক্রিপ্টে নিম্নলিখিত দুটি লাইনটি মন্তব্য করেন:

        and
        [permission_name] = 'SELECT'

    এটি জনসাধারণের জন্য সমস্ত ডিফল্ট GRANT গুলি পূর্বাবস্থায় ফেলার প্রভাব ফেলবে । এটি উদাহরণস্বরূপ, sys.sp_tables অ্যাক্সেস প্রতিরোধ করবে এবং তাই বিরতি যেমন মাইক্রোসফ্ট অ্যাক্সেসের ক্ষমতা মোটে টেবিলগুলি গণনা করবে তবে উচ্চ-সুরক্ষা পরিস্থিতিতে এটি কার্যকরভাবে কার্যকর যাতে ব্যবহারকারী (গুলি) কেবলমাত্র যেখানে স্পষ্টভাবে মঞ্জুর করেছেন সেখানে অ্যাক্সেস পাবেন এটা।


3

কখন এই কৌশলটি উপলভ্য হয়েছিল সে সম্পর্কে আমি অনিশ্চিত - যেহেতু কেউই এটি উল্লেখ করেনি - তবে এটি প্রদর্শিত হয় যে এটি এসকিউএল সার্ভার ২০০৮ সাল থেকে অন্তত কাজ করে।

DENY VIEW DEFINITION to [database-role / database-user];

উপরে কাজ ছাড়া ব্যবহারকারী যোগ করার জন্য থাকার masterহিসাবে অন্যান্য উত্তরের কিছু উল্লেখ ডাটাবেস।


দুর্দান্ত উত্তর! প্রতি টেকনিকট্র.মাইক্রোসফট.ইন- ইউএস / লিবারিয়ান/ms175808 ( v=sql.105 ) .aspx "নির্দিষ্ট ডাটাবেসে গ্রান্টির জন্য অনুমতি-ভিত্তিক মেটাডেটা অ্যাক্সেসকে উপেক্ষা করে"
ক্রিস আন্তন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.