Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Database Azure
SQLInstans
Terkelola Azure SQLAzure Synapse Analytics
Sistem Platform Analitik (PDW)
Database SQL di Microsoft Fabric
Visibilitas metadata terbatas pada keamanan yang dimiliki pengguna atau di mana pengguna telah diberikan beberapa izin.
Misalnya, kueri berikut mengembalikan baris jika pengguna memberikan izin seperti SELECT atau INSERT pada tabel myTable.
SELECT name, object_id
FROM sys.tables
WHERE name = N'myTable';
GO
Namun, jika pengguna tidak memiliki izin pada myTable, kueri mengembalikan tataan hasil kosong.
Cakupan dan dampak konfigurasi visibilitas metadata
Konfigurasi visibilitas metadata hanya berlaku untuk keamanan berikut:
- Tampilan katalog
- Metadata yang mengekspos fungsi bawaan
- Tampilan kompatibilitas
- Prosedur tersimpan Mesin
sp_helpDatabase - Tampilan skema informasi
- Properti yang diperluas
Konfigurasi visibilitas metadata tidak berlaku untuk keamanan berikut:
- Tabel sistem pengiriman log
- Tabel sistem rencana pemeliharaan database
- Tabel sistem replikasi
- Tabel sistem SQL Server Agent
- Tabel sistem cadangan
- Prosedur tersimpan Agen
sp_helpSQL Server dan Replikasi
Aksesibilitas metadata terbatas berarti sebagai berikut:
- Kueri pada tampilan sistem mungkin hanya mengembalikan subkumpulan baris, atau terkadang tataan hasil kosong.
- Fungsi bawaan yang memancarkan metadata seperti OBJECTPROPERTYEX mungkin mengembalikan
NULL. - Prosedur tersimpan Mesin
sp_helpDatabase mungkin hanya mengembalikan subkumpulan baris, atauNULL. - Akibatnya, aplikasi yang mengasumsikan akses metadata publik rusak.
Modul SQL, seperti prosedur dan pemicu tersimpan, berjalan di bawah konteks keamanan pemanggil dan, oleh karena itu, memiliki aksesibilitas metadata terbatas. Misalnya, dalam kode berikut, ketika prosedur tersimpan mencoba mengakses metadata untuk tabel myTable di mana pemanggil tidak memiliki hak, tataan hasil kosong dikembalikan. Dalam rilis SQL Server sebelumnya, baris dikembalikan.
CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END;
GO
Untuk mengizinkan penelepon melihat metadata, Anda dapat memberikan izin pemanggil VIEW DEFINITION , atau di SQL Server 2022 (16.x) dan versi yang lebih baru, baik VIEW SECURITY DEFINITION atau VIEW PERFORMANCE DEFINITION pada cakupan yang sesuai: tingkat objek, tingkat database, atau tingkat server. Oleh karena itu, dalam contoh sebelumnya, jika pemanggil memiliki VIEW DEFINITION izin pada myTable, prosedur tersimpan mengembalikan baris data. Untuk informasi selengkapnya, lihat GRANT dan GRANT Izin Basis Data.
Anda juga dapat mengubah prosedur tersimpan sehingga dijalankan di bawah kredensial pemilik. Ketika pemilik prosedur dan pemilik tabel adalah pemilik yang sama, rantai kepemilikan berlaku, dan konteks keamanan pemilik prosedur memungkinkan akses ke metadata untuk myTable. Dalam skenario ini, kode berikut mengembalikan baris metadata ke pemanggil.
Catatan
Contoh berikut menggunakan tampilan katalog sys.objects alih-alih tampilan kompatibilitas sys.sysobjects .
CREATE PROCEDURE does_not_assume_caller_can_access_metadata
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END
GO
Catatan
Anda dapat menggunakan EXECUTE AS untuk beralih sementara ke konteks keamanan pemanggil. Untuk informasi selengkapnya, lihat JALANKAN SEBAGAI.
Manfaat dan batas konfigurasi visibilitas metadata
Konfigurasi visibilitas metadata dapat memainkan peran penting dalam rencana keamanan Anda secara keseluruhan. Namun, ada kasus di mana pengguna yang terampil dan ditentukan dapat memaksa pengungkapan beberapa metadata. Kami menyarankan agar Anda menyebarkan izin metadata sebagai salah satu dari banyak pertahanan secara mendalam.
Secara teoritis dimungkinkan untuk memaksa emisi metadata dalam pesan kesalahan dengan memanipulasi urutan evaluasi predikat dalam kueri. Kemungkinan serangan coba-dan-kesalahan tersebut tidak khusus untuk SQL Server. Ini tersirat oleh transformasi asosiatif dan komutatif yang diizinkan dalam aljabar relasional. Anda dapat mengurangi risiko ini dengan membatasi informasi yang dikembalikan dalam pesan kesalahan. Untuk lebih membatasi visibilitas metadata dengan cara ini, Anda dapat memulai server dengan bendera pelacakan 3625. Bendera pelacakan ini membatasi jumlah informasi yang ditampilkan dalam pesan kesalahan. Pada gilirannya, ini membantu mencegah pengungkapan paksa. Kompromi adalah bahwa pesan kesalahan yang singkat dan mungkin sulit digunakan untuk tujuan penelusuran kesalahan. Untuk informasi selengkapnya, lihat Opsi startup Database Engine Service dan bendera pelacakan.
Metadata berikut tidak tunduk pada pengungkapan paksa:
Nilai yang disimpan di
provider_stringkolomsys.servers. Pengguna yang tidak memilikiALTER ANY LINKED SERVERizin melihatNULLnilai di kolom ini.Definisi sumber objek yang ditentukan pengguna seperti prosedur atau pemicu tersimpan. Kode sumber hanya terlihat ketika salah satu kondisi berikut ini benar:
Pengguna memiliki
VIEW DEFINITIONizin pada objek.Pengguna tidak ditolak izin
VIEW DEFINITIONpada objek dan memiliki izinCONTROL,ALTER, atauTAKE OWNERSHIPpada objek. Semua pengguna lain melihatNULL.
Kolom definisi yang ditemukan dalam tampilan katalog berikut:
sys.all_sql_modulessys.server_sql_modulessys.default_constraintssys.numbered_proceduressys.sql_modulessys.check_constraintssys.computed_columns
Kolom
ctextdalamsyscommentstampilan kompatibilitas.Output
sp_helptextprosedur.Kolom berikut dalam tampilan skema informasi:
INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSEINFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULTINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
OBJECT_DEFINITION()fungsiNilai yang disimpan di
password_hashkolomsys.sql_logins. Pengguna yang tidak memilikiCONTROL SERVER, atau di SQL Server 2022 (16.x) dan versi yang lebih baru, perizinanVIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITIONakan melihat nilaiNULLdi kolom ini.
Definisi SQL dari prosedur dan fungsi sistem bawaan terlihat secara publik melalui sys.system_sql_modules tampilan katalog, prosedur tersimpan sp_helptext , dan OBJECT_DEFINITION() fungsi .
Catatan
Prosedur sp_helptext tersimpan sistem tidak didukung di Azure Synapse Analytics. Sebagai gantinya sys.sql_modules , gunakan tampilan katalog objek.
Prinsip umum visibilitas metadata
Berikut ini adalah beberapa prinsip umum yang perlu dipertimbangkan mengenai visibilitas metadata:
- Izin implisit peran tetap
- Cakupan izin
- Prioritas dari
DENY - Visibilitas metadata subkomponen
Peran tetap dan izin implisit
Metadata yang dapat diakses oleh peran tetap tergantung pada izin implisit yang sesuai.
Cakupan izin
Izin pada satu cakupan menyiratkan kemampuan untuk melihat metadata pada cakupan tersebut dan di semua cakupan yang diapit. Misalnya, SELECT izin pada skema menyiratkan bahwa penerima izin memiliki SELECT izin pada semua objek yang diamankan yang terdapat dalam skema tersebut. Oleh karena itu, pemberian SELECT izin pada skema memungkinkan pengguna untuk melihat metadata skema dan juga semua tabel, tampilan, fungsi, prosedur, antrean, sinonim, jenis, dan koleksi skema XML di dalamnya. Untuk informasi selengkapnya tentang cakupan, lihat Hierarki Izin (Mesin Database).
Catatan
Izin UNMASK tidak memengaruhi visibilitas metadata: memberikan UNMASK saja tidak mengungkapkan Metadata apa pun.
UNMASK selalu perlu disertai dengan SELECT izin untuk memiliki efek apa pun. Contoh: memberikan UNMASK cakupan database dan pemberian SELECT pada tabel individual memiliki hasil bahwa pengguna hanya dapat melihat metadata tabel individual tempat mereka dapat memilih, bukan yang lain.
Prioritas DENY
DENY biasanya lebih diutamakan daripada izin lain. Misalnya, jika pengguna database diberikan EXECUTE izin pada skema tetapi telah ditolak EXECUTE izin pada prosedur tersimpan dalam skema tersebut, pengguna tidak dapat melihat metadata untuk prosedur tersimpan tersebut.
Selain itu, jika pengguna ditolak EXECUTE izin pada skema tetapi telah diberikan EXECUTE izin pada prosedur tersimpan dalam skema tersebut, pengguna tidak dapat melihat metadata untuk prosedur tersimpan tersebut.
Misalnya, jika seorang pengguna telah diberikan dan ditolak izin pada prosedur tersimpan tertentu, yang dimungkinkan melalui berbagai keanggotaan peran Anda, EXECUTE akan diprioritaskan dan pengguna tidak dapat melihat metadata dari prosedur tersimpan tersebut.
Visibilitas metadata subkomponen
Visibilitas subkomponen, seperti indeks, batasan pemeriksaan, dan pemicu ditentukan oleh izin pada induk. Subkomponen ini tidak memiliki izin yang dapat diberikan. Misalnya, jika pengguna telah diberikan beberapa izin pada tabel, pengguna dapat melihat metadata untuk tabel, kolom, indeks, memeriksa batasan, pemicu, dan subkomponen lainnya. Contoh lain adalah memberikan SELECT hanya pada kolom individual dari tabel tertentu: ini memungkinkan penerima untuk melihat metadata seluruh tabel, termasuk semua kolom. Salah satu cara untuk memikirkannya, adalah bahwa VIEW DEFINITION izin hanya berfungsi pada tingkat entitas (tabel dalam hal ini) dan tidak tersedia untuk daftar Subentitas (seperti kolom atau ekspresi keamanan).
Kode berikut menunjukkan perilaku ini:
CREATE TABLE t1
(
c1 INT,
c2 VARCHAR
);
GO
CREATE USER testUser WITHOUT LOGIN;
GO
EXECUTE AS USER = 'testUser';
SELECT OBJECT_SCHEMA_NAME(object_id),
OBJECT_NAME(object_id),
name
FROM sys.columns;
SELECT * FROM sys.tables;
-- this returns no data, as the user has no permissions
REVERT;
GO
-- granting SELECT on only 1 column of the table:
GRANT SELECT ON t1 (c1) TO testUser;
GO
EXECUTE AS USER = 'testUser';
SELECT OBJECT_SCHEMA_NAME(object_id),
OBJECT_NAME(object_id),
name
FROM sys.columns;
SELECT * FROM sys.tables;
-- this returns metadata for all columns of the table and the table itself
;
REVERT;
GO
DROP TABLE t1;
DROP USER testUser;
Metadata yang dapat diakses oleh semua pengguna database
Beberapa metadata harus dapat diakses oleh semua pengguna dalam database tertentu. Misalnya, grup file tidak memiliki izin yang dapat dianugerahkan; oleh karena itu, pengguna tidak dapat diberikan izin untuk melihat metadata grup file. Namun, setiap pengguna yang dapat membuat tabel harus dapat mengakses metadata filegroup untuk menggunakan klausa ON <filegroup> atau perintah TEXTIMAGE_ON <filegroup>.
Metadata yang dikembalikan oleh fungsi DB_ID() dan DB_NAME() terlihat oleh semua pengguna.
Ini adalah daftar tampilan katalog yang terlihat oleh peran publik .
sys.allocation_unitssys.column_type_usagessys.configurationssys.data_spacessys.database_filessys.destination_data_spacessys.filegroupssys.messagessys.parameter_type_usagessys.partition_functionssys.partition_range_valuessys.partition_schemessys.partitionssys.schemassys.sql_dependenciessys.type_assembly_usages