การให้สิทธิ์ ALTER TABLE ได้รับอันตรายอย่างไร


11

ลองนึกภาพสถานการณ์ต่อไปนี้

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');

ณ จุดหนึ่งกระบวนการ ETL จะถูกเขียนที่ดำเนินการบางกิจกรรมในtestฐานข้อมูล

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 ไม่ควรมีสิทธิ์ในCustomerตาราง (และแน่นอนว่าไม่ใช่SensitiveDataคอลัมน์) ดังนั้นสิ่งเหล่านี้จึงถูกปฏิเสธอย่างชัดเจนด้านบน

กระบวนการ ETL จะตัดทอนdbo.StagingTableดังนั้นจะได้รับALTERสิทธิ์ในตารางนั้น

สิ่งนี้ถูกตั้งค่าสถานะระหว่างการตรวจสอบความปลอดภัย สถานการณ์นี้อันตรายแค่ไหน?


ทำไมการกระทำที่ไม่เป็นอันตรายเช่น ALTER TABLE ADD COLUMN จึงได้รับการปฏิบัติเช่นเดียวกับการกระทำอื่น (ALTER, DROP, ข้อ จำกัด , ทริกเกอร์)?
smci

คำตอบ:


16

ค่อนข้างอันตราย ...

นอกจากสิทธิ์ที่ชัดเจนในการเปลี่ยนโครงสร้างของStagingTableตัวเองแล้วการALTER TABLEอนุญาตให้สร้างทริกเกอร์บนตาราง ดังนั้นในกรณีนี้ผ่านการผูกมัดความเป็นเจ้าของพวกเขาจะสามารถดูข้อมูลลูกค้าที่ละเอียดอ่อน (แม้จะมีDENYสิทธิ์ชัดเจน) และดำเนินการป่าเถื่อนในตารางที่สองนี้

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

นอกเหนือจากความสามารถในการเพิ่มทริกเกอร์แล้วการอนุญาตALTER TABLEยังอนุญาตให้:

  1. ปิดการใช้งานทริกเกอร์ (หลีกเลี่ยงเส้นทางการตรวจสอบ)
  2. ปิดการใช้งานข้อ จำกัด (การอนุญาตสำหรับข้อมูลที่ไม่ถูกต้อง)
  3. การเปลี่ยนแปลงข้อ จำกัด (การอนุญาตสำหรับข้อมูลที่ไม่ถูกต้อง)
  4. การเปลี่ยนแปลงคำจำกัดความคอลัมน์ (เปลี่ยนประเภทข้อมูลขนาดสูงสุด NULLability)
  5. เพิ่มคอลัมน์จากการคำนวณที่เรียกใช้ T-SQL UDF (ทำให้ยากมากที่จะได้รับแผนคู่ขนานซึ่งอาจส่งผลเสียต่อประสิทธิภาพการทำงานได้อย่างง่ายดาย)

นอกจากนี้ยังอนุญาตให้ลบคอลัมน์ แต่ไม่น่าเป็นไปได้ที่จะไม่มีใครสังเกตเห็น (เนื่องจากดูเหมือนว่าเรากำลังมองหาการกระทำที่อาจเกิดขึ้นที่นี่ซึ่งหลอกลวงมากกว่าอันตราย)

โชคดีที่มันไม่จำเป็นที่จะให้สิทธิ์กับทุกคนและไม่จำเป็นต้องห่อมันไว้ในโพรซีเดอร์ที่เก็บไว้ซึ่งใช้ส่วนEXECUTE ASคำสั่ง (ตามด้วย'dbo'หรือตามปกติOWNER) การลงนามโมดูลช่วยให้การดำเนินการที่เป็นนามธรรมของรหัสที่ลงนามนั้นเป็นไปได้ง่าย (ขั้นตอนการจัดเก็บทริกเกอร์ UDF แบบสเกลาร์และ TVF แบบหลายคำสั่ง) ฉันมีโค้ดตัวอย่างที่แสดงวิธีการทำสิ่งนี้ให้สำเร็จในคำตอบต่อไปนี้ที่ DBA.SE:

