Konfigurasi Visibilitas Metadata
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Visibilitas metadata terbatas pada keamanan yang dimiliki pengguna atau di mana pengguna telah diberikan beberapa izin.
Misalnya, kueri berikut mengembalikan baris jika pengguna telah diberikan 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 apa pun 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
Mesin Database sp_help prosedur tersimpan
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
Replikasi dan Agen SQL Server sp_help prosedur tersimpan
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 dapat mengembalikan
NULL
.Prosedur tersimpan Mesin
sp_help
Database mungkin hanya mengembalikan subkumpulan baris, atauNULL
.Akibatnya, aplikasi yang mengasumsikan akses metadata publik akan 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 VIEW DEFINITION kepada penelepon atau dimulai dengan SQL Server 2022 baik LIHAT DEFINISI SEKUIRITAS atau LIHAT DEFINISI PERFORMA pada cakupan yang sesuai: tingkat objek, tingkat database, atau tingkat server. Oleh karena itu, dalam contoh sebelumnya, jika pemanggil memiliki izin VIEW DEFINITION pada myTable
, prosedur tersimpan mengembalikan baris. Untuk informasi selengkapnya, lihat GRANT (Transact-SQL) dan GRANT Database Permissions (Transact-SQL).
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 (Transact-SQL).
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. Hal 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. Tradeoff adalah bahwa pesan kesalahan akan terse dan mungkin sulit digunakan untuk tujuan penelusuran kesalahan. Untuk informasi selengkapnya, lihat Opsi Startup Layanan Mesin Database dan Bendera Pelacakan (Transact-SQL).
Metadata berikut tidak tunduk pada pengungkapan paksa:
Nilai yang disimpan di
provider_string
kolomsys.servers
. Pengguna yang tidak memiliki izin ALTER ANY LINKED SERVER akan melihatNULL
nilai di kolom ini.Definisi sumber objek yang ditentukan pengguna seperti prosedur atau pemicu tersimpan. Kode sumber hanya terlihat ketika salah satu hal berikut ini benar:
Pengguna memiliki izin LIHAT DEFINISI pada objek.
Pengguna belum ditolak izin VIEW DEFINITION pada objek dan memiliki izin CONTROL, ALTER, atau TAKE OWNERSHIP pada objek. Semua pengguna lain akan melihat
NULL
.
Kolom definisi yang ditemukan dalam tampilan katalog berikut:
sys.all_sql_modules
sys.server_sql_modules
sys.default_constraints
sys.numbered_procedures
sys.sql_modules
sys.check_constraints
sys.computed_columns
Kolom
ctext
dalamsyscomments
tampilan kompatibilitas.Output
sp_helptext
prosedur.Kolom berikut dalam tampilan skema informasi:
INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE
INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT
INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION
INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
fungsi OBJECT_DEFINITION()
Nilai yang disimpan di kolom password_hash .
sys.sql_logins
Pengguna yang tidak memiliki SERVER KONTROL atau dimulai dengan SQL Server 2022 izin LIHAT DEFINISI AMAN SECARA KRIPTOGRAFIS akan melihatNULL
nilai di kolom ini.
Catatan
Definisi SQL dari prosedur dan fungsi sistem bawaan terlihat secara publik melalui sys.system_sql_modules
tampilan katalog, sp_helptext
prosedur tersimpan, dan fungsi OBJECT_DEFINITION().
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 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, izin SELECT pada skema menyiratkan bahwa penerima izin memiliki izin SELECT pada semua keamanan yang dimuat oleh skema tersebut. Pemberian izin SELECT pada skema oleh karena itu 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 akan mengungkapkan Metadata apa pun. UNMASK akan selalu perlu disertai dengan izin SELECT untuk memiliki efek apa pun. Contoh: memberikan UNMASK pada cakupan database dan memberikan SELECT pada Tabel individual akan 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 izin EXECUTE pada skema tetapi telah ditolak izin EXECUTE pada prosedur tersimpan dalam skema tersebut, pengguna tidak dapat melihat metadata untuk prosedur tersimpan tersebut.
Selain itu, jika pengguna ditolak izin EXECUTE pada skema tetapi telah diberikan izin EXECUTE pada prosedur tersimpan dalam skema tersebut, pengguna tidak dapat melihat metadata untuk prosedur tersimpan tersebut.
Untuk contoh lain, jika pengguna telah diberikan dan ditolak izin EXECUTE pada prosedur tersimpan, yang dimungkinkan melalui berbagai keanggotaan peran Anda, DENY lebih diutamakan dan pengguna tidak dapat melihat metadata prosedur tersimpan.
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 akan memungkinkan penerima izin untuk melihat metadata seluruh tabel, termasuk semua kolom. Salah satu cara untuk memikirkannya, adalah bahwa izin VIEW DEFINITION hanya berfungsi pada tingkat entitas (tabel dalam hal ini) dan tidak tersedia untuk daftar Sub-entitas (seperti ekspresi kolom atau 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 thge 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 grup file untuk menggunakan klausa grup file ON atau TEXTIMAGE_ON grup file dari pernyataan CREATE TABLE.
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.partition_functions
sys.partition_schemes
sys.filegroups
sys.database_files
sys.partitions
sys.schemas
sys.sql_dependensi
sys.parameter_type_usages
sys.partition_range_values
sys.data_spaces
sys.destination_data_spaces
sys.allocation_units
sys.messages
sys.configurations
sys.type_assembly_usages
sys.column_type_usages
Lihat Juga
GRANT (T-SQL)
TOLAK (Transact-SQL)
MENCABUT (Transact-SQL)
Klausa EXECUTE AS (Transact-SQL)
Tampilan Katalog (Transact-SQL)
Tampilan Kompatibilitas (Transact-SQL)