SQL सर्वर में सूचना स्कीमा तक पहुँच से इनकार करें


13

मैं SQL सर्वर में उपयोगकर्ता / समूह के लिए sys.tables/ तक पहुँच को निष्क्रिय करने का सबसे अच्छा तरीका ढूंढ रहा हूँ Information Schema

मुझे यह धागा 2008 से मिला

यह इस तरह से उपयोग करने से इनकार करने का एक तरीका दिखाता है [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

यह काम नहीं लगता है।

मैं info_schema तक पहुंच को कैसे अक्षम कर सकता हूं?

और वहाँ एक आसान तरीका है सभी के लिए उपयोग अक्षम 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::क्वेरी में शामिल करने से securables बनाना संभव हो गया है

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

लेकिन अब मैं अभी भी डीबी से सभी जानकारी का चयन कर सकता हूं।

मैंने "Securables" पर एक नजर डाली थी -टैब में उपयोगकर्ता प्रॉपर्टी-विंडो मैनेजमेंट स्टूडियो 2008 में, यह इस तरह दिखता है:

एंट्री जो sys.tables के सेलेक्शन को ब्लॉक करती है

स्कीमा: sys, नाम: टेबल, प्रकार: देखें

Sys.tables के लिए अनुमतियाँ: अनुमति: चयन करें, अनुदान: dbo, इनकार की जाँच की जाती है

प्रवेश जो किसी भी चयन को अवरुद्ध न करें

स्कीमा :, नाम: INFORMATION_SCHEMA, प्रकार: स्कीमा

सूचना के लिए अनुमतियां

अनुमति: चुनें, अनुदान: INFORMATION_SCHEMA, अस्वीकार की जाँच की जाती है


मैंने GUI पर अनुमतियाँ सेट करने का प्रयास किया, लेकिन फिर मुझे वही त्रुटि मिलती है कि अनुमतियाँ सेट करना केवल मास्टर DB पर संभव होगा। लेकिन मेरे पास मास्टर DBs सुरक्षा में जोड़ा गया उपयोगकर्ता / लॉगिन नहीं है।

समाधान:

जिस तरह से मैं मास्टर-डीबी के लिए उपयोगकर्ता को जोड़ने और मास्टर पर चलाने के 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 प्रश्न और उसके जवाब को रेमस रुसानु द्वारा देखें - एक ही विषय को कवर करता है
marc_s

हाँ धन्यवाद। वास्तव में [info_schema] -व्यू और [sys] -व्यूज़ को नकारने के बीच का अंतर यह है कि [information_schema] को मास्टर पर डिसेबल करना पड़ता है (और यह सभी DBs को प्रभावित करेगा) जबकि [sys] व्यू को डिसेबल करना पड़ता है प्रत्येक db स्वयं, और भले ही मास्टर पर अक्षम हो फिर भी उपयोगकर्ता दृश्य से चयन करने में सक्षम होगा, यदि यह वर्तमान db पर भी अक्षम नहीं है।
स्विसकोड

जवाबों:


10

आपको संपूर्ण sysऔर information_schemaस्कीमा की अनुमति को केवल एक के रूप में अस्वीकार करने में सक्षम होना चाहिए :

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

यह मूल रूप से केवल उस उपयोगकर्ता को उन दो स्कीमाओं में किसी भी चयन को करने से रोकना चाहिए।


उत्तर के रूप में चिह्नित, लेकिन बात यह है कि SCHEMA :: ने मदद नहीं की, इसे फिर से हटा दें। समाधान उपयोगकर्ता को मास्टर डेटाबेस में जोड़ने और फिर मास्टर पर इनकार स्क्रिप्ट चलाने के लिए है। आपके सहयोग के लिए धन्यवाद!
स्विसकोर

ओह और वास्तव में मैं भी पूरे SCHEMA को अक्षम करना संभव नहीं है, केवल सिंगल टेबल तक पहुंच को इस तरह से अक्षम किया जा सकता है।
स्विसकोडर

5

सबसे पहले, आप इस बात में सही हैं कि [sys] और [INFORMATION_SCHEMA] स्कीमा तक पहुँच को रोकने के लिए (थोड़ा जवाबी-सहज) तरीका यह सुनिश्चित करना है कि लॉगिन (अच्छी तरह से, सर्वर-स्तरीय प्रिंसिपल) उपयोगकर्ता (erm) के रूप में मौजूद है मास्टर डेटाबेस में डेटाबेस स्तर के प्रिंसिपल)।

