Meta veri görünürlüğü yapılandırması

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Microsoft Fabric SQL veritabanı

Meta verilerin görünürlüğü, kullanıcının sahip olduğu veya kullanıcıya bazı izinlerin verildiği güvenli hale getirilebilir öğelerle sınırlıdır.

Örneğin, kullanıcı SELECT tablosu üzerinde INSERT veya myTable gibi bir izin verirse, aşağıdaki sorgu bir satır döndürür.

SELECT name, object_id
FROM sys.tables
WHERE name = N'myTable';
GO

Ancak, kullanıcının myTable için izni yoksa sorgu boş bir sonuç kümesi döndürür.

Meta veri görünürlüğü yapılandırmasının kapsamı ve etkisi

Meta veri görünürlüğü yapılandırması yalnızca aşağıdaki güvenli hale getirilebilir öğeler için geçerlidir:

  • Katalog görünümleri
  • Yerleşik işlevleri açığa çıkaran meta veriler
  • Uyumluluk görünümleri
  • Veritabanı Altyapısı sp_help saklı yordamları
  • Bilgi şeması görünümleri
  • Genişletilmiş özellikler

Meta veri görünürlüğü yapılandırması aşağıdaki güvenli hale getirilebilir öğeler için geçerli değildir:

  • Kütük Aktarma Sistemi Tabloları
  • Veritabanı bakım planı sistem tabloları
  • Çoğaltma sistemi tabloları
  • SQL Server Agent sistem tabloları
  • Yedekleme sistemi tabloları
  • Çoğaltma ve SQL Server Aracısı sp_help saklı yordamları

Sınırlı meta veri erişilebilirliği şu anlama gelir:

  • Sistem görünümlerinde sorgular yalnızca bir satır alt kümesi veya bazen boş bir sonuç kümesi döndürebilir.
  • OBJECTPROPERTYEX gibi meta veri yayan yerleşik işlevler döndürebilir NULL.
  • Veritabanı Altyapısı sp_help saklı yordamları yalnızca bir satır alt kümesi döndürebilir veya NULL.
  • Sonuç olarak, genel meta veri erişimine izin veren uygulamalar kesintiye neden olur.

Saklı yordamlar ve tetikleyiciler gibi SQL modülleri çağıranın güvenlik bağlamı altında çalışır ve bu nedenle meta veri erişilebilirliği sınırlıdır. Örneğin, aşağıdaki kodda, çağıranın üzerinde hakları olmayan myTable tablosunun meta verilerine erişmeye çalışan saklı yordam, boş bir sonuç kümesi döndürür. SQL Server'ın önceki sürümlerinde bir satır döndürülür.

CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END;
GO

Çağıranların meta verileri görüntülemesine izin vermek için, çağıranlara VIEW DEFINITION izni verebilir veya SQL Server 2022 (16.x) ve sonraki sürümlerde, nesne düzeyinde, veritabanı düzeyinde ya da sunucu düzeyinde uygun bir kapsamda VIEW SECURITY DEFINITION ya da VIEW PERFORMANCE DEFINITION iznini verebilirsiniz. Bu nedenle, önceki örnekte, çağıranın VIEW DEFINITION üzerinde myTable izni varsa saklı yordam bir satır döndürür. Daha fazla bilgi için bkz GRANT . ve GRANT Veritabanı İzinleri.

Saklı yordamı, sahibin kimlik bilgileri altında yürütülmesi için de değiştirebilirsiniz. Yordam sahibi ve tablo sahibi aynı kişi olduğunda, sahiplik zinciri uygulanır ve bu durumda yordam sahibinin güvenlik bağlamı myTable'nin meta verilerine erişim sağlar. Bu senaryo altında, aşağıdaki kod çağırana bir meta veri satırı döndürür.

Not

Aşağıdaki örnek, sys.objects katalog görünümünü, sys.sysobjects uyumluluk görünümü yerine kullanır.

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

Not

Öğesini kullanarak EXECUTE AS , arayanın güvenlik bağlamını geçici olarak değiştirebilirsiniz. Daha fazla bilgi için bkz. EXECUTE AS.

