Saya mencari cara terbaik untuk menonaktifkan akses ke sys.tables
/ Information Schema
untuk pengguna / grup di SQL Server.
Saya menemukan utas ini sejak 2008
Ini menunjukkan cara bagaimana menolak akses [sys].[something]
seperti:
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
Tetapi tidak ada cara bagaimana menonaktifkan akses pada Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Ini sepertinya tidak berhasil.
Bagaimana saya bisa menonaktifkan akses ke information_schema?
Dan apakah ada yang lebih mudah cara menonaktifkan akses ke semua sys
/ information_schema
?
Pembaruan: Sebenarnya saya tidak dapat menjalankan kedua pernyataan berikut:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
Saya mencoba menjalankannya pada DB spesifik di mana Pengguna ada, dan saya juga mencoba pada "master".
Saya masih bisa lari:
SELECT * from
INFORMATION_SCHEMA.TABLES
-> masih mengembalikan hasil
SELECT * from
sys.TABLES
-> tidak ada hasil lagi
Termasuk SCHEMA::
dalam kueri memungkinkan untuk membuat yang dapat diamankan
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
Tapi sekarang saya masih bisa memilih semua informasi dari DB.
Saya telah melihat "Securables" -Tab di jendela Properti pengguna di Management Studio 2008, tampilannya seperti ini:
Entri yang tidak memblokir pemilihan sys.tables
Skema: sys, Nama: tabel, Jenis: Tampilan
Izin untuk sys.tables: Izin: Pilih, Pemberi: dbo, Deny diperiksa
Entri yang tidak memblokir seleksi apa pun
Skema :, Nama: INFORMATION_SCHEMA, Jenis: Skema
Izin untuk INFORMATION_SCHEMA: Izin: Pilih, Pemberi: dbo, Deny TIDAK dicentang (saya mencoba memeriksanya, tetapi tidak ada kesempatan ..)
Izin: Pilih, Pemberi: INFORMATION_SCHEMA, Tolak diperiksa
Saya mencoba untuk mengatur izin di atas GUI, tetapi kemudian saya mendapatkan kesalahan yang sama bahwa pengaturan izin hanya mungkin pada DB master. Tapi saya tidak memiliki pengguna / login ditambahkan ke keamanan master DB.
Larutan:
Satu-satunya cara saya bisa membuat deny
pekerjaan untuk information_schema
adalah menambahkan pengguna ke master-db dan menjalankannya deny select
di master:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
Dan seperti dalam kode ini, itu hanya dapat dieksekusi untuk tabel tunggal.
Jawaban:
Anda harus dapat hanya menolak izin pada keseluruhan
sys
daninformation_schema
skema secara keseluruhan:Itu pada dasarnya hanya akan mencegah pengguna melakukan seleksi dalam dua skema tersebut.
sumber
Pertama, Anda benar bahwa cara (sedikit kontra-intuitif) untuk mencegah akses ke [sys] dan skema [INFORMATION_SCHEMA] adalah pertama-tama memastikan bahwa login (yah, prinsip tingkat server) ada sebagai pengguna (erm, database-level principal) dalam master database.
Asumsikan Anda memiliki login SQL untuk kesederhanaan:
Sekarang buat pengguna yang sesuai di master database:
Sekarang Anda ingin mencegah login ini dari mengakses salah satu tabel di skema yang disediakan sistem - [sys] dan [INFORMATION_SCHEMA].
Tampaknya ada perubahan perilaku antara SQL Server 2008 R2 dan SQL Server 2012:
Di SQL Server 2012 (dan mungkin versi yang lebih baru), menjalankan yang berikut ini dalam database [master] melakukan seperti yang Anda harapkan:
Namun, dalam SQL Server 2008 R2 (dan mungkin versi sebelumnya), pernyataan pemberian saham memberikan akses pada objek dalam skema ini kepada anggota [publik] tampaknya menimpa pernyataan DENY di atas, yang tampaknya seperti tumpukan kegagalan saya. Karenanya pada 2008 R2 Anda harus secara eksplisit MENYANGKAL setiap GRANT untuk [publik]. Berikut ini skrip untuk melakukannya:
Jalankan di atas dalam database master dan Anda telah menghapus akses ke konten skema tersebut.
Catatan:
Jika Anda mengomentari dua baris berikut dalam skrip di atas:
Ini akan memiliki efek membatalkan SEMUA GRANT default untuk publik. Ini akan mencegah akses ke mis. Sys.sp_tables dan karenanya mis. Kemampuan Microsoft Access menghitung tabel sama sekali, tetapi ini berguna dalam skenario keamanan tinggi untuk melakukan hal ini sehingga pengguna mendapatkan akses hanya di mana Anda telah secara eksplisit diberikan Itu.
sumber
Saya tidak yakin kapan trik ini tersedia - karena tidak ada yang menyebutkannya - tetapi tampaknya ini berfungsi setidaknya sejak SQL Server 2008.
Di atas berfungsi tanpa harus menambahkan pengguna ke
master
database seperti yang disebutkan dalam beberapa jawaban lain.sumber