Seberapa berbahaya pemberian izin ALTER TABLE?

11

Bayangkan skenario berikut

CREATE DATABASE test

GO

USE test;    

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

INSERT INTO dbo.Customer
VALUES     (1,'[email protected]','12346789');

Pada titik tertentu proses ETL ditulis yang melakukan beberapa kegiatan dalam testdatabase.

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 seharusnya tidak memiliki izin ke Customertabel (dan tentu saja tidak ke SensitiveDatakolom) sehingga ini secara eksplisit ditolak di atas.

Proses ETL memotong dbo.StagingTablesehingga diberikan ALTERizin tabel itu.

Ini ditandai selama audit keamanan. Seberapa berbahaya skenario ini?

Martin Smith
sumber
Mengapa tindakan yang relatif tidak berbahaya seperti ALTER TABLE ADD COLUMN diperlakukan sama seperti tindakan lainnya (ALTER, DROP, kendala, pemicu)?
smci

Jawaban:

16

Sangat berbahaya ...

Selain izin yang jelas untuk mengubah struktur StagingTableitu sendiri, ALTER TABLEizin memungkinkan mereka untuk membuat pemicu di atas meja. Jadi dalam hal ini melalui rantai kepemilikan, mereka dapat melihat data pelanggan yang sensitif (terlepas dari DENYizin eksplisit ) dan melakukan vandalisme pada tabel kedua ini.

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
Martin Smith
sumber
8

Selain dapat menambahkan pemicu, izin ALTER TABLE juga memungkinkan untuk:

  1. Menonaktifkan pemicu (hindari jejak audit)
  2. Nonaktifkan kendala (memungkinkan data buruk)
  3. Mengubah kendala (memungkinkan data buruk)
  4. Mengubah definisi kolom (ubah tipe data, ukuran maks, NULLabilitas)
  5. Tambahkan kolom terkomputasi yang memanggil T-SQL UDF (membuatnya sangat sulit untuk mendapatkan rencana paralel, yang dapat dengan mudah merusak kinerja)

Itu juga memungkinkan untuk menghapus kolom, tetapi itu tidak mungkin tidak diketahui (karena tampaknya kita mencari tindakan potensial di sini yang lebih menipu daripada jahat).

Untungnya, tidak pernah perlu untuk memberikan izin ini kepada siapa pun, juga tidak perlu membungkus ini dalam prosedur tersimpan yang menggunakan EXECUTE ASklausa (biasanya diikuti oleh 'dbo'atau OWNER). Penandatanganan Modul memungkinkan abstraksi mudah dari tindakan istimewa di balik kode yang ditandatangani (prosedur tersimpan, pemicu, UDF skalar, dan TVF multi-pernyataan). Saya memiliki contoh kode yang menunjukkan bagaimana menyelesaikan ini dalam jawaban berikut, di sini di DBA.SE:

Perbedaan antara kedua jawaban itu adalah izin yang diberikan kepada Pengguna berbasis tanda tangan. Izin untuk diberikan (atau Peran DB untuk ditambahkan) tergantung pada ruang lingkup apa yang dibutuhkan. Jika Anda hanya perlu izin untuk satu tabel, maka berikan saja ALTERpada tabel itu. Jika diperlukan izin untuk semua tabel dalam Skema tertentu, maka jangan berikan izin ke tabel individual, tetapi sebaliknya berikan izin untuk Skema itu sendiri. Dan seterusnya.

Penandatanganan modul adalah beberapa langkah tambahan dibandingkan dengan membuat skema khusus untuk pengguna ETL, atau menggunakan EXECUTE ASklausa, tetapi:

  1. itu benar-benar hanya salin dan tempel mengingat kode tersedia dalam kedua jawaban yang ditautkan di atas, dan
  2. itu tentu saja pilihan paling aman yang tersedia. Ini hanya memungkinkan operasi melalui potongan kode itu, dan hanya untuk mereka yang diberi EXECUTEizin untuk kode itu. Menjadi pemilik Skema memungkinkan izin implisit tertentu yang tidak perlu. Dan, menggunakan EXECUTE AS 'dbo'atau EXECUTE AS OWNER(dengan asumsi pemilik dbo) akan memberikan seluruh proses , sejak saat itu, dboizin, bukan hanya prosedur / pemicu / fungsi tersimpan yang Anda gunakan EXECUTE AS. Penandatanganan modul membatasi izin hanya pada kode yang Anda tanda tangani, dan bukan kode apa pun yang dipanggil oleh kode yang ditandatangani.
Solomon Rutzky
sumber
2
Dengan beberapa sistem (setidaknya beberapa versi MySQL) ada cara yang benar-benar pengecut untuk secara efektif melenyapkan kolom VARCHAR tanpa langsung diketahui oleh program yang salah: kurangi ukurannya menjadi 0. Ini akan menghapusnya, dan secara diam-diam membuang apa pun yang ditulis untuk itu ...
rackandboneman
2

Praktik yang lebih baik adalah membuat skema pementasan, yang dimiliki oleh pengguna ETL. Kemudian proses ETL dapat memotong tabel, menonaktifkan batasan, melakukan switching partisi, dll dalam skema pementasan. Pengguna ETL hanya perlu izin terbatas pada skema lain.

Anda juga dapat menggunakan peran basis data alih-alih satu pengguna.

Tentu saja Anda juga dapat mengaktifkan pengguna terbatas Anda untuk melakukan pemotongan tabel dengan prosedur tersimpan milik dbo, seperti ini:

create procedure truncate_t 
with execute as owner
as
begin
  truncate table t;
end
David Browne - Microsoft
sumber