मान लें कि आपके पास सरलता के लिए SQL लॉगिन है:

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

अब मास्टर डेटाबेस में एक संबंधित उपयोगकर्ता बनाएं:

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

अब आप इस लॉगिन को सिस्टम-प्रदत्त स्कीमा - [sys] और [INFORMATION_SCHEMA] में किसी भी तालिका तक पहुँचने से रोकना चाहते हैं।

ऐसा प्रतीत होता है कि SQL Server 2008 R2 और SQL Server 2012 के बीच एक व्यवहार परिवर्तन था:

SQL सर्वर 2012 (और संभवतः बाद के संस्करणों) में, निम्नलिखित [मास्टर] डेटाबेस में चल रहा है जैसा कि आप उम्मीद करेंगे:

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

हालाँकि, SQL सर्वर 2008 R2 (और संभवतः पहले के संस्करणों) में, इन स्कीमा में वस्तुओं पर एक्सेस देने वाले स्टॉक अनुदान स्टेटमेंट [पब्लिक] के सदस्यों को उपरोक्त DENY स्टेटमेंट को ओवरराइड करने लगते हैं, जो मुझे विफल होने के एक बड़े ढेर की तरह लगता है। नतीजतन 2008 R2 पर आपको प्रत्येक सार्वजनिक रूप से [जनता] के लिए स्पष्ट रूप से इनकार करना होगा। यह करने के लिए एक स्क्रिप्ट है:

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. क्योंकि ये स्पष्ट रूप से अस्वीकार किए गए कथन हैं, वे उस बिंदु पर सही हैं जिस पर स्क्रिप्ट चलाई गई है। यदि कोई बाद में सार्वजनिक करने के लिए दी गई अनुमतियों को बदल देता है (जैसे एक सर्विस पैक एक नई प्रणाली तालिका बनाता है) तो वह अस्वीकृत उपयोगकर्ता के सामने आ जाएगी
  2. DENY कथनों के लक्ष्य के रूप में डेटाबेस भूमिका का उपयोग करना और अस्वीकृत उपयोगकर्ताओं को उस भूमिका में रखना एक अच्छा विचार है।
  3. आप DENY को REVOKE में बदलकर इसे पूर्ववत कर सकते हैं
  4. यदि आप उपरोक्त लिपि में निम्नलिखित दो पंक्तियों पर टिप्पणी करते हैं:

        and
        [permission_name] = 'SELECT'

    यह जनता के लिए डिफ़ॉल्ट GRANTs के सभी को पूर्ववत करने का प्रभाव होगा । यह उदा, sys.sp_tables तक पहुंच को रोक देगा और इसलिए ब्रेक लेगा। Microsoft Access की क्षमता तालिकाओं को पूरी तरह से बढ़ाती है, लेकिन यह उच्च सुरक्षा परिदृश्यों में उपयोगी है ऐसा करने के लिए उपयोगकर्ता (ओं) को केवल वहीं पहुंच मिलती है जहां आपने स्पष्ट रूप से अनुमति दी है यह।


3

मैं इस बात के बारे में अनिश्चित हूं कि यह ट्रिक कब उपलब्ध हुई - क्योंकि किसी ने इसका उल्लेख नहीं किया है - लेकिन ऐसा प्रतीत होता है कि यह SQL Server 2008 के बाद से कम से कम काम करता है।

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

उपर्युक्त कुछ अन्य जवाबों में उल्लिखित उपयोगकर्ता को डेटाबेस में शामिल किए बिना काम करता masterहै।


बहुत बढ़िया जवाब! प्रति Technet.microsoft.com/en-us/library/ms175808(v=sql.105).aspx "निर्दिष्ट डेटाबेस में अनुदान के लिए अनुमतियों-आधारित मेटाडेटा पहुँच को नकारता है"
क्रिस एंटोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.