Meta veri görünürlüğü yapılandırmasının avantajları ve sınırları

Meta veri görünürlüğü yapılandırması, genel güvenlik planınızda önemli bir rol oynayabilir. Ancak, yetenekli ve kararlı bir kullanıcının bazı meta verilerin açıklanmasını zorlayabildiği durumlar vardır. Meta veri izinlerini birçok derinlemesine savunmadan biri olarak dağıtmanızı öneririz.

Sorgularda koşul değerlendirmesi sırasını değiştirerek hata iletilerinde meta verilerin emisyonunu zorlamak teorik olarak mümkündür. Bu tür deneme ve hata saldırılarının olasılığı SQL Server'a özgü değildir. İlişkisel cebirde izin verilen ilişkilendirici ve commutatif dönüşümler tarafından ima edilir. Hata iletilerinde döndürülen bilgileri sınırlayarak bu riski azaltabilirsiniz. Meta verilerin görünürlüğünü bu şekilde daha fazla kısıtlamak için sunucuyu izleme bayrağı 3625 ile başlatabilirsiniz. Bu izleme bayrağı, hata iletilerinde gösterilen bilgi miktarını sınırlar. Buna karşılık, bu zorlamalı açıklamaları önlemeye yardımcı olur. Bunun dezavantajı, hata iletilerinin kısa ve öz olması ve hata ayıklama amacıyla kullanılmalarının zor olabilmesidir. Daha fazla bilgi için bkz . Veritabanı Altyapısı Hizmeti başlatma seçenekleri ve izleme bayrakları.

Aşağıdaki meta veriler zorla açıklamaya tabi değildir:

  • provider_string'in sys.servers sütununda saklanan değer. İzni olmayan ALTER ANY LINKED SERVER bir kullanıcı bu sütunda bir NULL değer görür.

  • Saklı yordam veya tetikleyici gibi kullanıcı tanımlı bir nesnenin kaynak tanımı. Kaynak kodu yalnızca aşağıdaki koşullardan biri doğru olduğunda görünür:

    • Kullanıcının nesne üzerinde izni var VIEW DEFINITION .

    • Kullanıcının nesne üzerinde VIEW DEFINITION izni reddedilmemiştir ve nesne üzerinde CONTROL, ALTER veya TAKE OWNERSHIP izni vardır. Diğer tüm kullanıcılar NULL görür.

  • Aşağıdaki katalog görünümlerinde bulunan tanım sütunları:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • ctext uyumluluk görünümündeki syscomments sütunu.

  • sp_helptext prosedürünün çıktısı.

  • Bilgi şeması görünümlerinde aşağıdaki sütunlar:

    • 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() fonksiyon

  • password_hash'in sys.sql_logins sütununda saklanan değer. CONTROL SERVER iznine sahip olmayan veya SQL Server 2022 (16.x) ve sonraki sürümlerde VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION iznine sahip olmayan bir kullanıcı, bu sütunda NULL değeri görür.

Yerleşik sistem yordamları ve işlevlerinin SQL tanımları, sys.system_sql_modules katalog görünümü, sp_helptext saklı yordamı ve OBJECT_DEFINITION() işlevi aracılığıyla genel olarak görüntülenebilir.

Not

Sistem saklı yordamı sp_helptext Azure Synapse Analytics'te desteklenmez. Bunun yerine sys.sql_modules nesne kataloğu görünümünü kullanın.

Meta veri görünürlüğünün genel ilkeleri

Meta veri görünürlüğüyle ilgili dikkate alınması gereken bazı genel ilkeler aşağıdadır:

  • Sabit rollerin zımni izinleri
  • İzinlerin kapsamı
  • DENY önceliği
  • Alt bileşen meta verilerinin görünürlüğü

Sabit roller ve örtük izinler

Sabit roller tarafından erişilebilen meta veriler, karşılık gelen örtük izinlerine bağlıdır.

İzinlerin kapsamı

