ALTER TABLE iznini vermek ne kadar tehlikelidir?


11

Aşağıdaki senaryoyu düşünün

CREATE DATABASE test

GO

USE test;    

CREATE TABLE dbo.Customer
  (
     CustomerId   INT,
     Email        VARCHAR(100),
     SensitiveData VARCHAR(20)
  );

INSERT INTO dbo.Customer
VALUES     (1,'abc@foo.com','12346789');

Bir noktada, testveritabanında bazı faaliyetleri gerçekleştiren bir ETL süreci yazılır .

CREATE USER etlUser WITHOUT LOGIN; /*For demo purposes*/

CREATE TABLE dbo.StagingTable
  (
     StagingTableId INT,
     SomeData       VARCHAR(100),
  )

GRANT UPDATE,INSERT,DELETE,SELECT,ALTER ON dbo.StagingTable TO etlUser;

DENY SELECT ON dbo.Customer TO etlUser;
DENY SELECT ON dbo.Customer (SensitiveData) TO etlUser; /*For good measure*/

EtlUser öğesinin Customertabloya (ve kesinlikle SensitiveDatasütuna değil ) izinleri olmamalıdır , bu nedenle bunlar yukarıda açıkça reddedilmiştir.

ETL işlemi kesilir, dbo.StagingTablebu nedenle ALTERtablo izinleri verilir .

Bu, bir güvenlik denetimi sırasında işaretlenir. Bu senaryo ne kadar tehlikeli?


ALTER TABLE ADD COLUMN gibi nispeten zararsız eylemler neden diğer eylemlerle (ALTER, DROP, sınırlamalar, tetikleyiciler) aynı şekilde ele alınır?
smci

Yanıtlar:


16

Oldukça tehlikeli ...

Bariz iznine ek olarak yapısını değiştirmek StagingTablekendisi ALTER TABLEizni onları masaya tetikleyicileri oluşturmanıza olanak sağlar. Dolayısıyla bu durumda sahiplik zincirleme yoluyla hem hassas müşteri verilerini görebilir (açık DENYizinlere rağmen ) hem de bu ikinci tabloda vandalizm yapabilirler.

EXECUTE AS user='etlUser'

GO

CREATE OR ALTER TRIGGER TR ON dbo.StagingTable AFTER UPDATE AS 
/*Exposure of sensitive data*/
SELECT * FROM dbo.Customer;

/*Vandalism*/
DELETE FROM dbo.Customer;

go

--Fire the trigger
UPDATE dbo.StagingTable SET SomeData = SomeData WHERE 1=0;

REVERT

8

Tetikleyici ekleyebilmenin yanı sıra, ALTER TABLE izni şunları da sağlar:

  1. Tetikleyicileri devre dışı bırakma (denetim izinden kaçının)
  2. Kısıtlamaları devre dışı bırak (kötü verilere izin verilmesi)
  3. Kontrendikasyonları değiştirmek (kötü verilere izin vermek)
  4. Sütun tanımlarını değiştirme (veri türünü değiştirme, maks. Boyut, BOŞLUK)
  5. T-SQL UDF'yi çağıran hesaplanmış bir sütun ekleyin (performansa kolayca zarar verebilecek paralel bir plan almayı çok zorlaştırır)

Ayrıca sütunları kaldırmaya da izin verir, ancak bu fark edilmeyecek gibi görünmemektedir (çünkü burada kötü amaçlı yazılımlardan daha aldatıcı olan potansiyel eylemleri arıyoruz gibi görünüyor).

Neyse ki, bu izni asla kimseye vermek ya da EXECUTE ASmaddeyi kullanan (genellikle 'dbo'ya da tarafından takip edilen OWNER) saklı bir yordamda sarmak gerekli değildir . Modül İmzalama , imzalı kodun arkasındaki ayrıcalıklı eylemlerin (saklı yordamlar, tetikleyiciler, skaler UDF'ler ve çok ifadeli TVF'ler) kolayca çıkarılmasını sağlar. DBA.SE burada aşağıdaki cevaplar, bunu gerçekleştirmek için nasıl gösteren örnek kod var:

Bu iki cevap arasındaki fark, imza tabanlı Kullanıcıya verilen izindir. Verilecek izin (veya eklenecek DB Rolü) neyin gerekli olduğuna bağlıdır. Yalnızca tek bir tablo için izne ihtiyacınız varsa, yalnızca ALTERo tabloya verin. Belirli bir Şemadaki tüm tablolar için izin gerekiyorsa, tek tek tablolara izin vermeyin, bunun yerine Şema'nın kendisine izin verin. Ve bunun gibi.

Modül imzalama, özellikle ETL kullanıcısı için bir şema oluşturma veya EXECUTE ASyan tümcesi kullanma ile karşılaştırıldığında birkaç ek adımdır , ancak:

  1. kodun yukarıda bağlantılı her iki cevapta da mevcut olduğu göz önüne alındığında gerçekten basit bir kopyala yapıştır
  2. kesinlikle mevcut en güvenli seçenektir. Bu işleme yalnızca o kod parçası aracılığıyla ve yalnızca EXECUTEbu kod için izin verilenlere izin verir. Şema sahibi olmak, gereksiz bazı örtük izinlere izin verir. Ve, EXECUTE AS 'dbo'veya EXECUTE AS OWNER(sahibin olduğu varsayılarak dbo) kullanıldığında, yalnızca kullandığınız saklı yordam / tetikleyici / işlev değil , bu noktadan itibaren tüm süreçdbo izinler verilir EXECUTE AS. Modül imzalama, izinleri yalnızca imzaladığınız koda sınırlar, imzalı kod tarafından çağrılan herhangi bir koda değil.

2
Bazı sistemlerde (en azından bazı MySQL sürümleri), bir VARCHAR sütununu, hata yapan programlar tarafından anında fark edilmeden etkili bir şekilde yok etmenin gerçekten dasılsız bir yolu vardır: Bu, boyutu 0'a düşürür. it ...
rackandboneman

2

Daha iyi bir uygulama, ETL kullanıcısının sahip olduğu bir hazırlama şeması oluşturmak olacaktır. Daha sonra ETL işlemi, hazırlama şemasında tabloları kesebilir, kısıtlamaları devre dışı bırakabilir, bölüm değiştirme yapabilir, vb. ETL kullanıcısının diğer şemalarda yalnızca sınırlı izne ihtiyacı olacaktır.

Tek bir kullanıcı yerine veritabanı rolü de kullanabilirsiniz.

Elbette, sınırlı kullanıcınızın dbo'ya ait saklı yordamla tablo kesme işlemlerini gerçekleştirmesini de sağlayabilirsiniz, örneğin:

create procedure truncate_t 
with execute as owner
as
begin
  truncate table t;
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.