Microsoft® ให้ความสำคัญกับความปลอดภัยใน SQL Server® และเกือบทุกรุ่นมีการปรับปรุงคุณลักษณะที่มีอยู่หรือได้แนะนำคุณลักษณะด้านความปลอดภัยใหม่ ใน SQL Server 2016 Microsoft ได้เปิดตัวฟีเจอร์ความปลอดภัยใหม่มากมายที่ช่วยให้ผู้ใช้ปกป้องข้อมูลของตนได้ ซึ่งรวมถึง Row-Level Security, AlwaysEncrypted และ Dynamic Data Masking
แนะนำตัว
ในบล็อกที่แล้ว ฉันเขียนเกี่ยวกับการปิดบังข้อมูลแบบไดนามิกใน SQL Server 2016 ในบล็อกนี้ ฉันแนะนำคุณลักษณะ Row-Level Security (RLS) ซึ่งช่วยให้คุณควบคุมได้ว่าผู้ใช้รายใดสามารถเข้าถึงแถวในตารางได้ RLS ช่วยให้คุณดำเนินการจำกัดข้อมูลตามลักษณะของผู้ใช้ที่กำลังดำเนินการค้นหา RLS ช่วยให้คุณควบคุมการเข้าถึงข้อมูลได้อย่างง่ายดายด้วยความโปร่งใสสำหรับผู้ใช้ที่แตกต่างกัน
ความต้องการ RLS
มีบางครั้งที่เราจำเป็นต้องส่งคืนเฉพาะข้อมูลที่เลือกไปยังผู้ใช้ที่ได้รับการคัดเลือก ในอดีต เราทำโดยการสร้างมุมมองและให้สิทธิ์ผู้ใช้เลือกการอนุญาตในมุมมองเหล่านั้น อย่างไรก็ตาม วิธีการดังกล่าวไม่สามารถจัดการได้ด้วยจำนวนการดูที่จำเป็นเพื่อรองรับปริมาณข้อมูลที่เพิ่มขึ้นและจำนวนผู้ใช้ ดังนั้น Microsoft จึงแนะนำ RLS เพื่อให้เป็นไปตามข้อกำหนดด้านความปลอดภัยในสถานการณ์ใหม่
RLS ช่วยให้สามารถควบคุมการเข้าถึงแถวในตารางได้อย่างละเอียด ทำให้คุณควบคุมได้อย่างง่ายดายว่าผู้ใช้รายใดสามารถเข้าถึงข้อมูลใดของแอปพลิเคชันได้ด้วยความโปร่งใสอย่างสมบูรณ์
ด้วยคุณลักษณะนี้ แถวจะถูกกรองตามบริบทการดำเนินการของแบบสอบถาม แทนที่จะเป็นสิทธิ์การเข้าถึงของผู้ใช้ปัจจุบัน คุณสามารถสร้างกฎตรรกะที่ปลอดภัยเพื่อกำหนดว่าผู้ใช้รายใดสามารถดูแถวใดและจำกัดแถว (หรือข้อมูล) โดยการออกแบบนโยบายความปลอดภัยที่ยืดหยุ่นและมีประสิทธิภาพสำหรับตารางดังที่แสดงในภาพต่อไปนี้:
ที่มาของรูปภาพ: https://sqlwithmanoj.com/2015/07/13/implementing-row-level-security-rls-with-sql-server-2016/
คุณสมบัติ RLS
RLS มีคุณสมบัติดังต่อไปนี้:
- บทบาทการเข้าถึงแบบละเอียด (ควบคุมทั้งการเข้าถึงแบบอ่านและเขียนสำหรับแถวที่ระบุ)
- ความโปร่งใสของแอปพลิเคชัน (ไม่จำเป็นต้องเปลี่ยนแปลงแอปพลิเคชัน)
- รวมศูนย์การเข้าถึงภายในฐานข้อมูล
- ง่ายต่อการใช้งานและบำรุงรักษา
วิธีการทำงานของ RLS
ในการนำ RLS ไปใช้ คุณต้องพิจารณาองค์ประกอบต่อไปนี้:
- ฟังก์ชันเพรดิเคต
- ภาคแสดงการรักษาความปลอดภัย
- นโยบายความปลอดภัย
ส่วนต่อไปนี้จะอธิบายรายการเหล่านี้
ฟังก์ชันเพรดิเคต
ฟังก์ชันเพรดิเคตคือฟังก์ชันค่าตารางในบรรทัดที่ตรวจสอบว่า auser ดำเนินการแบบสอบถามมีสิทธิ์เข้าถึงข้อมูลตามตรรกะที่กำหนดไว้หรือไม่ ฟังก์ชันนี้ส่งคืน 1
สำหรับแต่ละแถวที่ผู้ใช้สามารถเข้าถึงได้
เพรดิเคตความปลอดภัย
เพรดิเคตความปลอดภัยช่วยในการโยงฟังก์ชันเพรดิเคตกับตาราง RLS รองรับเพรดิเคตการรักษาความปลอดภัยสองประเภท:เพรดิเคตตัวกรองและเพรดิเคตแบบบล็อก เพรดิเคตตัวกรองจะกรองข้อมูลโดยไม่แสดงข้อผิดพลาดใดๆ สำหรับการดำเนินการต่อไปนี้ตามตรรกะที่กำหนดไว้ในฟังก์ชันเพรดิเคต
SELECT
UPDATE
DELETE
เพรดิเคตบล็อกทำให้เกิดข้อผิดพลาดอย่างชัดเจนและบล็อกผู้ใช้จากการดำเนินการต่อไปนี้กับข้อมูลที่ละเมิดตรรกะของฟังก์ชันเพรดิเคต:
AFTER INSERT
AFTER UPDATE
BEFORE UPDATE
BEFORE DELETE
นโยบายความปลอดภัย
ออบเจ็กต์นโยบายความปลอดภัยจะถูกสร้างขึ้นสำหรับ RLS ซึ่งจัดกลุ่มการรักษาความปลอดภัยทั้งหมดที่อ้างถึงฟังก์ชันเพรดิเคต
กรณีการใช้งาน
ต่อไปนี้คือตัวอย่างการออกแบบบางส่วนของวิธีใช้ RLS:
- โรงพยาบาลสามารถสร้างนโยบายความปลอดภัยที่อนุญาตให้พยาบาลดูแถวข้อมูลสำหรับผู้ป่วยได้เท่านั้น
- ธนาคารสามารถสร้างนโยบายเพื่อจำกัดการเข้าถึงแถวข้อมูลทางการเงินตามแผนกธุรกิจของพนักงานหรือบทบาทของบริษัท
- แอปพลิเคชันหลายผู้เช่าสามารถสร้างนโยบายเพื่อบังคับใช้การแยกทางตรรกะของแถวข้อมูลของผู้เช่าแต่ละรายจากแถวของผู้เช่ารายอื่นทุกแถว เนื่องจากผู้เช่า data formany ถูกเก็บไว้ในตารางเดียว กระบวนการจึงมีประสิทธิภาพมากขึ้น ผู้เช่าแต่ละรายสามารถดูได้เฉพาะแถวข้อมูลเท่านั้น
ใช้ RLS
ต่อไปนี้เป็นตัวอย่างวิธีการใช้ RLS:
ขั้นตอนที่ 1:เรียกใช้รหัสต่อไปนี้เพื่อสร้างฐานข้อมูล RowFilter
และผู้ใช้สองคนที่จะทดสอบด้วย:
CREATE DATABASE RowFilter;
GO
USE RowFilter;
GO
CREATE USER userBrian WITHOUT LOGIN;
CREATE USER userJames WITHOUT LOGIN;
GO
ขั้นตอนที่ 2:เรียกใช้รหัสต่อไปนี้เพื่อสร้างตารางพร้อมตัวอย่างและให้สิทธิ์ SELECT แก่ผู้ใช้ใหม่:
CREATE TABLE dbo.SalesFigures (
[userCode] NVARCHAR(10),
[sales] MONEY)
GO
INSERT INTO dbo.SalesFigures
VALUES ('userBrian',100), ('userJames',250), ('userBrian',350)
GO
GRANT SELECT ON dbo.SalesFigures TO userBrian
GRANT SELECT ON dbo.SalesFigures TO userJames
GO
ขั้นตอนที่ 3:เรียกใช้โค้ดต่อไปนี้เพื่อเพิ่มฟังก์ชันเพรดิเคตตัวกรอง:
CREATE FUNCTION dbo.rowLevelPredicate (@userCode as sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS rowLevelPredicateResult
WHERE @userCode = USER_NAME();
GO
ขั้นตอนที่ 4:เรียกใช้โค้ดต่อไปนี้เพื่อเพิ่มเพรดิเคตตัวกรองลงในตารางdbo.Sales Figures :
CREATE SECURITY POLICY UserFilter
ADD FILTER PREDICATE dbo.rowLevelPredicate(userCode)
ON dbo.SalesFigures
WITH (STATE = ON);
GO
ขั้นตอนที่ 5:เรียกใช้รหัสต่อไปนี้เพื่อทดสอบผลลัพธ์กับผู้ใช้ที่เพิ่มในขั้นตอนที่ 2:
EXECUTE AS USER = 'userBrian';
SELECT * FROM dbo.SalesFigures;
REVERT;
GO
รหัสนี้ส่งคืนสองแถวดังที่แสดงด้านล่าง:
(/article/uploadfiles/202207/2022070812111051.png)
EXECUTE AS USER = 'userJames';
SELECT * FROM dbo.SalesFigures;
REVERT;
GO
รหัสนี้ส่งคืนหนึ่งแถวดังที่แสดงด้านล่าง:
(/article/uploadfiles/202207/2022070812111024.png)
การอนุญาต
การสร้าง แก้ไข หรือยกเลิกนโยบายการรักษาความปลอดภัยต้องมี แก้ไขนโยบายความปลอดภัย ขออนุญาต
การสร้างหรือวางนโยบายความปลอดภัยต้องใช้ ALTER อนุญาตในสคีมา
นอกจากนี้ เพรดิเคตแต่ละเพรดิเคตต้องการการอนุญาตต่อไปนี้ ซึ่งถูกเพิ่ม:
- การ เลือก และข้อมูลอ้างอิง สิทธิ์ในฟังก์ชันที่ใช้ asa เพรดิเคต
- ข้อมูลอ้างอิง อนุญาตบนตารางเป้าหมายที่ผูกไว้กับนโยบาย
- ข้อมูลอ้างอิง การอนุญาตในทุกคอลัมน์จากตารางเป้าหมายใช้อาร์กิวเมนต์
นโยบายความปลอดภัยนำไปใช้กับผู้ใช้ทุกคน รวมถึงผู้ใช้ฐานข้อมูล (DBO) ในฐานข้อมูล ผู้ใช้ DBO สามารถเปลี่ยนแปลงหรือยกเลิกนโยบายความปลอดภัยได้ อย่างไรก็ตาม สามารถตรวจสอบการเปลี่ยนแปลงนโยบายความปลอดภัยได้ กรณีผู้ใช้ที่มีสิทธิพิเศษสูง เช่น sysadmin
หรือ db_owner
คุณต้องดูแถวทั้งหมดเพื่อแก้ไขปัญหาหรือตรวจสอบข้อมูล ดังนั้นคุณต้องเขียนนโยบายความปลอดภัยเพื่ออนุญาต
หากนโยบายความปลอดภัยถูกสร้างขึ้นด้วย SCHEMABINDING = OFF
ดังนั้นผู้ใช้จะต้องมีSELECT
หรือ EXECUTE
การอนุญาตบนฟังก์ชันเพรดิเคตและตารางเพิ่มเติม มุมมอง หรือฟังก์ชันใดๆ ที่ใช้ภายในฟังก์ชันเพรดิเคตเพื่อค้นหาตารางเป้าหมาย หากนโยบายความปลอดภัยถูกสร้างขึ้นด้วย SCHEMABINDING = ON
ซึ่งเป็นค่าเริ่มต้น การตรวจสอบสิทธิ์เหล่านี้จะถูกข้ามไปเมื่อผู้ใช้ค้นหาตารางเป้าหมาย
กำลังแก้ไข SQL Server 2016 RLS
ดำเนินการต่อไปนี้เพื่อปิดใช้งาน SQL Server RLS สำหรับนโยบาย:
- แก้ไขนโยบายความปลอดภัย UseFilter ด้วย
State = off
.
ดำเนินการดังต่อไปนี้เพื่อยกเลิกตัวกรองและนโยบายความปลอดภัย:
- วางนโยบายความปลอดภัย UseFilter .
- ฟังก์ชันวาง dbo.rowlevelPredicate .
แนวทางปฏิบัติที่ดีที่สุด
Microsoft แนะนำแนวทางปฏิบัติที่ดีที่สุดเหล่านี้:
- เราขอแนะนำให้คุณสร้างสคีมาแยกต่างหากสำหรับออบเจ็กต์ RLS (ฟังก์ชันเพรดิเคตและนโยบายความปลอดภัย)
- แก้ไขนโยบายความปลอดภัยใดๆ การอนุญาตมีไว้สำหรับผู้ใช้ที่มีสิทธิพิเศษสูง (เช่น ผู้จัดการนโยบายความปลอดภัย) ตัวจัดการนโยบายความปลอดภัยไม่ต้องการ เลือก ได้รับอนุญาตบนโต๊ะที่พวกเขาปกป้อง
- หลีกเลี่ยงการแปลงประเภทในฟังก์ชันเพรดิเคตเพื่อหลีกเลี่ยงข้อผิดพลาดรันไทม์ที่อาจเกิดขึ้น
- หลีกเลี่ยงการเรียกซ้ำในฟังก์ชันเพรดิเคตทุกที่ที่ทำได้เพื่อหลีกเลี่ยงการลดประสิทธิภาพ ตัวเพิ่มประสิทธิภาพแบบสอบถามพยายามตรวจหาการเรียกซ้ำโดยตรง อย่างไรก็ตาม ไม่รับประกันว่าจะพบการเรียกซ้ำทางอ้อม (เช่น เมื่อฟังก์ชันที่สองเรียกใช้ฟังก์ชันเพรดิเคต)
- หลีกเลี่ยงการใช้การรวมตารางมากเกินไปในฟังก์ชันเพรดิเคตเพื่อเพิ่มประสิทธิภาพสูงสุด
ข้อจำกัดและข้อจำกัดใน RLS
ต่อไปนี้เป็นข้อจำกัดบางประการที่ใช้กับ RLS:
- ต้องสร้างฟังก์ชันเพรดิเคตด้วย
SCHEMABINDING
. หากฟังก์ชันถูกสร้างขึ้นโดยไม่มีSCHEMABINDING
และคุณพยายามผูกมัดกับนโยบายความปลอดภัย มันส่งข้อผิดพลาด - ไม่สามารถสร้างมุมมองที่จัดทำดัชนีในตารางที่ใช้ RLS ได้
- ตารางในหน่วยความจำไม่ได้รับการสนับสนุนสำหรับ RLS
- ไม่รองรับดัชนีข้อความแบบเต็ม
บทสรุป
ด้วยคุณลักษณะ RLS ใน SQL Server 2016 คุณสามารถรักษาความปลอดภัยให้กับระเบียนที่ระดับฐานข้อมูลโดยไม่ต้องทำการเปลี่ยนแปลงในระดับแอปพลิเคชัน คุณสามารถใช้ RLS ได้โดยใช้ฟังก์ชันเพรดิเคตและฟีเจอร์นโยบายความปลอดภัยใหม่ควบคู่ไปกับโค้ดที่มีอยู่ โดยไม่จำเป็นต้องเปลี่ยนโค้ด DataManipulation Language (DML) ในฐานข้อมูลของคุณ
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม
เพิ่มประสิทธิภาพสภาพแวดล้อมของคุณด้วยการดูแลระบบ การจัดการ และการกำหนดค่าจากผู้เชี่ยวชาญ
บริการแอปพลิเคชันของ Rackspace(RAS) ผู้เชี่ยวชาญจะให้บริการแบบมืออาชีพและที่มีการจัดการในแอปพลิเคชันที่หลากหลาย:
- แพลตฟอร์มอีคอมเมิร์ซและประสบการณ์ดิจิทัล
- การวางแผนทรัพยากรองค์กร (ERP)
- ระบบธุรกิจอัจฉริยะ
- การจัดการลูกค้าสัมพันธ์ของ Salesforce (CRM)
- ฐานข้อมูล
- อีเมลโฮสติ้งและประสิทธิภาพการทำงาน
เราจัดส่ง:
- ความเชี่ยวชาญที่เป็นกลาง :เราลดความซับซ้อนและเป็นแนวทางในการสร้างสรรค์สิ่งใหม่ของคุณ โดยมุ่งเน้นที่ความสามารถที่มอบคุณค่าในทันที
- ประสบการณ์สุดคลั่ง ™:เรารวมกระบวนการก่อน เทคโนโลยีที่สอง®แนวทางพร้อมการสนับสนุนทางเทคนิคเฉพาะเพื่อมอบโซลูชันที่ครอบคลุม
- ผลงานที่ยอดเยี่ยม :เราใช้ประสบการณ์ระบบคลาวด์ที่ครอบคลุมเพื่อช่วยคุณเลือกและปรับใช้เทคโนโลยีที่เหมาะสมบนระบบคลาวด์ที่เหมาะสม
- ส่งไว :เราพบคุณในที่ที่คุณอยู่ในการเดินทางของคุณและปรับความสำเร็จของเราไปพร้อมกับคุณ
แชทเลยเพื่อเริ่มต้น