Bir kapsamdaki izinler, bu kapsamda ve tüm kapalı kapsamlarda meta verileri görebilmeyi ifade eder. Örneğin, bir şema üzerindeki izin, SELECT izni verenin SELECT bu şemanın içerdiği tüm güvenli hale getirilebilir öğeler üzerinde izni olduğunu gösterir. Bu nedenle bir şema üzerinde izin verilmesi SELECT , kullanıcının şemanın meta verilerini ve içindeki tüm tabloları, görünümleri, işlevleri, yordamları, kuyrukları, eş anlamlıları, türleri ve XML şema koleksiyonlarını görmesini sağlar. Kapsamlar hakkında daha fazla bilgi için bkz. İzinler Hiyerarşisi (Veritabanı Altyapısı).

Not

UNMASK izni meta veri görünürlüğünü etkilemez: yalnızca UNMASK izninin verilmesi herhangi bir meta veriyi görünür kılmaz. UNMASK etkili olması için her zaman bir SELECT izni ile birlikte bulunmalıdır. Örnek: Veritabanı kapsamında UNMASK izninin verilmesi ve tek bir tabloda SELECT izninin verilmesi, kullanıcının yalnızca seçim yapabildiği ilgili tablonun meta verilerini görebilmesi, diğer tablolarınkini ise görememesi sonucunu doğurur.

DENY önceliği

DENY genellikle diğer izinlerden önceliklidir. Örneğin, bir veritabanı kullanıcısının EXECUTE şema üzerinde izni varsa ancak bu şemadaki bir saklı yordam üzerinde izni reddedildiyse EXECUTE , kullanıcı söz konusu saklı yordamın meta verilerini görüntüleyemez.

Ayrıca, bir kullanıcının bir şema üzerinde EXECUTE izni reddedilmiş, ancak bu şemadaki bir saklı yordam üzerinde EXECUTE izni verilmişse, kullanıcı bu saklı yordamın meta verilerini görüntüleyemez.

Başka bir örnek olarak, bir kullanıcıya çeşitli rol üyelikleri aracılığıyla mümkün olduğu üzere bir saklı yordam üzerinde EXECUTE izni hem verilmiş hem de reddedilmişse, DENY öncelikli olur ve kullanıcı saklı yordamın meta verilerini görüntüleyemez.

Alt bileşen meta verilerinin görünürlüğü

Dizinler, denetim kısıtlamaları ve tetikleyiciler gibi alt bileşenlerinin görünürlüğü üst öğedeki izinlerle belirlenir. Bu alt bileşenlerin verilebilir izinleri yoktur. Örneğin, bir kullanıcıya tablo üzerinde bazı izinler verilmişse, kullanıcı tablolar, sütunlar, dizinler, denetim kısıtlamaları, tetikleyiciler ve diğer alt bileşenler için meta verileri görüntüleyebilir. Başka bir örnek, belirli bir tablonun yalnızca tek bir sütununu vermektir SELECT : Bu, izni verenin tüm sütunlar dahil olmak üzere tüm tablonun meta verilerini görüntülemesine olanak tanır. Bunu düşünmenin bir yolu şu ki, VIEW DEFINITION izin yalnızca varlık düzeyinde (bu durumda tablo düzeyinde) çalışır ve alt varlık listelerinde (sütunlar veya güvenlik ifadeleri gibi) kullanılamaz.

Aşağıdaki kod bu davranışı gösterir:

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;

Tüm veritabanı kullanıcıları tarafından erişilebilen meta veriler

Bazı meta verilerin belirli bir veritabanındaki tüm kullanıcılar tarafından erişilebilir olması gerekir. Örneğin, dosya gruplarının konfederasyon izinleri yoktur; bu nedenle, bir kullanıcıya dosya grubunun meta verilerini görüntüleme izni verilemiyor. Ancak, tablo oluşturabilen herhangi bir kullanıcının, ON <filegroup> deyiminin TEXTIMAGE_ON <filegroup> veya CREATE TABLE yan tümcelerini kullanabilmesi için dosya grubu meta verilerine erişebilmesi gerekir.

DB_ID() ve DB_NAME() işlevleri tarafından döndürülen meta veriler tüm kullanıcılar tarafından görülebilir.

Bu, genel rolüne açık olan katalog görünümlerinin listesidir.

  • 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