ความแตกต่างระหว่างสองคำตอบคือการอนุญาตที่มอบให้กับผู้ใช้แบบอิงลายเซ็น สิทธิ์ที่จะได้รับ (หรือบทบาท DB ที่จะเพิ่ม) ขึ้นอยู่กับขอบเขตของสิ่งที่จำเป็น หากคุณต้องการการอนุญาตสำหรับตารางเดียวจากนั้นอนุญาตเฉพาะALTERในตารางนั้น หากจำเป็นต้องได้รับอนุญาตสำหรับตารางทั้งหมดใน Schema ที่ระบุดังนั้นอย่าให้สิทธิ์กับแต่ละตาราง แต่ให้สิทธิ์กับ Schema แทน และอื่น ๆ

การเซ็นชื่อโมดูลเป็นขั้นตอนพิเศษบางอย่างเมื่อเปรียบเทียบกับการสร้างสคีมาโดยเฉพาะสำหรับผู้ใช้ ETL หรือใช้ส่วนEXECUTE ASคำสั่ง แต่:

  1. เป็นเพียงการคัดลอกและวางแบบง่าย ๆ เท่านั้นเนื่องจากรหัสนั้นมีอยู่ในทั้งคำตอบที่ลิงก์ด้านบนและ
  2. เป็นตัวเลือกที่ปลอดภัยที่สุดอย่างแน่นอน อนุญาตเฉพาะการดำเนินการดังกล่าวผ่านชิ้นส่วนของรหัสนั้นและเฉพาะกับผู้ที่ได้รับEXECUTEอนุญาตให้ใช้รหัสนั้น การเป็นเจ้าของสคีมานั้นอนุญาตสิทธิ์บางอย่างที่ไม่จำเป็น และใช้EXECUTE AS 'dbo'หรือEXECUTE AS OWNER(สมมติว่าเจ้าของจะdbo) จะให้กระบวนการทั้งหมดจากจุดข้างหน้าว่าdboสิทธิ์ไม่ได้เป็นเพียงการจัดเก็บ / ทริกเกอร์ / ฟังก์ชั่นที่คุณใช้EXECUTE ASกับ การเซ็นชื่อโมดูล จำกัด สิทธิ์เฉพาะรหัสที่คุณเซ็นชื่อเท่านั้นและไม่ใช่รหัสใด ๆ ที่ถูกเรียกโดยรหัสที่เซ็นชื่อ

2
ด้วยระบบบางระบบ (อย่างน้อย MySQL บางรุ่น) มีวิธีที่น่าสะพรึงกลัวอย่างแท้จริงในการกำจัดคอลัมน์ VARCHAR ได้อย่างมีประสิทธิภาพโดยที่ไม่ได้สังเกตเห็นได้ทันทีโดยโปรแกรมที่ผิดพลาดลดขนาดเป็น 0 สิ่งนี้จะเคลียร์และทิ้งสิ่งที่เขียนไป มัน ...
rackandboneman

2

แนวทางปฏิบัติที่ดีกว่าคือการสร้างสคีมาชั่วคราวซึ่งเป็นเจ้าของโดยผู้ใช้ ETL จากนั้นกระบวนการ ETL สามารถตัดทอนตารางปิดการใช้งานข้อ จำกัด ทำการสลับพาร์ติชันและอื่น ๆ ภายในสคีมาชั่วคราว ผู้ใช้ ETL จะต้องได้รับอนุญาตอย่าง จำกัด ในสคีมาอื่น ๆ

คุณยังสามารถใช้บทบาทฐานข้อมูลแทนผู้ใช้คนเดียว

แน่นอนคุณยังสามารถทำให้ผู้ใช้ที่ จำกัด ของคุณทำการตัดทอนตารางด้วยโพรซีเดอร์ที่จัดเก็บแบบ dbo ที่เป็นเจ้าของเช่นนี้:

create procedure truncate_t 
with execute as owner
as
begin
  truncate table t;
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.