Konfigurasi Visibilitas Metadata

Berlaku untuk: SQL Server (semua versi yang didukung) 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 diberi 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

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

SQL Server Agent tabel sistem

Tabel sistem cadangan

Replikasi dan SQL Server Agent prosedur tersimpan sp_help

Aksesibilitas metadata terbatas berarti sebagai berikut:

  • Aplikasi yang mengasumsikan akses metadata publik akan rusak.

  • Kueri pada tampilan sistem mungkin hanya mengembalikan subkumpulan baris, atau terkadang tataan hasil kosong.

  • Memancarkan metadata, fungsi bawaan seperti OBJECTPROPERTYEX dapat mengembalikan NULL.

  • Prosedur tersimpan Mesin sp_help Database mungkin hanya mengembalikan subset baris, atau NULL.

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 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 memodifikasi 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. Di bawah 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 EXECUTE AS (Transact-SQL).

Manfaat dan Batasan 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-coba tersebut tidak spesifik 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. 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 kolom sys.servers. Pengguna yang tidak memiliki izin ALTER ANY LINKED SERVER akan melihat NULL 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 LIHAT DEFINISI pada objek dan memiliki izin CONTROL, ALTER, atau TAKE OWNERSHIP pada objek. Semua pengguna lain akan melihat NULL.

  • Kolom definisi 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 dalam syscomments tampilan kompatibilitas.

  • Output prosedur sp_helptext .

  • 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 izin CONTROL SERVER akan melihat NULL 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:

  • Memperbaiki izin implisit peran

  • Cakupan izin

  • Prioritas TOLAK

  • 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 pada semua cakupan tertutup. 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 TOLAK

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 grup file TEXTIMAGE_ON 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_dependencies

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 (Transact-SQL)
TOLAK (Transact-SQL)
MENCABUT (Transact-SQL)
Klausa EXECUTE AS (Transact-SQL)
Tampilan Katalog (Transact-SQL)
Tampilan Kompatibilitas (Transact-SQL)