SQL Server'da bilgi şemasına erişimi reddetme


13

/ SQL Server'da bir kullanıcı / grup için sys.tables/ erişimini devre dışı bırakmak için en iyi yolu arıyorum Information Schema.

2008'den bu konuyu buldum

Aşağıdaki şekilde erişimi reddetmenin bir yolunu gösterir [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

Ancak şu yolla erişimi devre dışı bırakmanın hiçbir yolu yoktur Information Schema:

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole

Bu işe yaramıyor gibi görünüyor.

İnformation_schema'ya erişimi nasıl devre dışı bırakabilirim?

Ve tüm daha kolay bir yolu ulaşımı engelle var sys/ ' information_schema?

Güncelleme: Aslında ben aşağıdaki ifadeleri ot çalıştıramazsınız:

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

Bunları Kullanıcının bulunduğu belirli bir DB'de çalıştırmayı denedim ve "ana" da denedim.

Hala koşabilirim:

 SELECT * from
 INFORMATION_SCHEMA.TABLES 

-> hala sonuç döndürüyor

 SELECT * from
 sys.TABLES 

-> sonuç yok

SCHEMA::Sorguya dahil etmek, güvenilirlerin oluşturulmasını mümkün kıldı

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

Ama şimdi hala DB'den tüm bilgileri seçebilirim.

Management Studio 2008'deki kullanıcıların Özellik penceresinde "Güvenli" -Tab'a bir göz attım, şöyle görünüyor:

Sys.tables seçilmesini engelleyen giriş

Şema: sys, Adı: tablolar, Tür: Görünüm

Sys.tables için izinler: İzin: Seç, Grantor: dbo, Reddet onaylandı

Seçimi engellemeyen giriş

Şema :, Adı: BİLGİ_SCHEMA, Tür: Şema

BİLGİ_SCHEMA izinleri: İzin: Seç, Grantor: dbo, Reddetme kontrol edilmez (Ben kontrol etmeye çalıştım, ama hiç şansım yok.)

İzin: Seç, Grantor: BİLGİ_SCHEMA, Reddet onaylandı


GUI üzerinde izinleri ayarlamaya çalıştım, ancak ayar izinlerini yalnızca ana DB'de mümkün olacak aynı hatayı alıyorum. Ancak kullanıcı / oturum açma ana DBs güvenliği eklenmiş değil.

Çözüm:

Yapmak tek yolu denyiçin çalışma information_schemaoldu usta-db kullanıcı eklemek ve çalıştırmak deny selectusta tarih:

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

Ve bu kodda olduğu gibi, yalnızca tek tablolar için yürütülebilir.


1
Ayrıca bu dba.se sorusuna ve Remus Rusanu'nun cevabına bir göz atın - bir çeşit aynı konuyu kapsar
marc_s

Evet teşekkürler. Aslında [information_schema] görüşlerinin reddedilmesi ile [sys] görüşlerinin reddedilmesi arasındaki fark, [information_schema] öğesinin ana bilgisayarda devre dışı bırakılması (ve tüm DB'leri etkileyeceği), ancak [sys] görünümünün devre dışı bırakılması gerektiğidir her db'nin kendisi ve ana bilgisayarda devre dışı bırakılsa bile, kullanıcı geçerli db'de de devre dışı bırakılmamışsa görünümden seçim yapabilir.
SwissCoder

Yanıtlar:


10

Sadece sysve information_schemabir bütün olarak şemadaki izinleri reddedebilmelisiniz :

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

Bu temelde kullanıcının bu iki şemada herhangi bir seçim yapmasını engellemelidir.


cevap olarak işaretlendi, ama şey SCHEMA :: yardımcı olmadı, tekrar kaldırın. Çözüm, kullanıcıyı ana veritabanına eklemek ve ardından ana bilgisayarda reddetme komut dosyasını çalıştırmaktır. Yardımın için teşekkürler!
SwissCoder

Oh ve aslında ben de tüm SCHEMA devre dışı bırakmak mümkün değil, sadece tek tablolara erişim böyle devre dışı bırakılabilir.
SwissCoder

5

İlk olarak, [sys] ve [BİLGİ_SCHEMA] şemalarına erişimi önlemek için (biraz ters-sezgisel) yolun, ilk olarak kullanıcı (erm, sunucu düzeyinde anapara) olarak kullanıcı (erm, veritabanı düzeyinde yönetici).

Basitlik için bir SQL girişiniz olduğunu varsayın:

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

Şimdi ana veritabanında karşılık gelen bir kullanıcı oluşturun:

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

Şimdi bu girişin sistem tarafından sağlanan şemalardaki [sys] ve [BİLGİ_SCHEMA] tablolarından herhangi birine erişmesini önlemek istiyorsunuz.

SQL Server 2008 R2 ve SQL Server 2012 arasında bir davranış değişikliği olduğu anlaşılıyor:

SQL Server 2012'de (ve muhtemelen sonraki sürümlerde), [master] veritabanında aşağıdakileri çalıştırmak beklediğiniz gibi olur:

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

Ancak, SQL Server 2008 R2'de (ve muhtemelen daha önceki sürümlerde), bu şemalardaki nesnelere [public] üyelerine erişim sağlayan hisse senedi verme ifadeleri, benim için büyük bir başarısızlık yığını gibi görünen yukarıdaki DENY ifadelerini geçersiz kılıyor gibi görünüyor. Sonuç olarak 2008 R2'de [herkese] verilen her HİBE açıkça açıkça DENEMEK gerekir. İşte bunu yapmak için bir komut dosyası:

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;

Ana veritabanında yukarıdakileri çalıştırın ve bu şemaların içeriğine erişimi kaldırdınız.

Notlar:

  1. Bunlar açık DENY ifadeleri olduğundan, komut dosyasının çalıştırıldığı noktada doğrudur. Birisi daha sonra herkese açık olan izinleri değiştirirse (örneğin, bir hizmet paketi yeni bir sistem tablosu oluşturur), bu reddedilen kullanıcıya maruz kalacaktır
  2. Bir veritabanı rolünü DENY deyimlerinin hedefi olarak kullanmak ve reddedilen kullanıcıları bu role koymak iyi bir fikirdir.
  3. DENY'yi bir REVOKE olarak değiştirerek bunu geri alabilirsiniz.
  4. Yukarıdaki komut dosyasında aşağıdaki iki satırı yorumlarsanız:

        and
        [permission_name] = 'SELECT'
    

    Bu, herkese açık olan varsayılan HİBELERİN TÜMÜNÜ geri alma etkisine sahip olacaktır . Bu, örneğin sys.sp_tables'a erişimi önler ve bu nedenle örneğin Microsoft Access'in tabloları numaralandırma yeteneğini ortadan kaldırır, ancak yüksek güvenlik senaryolarında bunu yapmak yararlı olur, böylece kullanıcılar yalnızca açıkça verdiğiniz yerlerde erişebilir o.


3

Bu hile ne zaman kullanılabilir olduğundan emin değilim - hiç kimse bahsetmedi çünkü - ama en azından SQL Server 2008'den beri çalışıyor gibi görünüyor.

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

Yukarıdaki bilgiler , diğer bazı cevaplarda belirtildiği gibi kullanıcıyı veritabanına eklemek zorunda kalmadan çalışır master.


Mükemmel cevap! Başına technet.microsoft.com/en-us/library/ms175808(v=sql.105).aspx "olumsuzlar belirtilen veritabanı olarak, hibe için meta veri erişimi izinleri dayalı"
Chris Anton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.