Aracılığıyla paylaş


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)

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ı veya SELECT tablosunda INSERTgibi myTable 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 üzerinde myTableizni 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 izin verebilir veya SQL Server 2022 (16.x) ve sonraki sürümlerde VIEW SECURITY DEFINITION uygun bir kapsamda: VIEW PERFORMANCE DEFINITION nesne düzeyi, veritabanı düzeyi veya sunucu düzeyi. Bu nedenle, önceki örnekte çağıranın VIEW DEFINITION üzerinde myTableizni varsa saklı yordam bir satır döndürür. Daha fazla bilgi için bkz. GRANT ve GRANT Database Permissions.

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. AS YÜRÜTME.

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. Hata iletilerinin ters olması ve hata ayıklama amacıyla kullanılması zor olabilir. 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 izni reddedilmemiş VIEW DEFINITION ve nesne üzerinde , CONTROLveya ALTER izni varTAKE OWNERSHIP. Diğer tüm kullanıcılar görür NULL.

  • 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. sql server 2022 (16.x) ve sonraki sürümlerinde veya olmayan CONTROL SERVERbir kullanıcı, VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION izin bu sütunda bir NULL değer görür.

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

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ı
  • Önceliği: DENY
  • 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

İzin UNMASK meta veri görünürlüğünü etkilemez: tek başına vermek UNMASK meta verileri açıklamaz. UNMASK her zaman herhangi bir etkiye sahip olmak için bir SELECT izin eşlik etmesi gerekir. Örnek: Veritabanı kapsamında verme UNMASK ve tek bir tabloda verme işlemi SELECT , kullanıcının yalnızca seçebileceği tek tek tablonun meta verilerini görebileceği sonucuna sahiptir.

Reddet Ö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ıya şema üzerinde izin verilmeyen EXECUTE ancak bu şemadaki saklı yordam üzerinde izin verilmişse EXECUTE , kullanıcı söz konusu saklı yordamın meta verilerini görüntüleyemez.

Başka bir örnek için, kullanıcıya çeşitli rol üyelikleriniz EXECUTE aracılığıyla mümkün olan saklı yordam üzerinde izin verildiyse ve izin reddedildiyse DENY öncelik kazanır 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şenlere izin verilmektedir. Ö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, iznin VIEW DEFINITION yalnızca varlık düzeyinde (bu örnekteki tablo) çalışması ve Alt Girdi listelerinde (sütun veya güvenlik ifadeleri gibi) kullanılamamasıdır.

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 tüm kullanıcıların deyiminin ON <filegroup> veya TEXTIMAGE_ON <filegroup> yan tümcelerini kullanabilmesi için dosya grubu meta verilerine erişebilmesi CREATE TABLE gerekir.

ve DB_ID() işlevleri tarafından DB_NAME() 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