Bagikan melalui


Konfigurasi visibilitas metadata

Berlaku untuk:SQL ServerDatabase Azure SQLInstans Terkelola Azure SQLAzure Synapse AnalyticsSistem 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_help Database
  • 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_help SQL 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_help Database mungkin hanya mengembalikan subkumpulan baris, atau NULL.
  • 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_string kolom sys.servers. Pengguna yang tidak memiliki ALTER ANY LINKED SERVER izin melihat NULL nilai 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 DEFINITION izin pada objek.

    • Pengguna tidak ditolak izin VIEW DEFINITION pada objek dan memiliki izin CONTROL, ALTER, atau TAKE OWNERSHIP pada objek. Semua pengguna lain 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 dalam syscomments 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
  • OBJECT_DEFINITION() fungsi

  • Nilai yang disimpan di password_hash kolom sys.sql_logins. Pengguna yang tidak memiliki CONTROL SERVER, atau di SQL Server 2022 (16.x) dan versi yang lebih baru, perizinan VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION akan melihat nilai NULL di 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_units
  • sys.column_type_usages
  • sys.configurations
  • sys.data_spaces
  • sys.database_files
  • sys.destination_data_spaces
  • sys.filegroups
  • sys.messages
  • sys.parameter_type_usages
  • sys.partition_functions
  • sys.partition_range_values
  • sys.partition_schemes
  • sys.partitions
  • sys.schemas
  • sys.sql_dependencies
  • sys.type_assembly_usages