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 test
database.
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 Customer
tabel (dan tentu saja tidak ke SensitiveData
kolom) sehingga ini secara eksplisit ditolak di atas.
Proses ETL memotong dbo.StagingTable
sehingga diberikan ALTER
izin tabel itu.
Ini ditandai selama audit keamanan. Seberapa berbahaya skenario ini?
sql-server
permissions
Martin Smith
sumber
sumber
Jawaban:
Sangat berbahaya ...
Selain izin yang jelas untuk mengubah struktur
StagingTable
itu sendiri,ALTER TABLE
izin memungkinkan mereka untuk membuat pemicu di atas meja. Jadi dalam hal ini melalui rantai kepemilikan, mereka dapat melihat data pelanggan yang sensitif (terlepas dariDENY
izin eksplisit ) dan melakukan vandalisme pada tabel kedua ini.sumber
Selain dapat menambahkan pemicu, izin ALTER TABLE juga memungkinkan untuk:
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 AS
klausa (biasanya diikuti oleh'dbo'
atauOWNER
). 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
ALTER
pada 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 AS
klausa, tetapi:EXECUTE
izin untuk kode itu. Menjadi pemilik Skema memungkinkan izin implisit tertentu yang tidak perlu. Dan, menggunakanEXECUTE AS 'dbo'
atauEXECUTE AS OWNER
(dengan asumsi pemilikdbo
) akan memberikan seluruh proses , sejak saat itu,dbo
izin, bukan hanya prosedur / pemicu / fungsi tersimpan yang Anda gunakanEXECUTE AS
. Penandatanganan modul membatasi izin hanya pada kode yang Anda tanda tangani, dan bukan kode apa pun yang dipanggil oleh kode yang ditandatangani.sumber
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:
sumber