จัดการสิทธิ์และการเข้าถึงที่ปลอดภัย
สิทธิ์ระดับวัตถุจะควบคุมการกระทําที่ผู้ใช้สามารถทําได้กับวัตถุฐานข้อมูล เช่น ตาราง มุมมอง กระบวนงานที่เก็บไว้ และฟังก์ชัน ในขณะที่ Row-Level Security กรองข้อมูลภายในออบเจ็กต์ สิทธิ์ระดับออบเจ็กต์จะกําหนดว่าผู้ใช้สามารถเข้าถึงออบเจ็กต์ได้เลยหรือไม่ และการดําเนินการใดที่พวกเขาสามารถทําได้
รูปแบบการอนุญาตที่ออกแบบมาอย่างดีจะควบคู่ไปกับการรับรองความถูกต้องที่ปลอดภัย หน่วยนี้ครอบคลุมทั้งสองอย่าง: วิธีการให้สิทธิ์ที่ถูกต้องและวิธีตรวจสอบให้แน่ใจว่าผู้ใช้ตรวจสอบสิทธิ์อย่างปลอดภัย
ทําความเข้าใจลําดับชั้นของสิทธิ์
SQL Server ใช้ แบบจําลองสิทธิ์ตามลําดับชั้น ที่สิทธิ์ที่ได้รับในระดับที่สูงขึ้นไหลลงไปยังระดับที่ต่ํากว่า คิดว่ามันเป็นน้ําตก: เซิร์ฟเวอร์→ฐานข้อมูล→สคีมา→วัตถุแต่ละรายการ
ในระดับเซิร์ฟเวอร์ สิทธิ์จะควบคุมการจัดการการลงชื่อเข้าใช้และการกําหนดค่าเซิร์ฟเวอร์ สิทธิ์ระดับฐานข้อมูลจะควบคุมการดําเนินการภายในฐานข้อมูลเฉพาะ สิทธิ์ระดับ Schema ใช้กับออบเจ็กต์ทั้งหมดภายใน Schema ในขณะที่สิทธิ์ระดับออบเจ็กต์กําหนดเป้าหมายตาราง มุมมอง หรือกระบวนงานที่เฉพาะเจาะจง
นี่คือรูปแบบที่มีประสิทธิภาพ: เมื่อคุณให้ SELECT สิทธิ์ใน Schema ผู้ใช้สามารถเลือกจากตารางและมุมมองทั้งหมดใน Schema นั้น รวมถึงออบเจ็กต์ที่สร้างขึ้นในอนาคต:
-- Grant SELECT on all objects in the Sales schema
GRANT SELECT ON SCHEMA::Sales TO SalesAnalyst;
-- Grant EXECUTE on all procedures in the Reports schema
GRANT EXECUTE ON SCHEMA::Reports TO ReportingUsers;
ให้และเพิกถอนสิทธิ์
คําสั่งสามคําสั่งควบคุมสิทธิ์: GRANT ให้สิทธิ์ REVOKE เฉพาะแก่ผู้ใช้ ลบสิทธิ์ที่ได้รับก่อนหน้านี้ และ DENY บล็อกสิทธิ์อย่างชัดเจน โดยแทนที่การให้สิทธิ์ใดๆ
-- Allow reading data
GRANT SELECT ON dbo.Customers TO CustomerServiceRole;
-- Allow data modifications
GRANT INSERT, UPDATE ON dbo.Orders TO OrderProcessingRole;
-- Explicitly deny access to sensitive data (overrides any grants)
DENY SELECT ON dbo.EmployeeSalaries TO HRAssistants;
-- Remove a permission without explicitly denying it
REVOKE INSERT ON dbo.Customers FROM CustomerServiceRole;
ความแตกต่างระหว่าง REVOKE และ DENYคืออะไร ? มันสําคัญเมื่อผู้ใช้มีแหล่งที่มาของสิทธิ์หลายแหล่ง การเพิกถอนจะนําการให้สิทธิ์หนึ่งรายการออก แต่จะไม่ป้องกันการเข้าถึงผ่านการให้สิทธิ์อื่นๆ การปฏิเสธการเข้าถึงจะบล็อกไม่ว่าจะมีเงินช่วยเหลืออื่นใดก็ตาม
ใช้การควบคุมการเข้าถึงตามบทบาท
แทนที่จะให้สิทธิ์โดยตรงแก่ผู้ใช้ ให้สร้าง บทบาทฐานข้อมูล ที่แสดงถึงฟังก์ชันงาน กําหนดสิทธิ์ให้กับบทบาท จากนั้นเพิ่มผู้ใช้ในบทบาทที่เหมาะสม:
-- Create roles for different job functions
CREATE ROLE DataReaders;
CREATE ROLE DataWriters;
-- Grant appropriate permissions to each role
GRANT SELECT ON SCHEMA::dbo TO DataReaders;
GRANT INSERT, UPDATE, DELETE ON SCHEMA::dbo TO DataWriters;
-- Add users to roles
ALTER ROLE DataReaders ADD MEMBER JohnSmith;
ALTER ROLE DataWriters ADD MEMBER JaneDoc;
คุณยังสามารถซ้อนบทบาทเพื่อสร้างโครงสร้างสิทธิ์ตามลําดับชั้น โดยการเพิ่มบุคคลในบทบาทระดับบนสุดจะให้สิทธิ์บทบาทรองทั้งหมดแก่พวกเขาโดยอัตโนมัติ
เคล็ดลับ
จัดทําเอกสารลําดับชั้นของบทบาทของคุณและใช้แบบแผนการตั้งชื่อที่ทําให้วัตถุประสงค์ของแต่ละบทบาทชัดเจน เช่น การนําหน้าแผนกหรือหน้าที่
ใช้การแยกสคีมาเพื่อความปลอดภัย
สคีมา เป็นวิธีที่เป็นธรรมชาติในการจัดระเบียบวัตถุและจัดการสิทธิ์ จัดกลุ่มออบเจ็กต์ที่เกี่ยวข้องเข้าด้วยกัน แล้วให้สิทธิ์ในระดับสคีมา:
CREATE SCHEMA Sales AUTHORIZATION dbo;
CREATE SCHEMA HR AUTHORIZATION dbo;
-- Sales team can read and write sales data
GRANT SELECT, INSERT, UPDATE ON SCHEMA::Sales TO SalesTeam;
-- HR has full control of their schema
GRANT CONTROL ON SCHEMA::HR TO HRAdministrators;
กําหนดค่าการรับรองความถูกต้องของ Microsoft Entra
แอปพลิเคชันสมัยใหม่ควรใช้การรับรองความถูกต้องแบบไม่ใช้รหัสผ่านทุกครั้งที่ทําได้ การรับรองความถูกต้องของ Microsoft Entra ช่วยขจัดความเสี่ยงที่เกี่ยวข้องกับการจัดการรหัสผ่าน รวมถึงการขโมยข้อมูลประจําตัวและภาระการดําเนินงานของความลับหมุนเวียน
ฐานข้อมูล SQL รองรับวิธีการรับรองความถูกต้องหลายวิธี การรับรองความถูกต้อง SQL ใช้ชื่อผู้ใช้และรหัสผ่านที่เก็บไว้ในฐานข้อมูล ตรงไปตรงมา แต่มีความเสี่ยงหากข้อมูลประจําตัวถูกบุกรุก การรับรองความถูกต้องของ Microsoft Entra ขยายการรวมข้อมูลประจําตัวไปยังสถานการณ์ระบบคลาวด์ โดยทํางานร่วมกับฐานข้อมูล Azure SQL, Azure SQL Managed Instance, SQL Server 2022+ และฐานข้อมูล SQL ใน Microsoft Fabric
การสร้างผู้ใช้ฐานข้อมูลจากข้อมูลประจําตัวของ Microsoft Entra นั้นง่ายมาก:
-- Create users for Entra accounts, managed identities, or groups
CREATE USER [app-service-identity] FROM EXTERNAL PROVIDER;
CREATE USER [developer@contoso.com] FROM EXTERNAL PROVIDER;
CREATE USER [DataAnalystsGroup] FROM EXTERNAL PROVIDER;
-- Grant permissions just like SQL users
ALTER ROLE db_datareader ADD MEMBER [developer@contoso.com];
ALTER ROLE db_datawriter ADD MEMBER [app-service-identity];
ใช้การรับรองความถูกต้องของข้อมูลประจําตัวที่มีการจัดการ
ข้อมูลประจําตัวที่มีการจัดการ เป็นตัวเลือกที่ปลอดภัยที่สุดสําหรับแอปพลิเคชันที่โฮสต์โดย Azure Azure จัดการวงจรชีวิตข้อมูลประจําตัวโดยอัตโนมัติ และไม่มีข้อมูลประจําตัวที่อาจรั่วไหลหรือถูกขโมย
สําหรับ Azure App Service ที่เชื่อมต่อกับฐานข้อมูล Azure SQL ให้เปิดใช้งานข้อมูลประจําตัวที่มีการจัดการที่ระบบกําหนด จากนั้นสร้างผู้ใช้ฐานข้อมูล:
CREATE USER [MyWebApp] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [MyWebApp];
ALTER ROLE db_datawriter ADD MEMBER [MyWebApp];
อัปเดตสตริงการเชื่อมต่อแอปพลิเคชันของคุณเพื่อใช้การรับรองความถูกต้องของข้อมูลประจําตัวที่มีการจัดการ:
Server=tcp:myserver.database.windows.net,1433;Database=mydb;Authentication=Active Directory Managed Identity;Encrypt=True;
เคล็ดลับ
ใช้ข้อมูลประจําตัวที่มีการจัดการที่ผู้ใช้กําหนดเมื่อหลายแอปพลิเคชันต้องการสิทธิ์ฐานข้อมูลเดียวกัน ซึ่งจะช่วยลดจํานวนผู้ใช้ฐานข้อมูลที่ต้องจัดการ
สตริงการเชื่อมต่อที่ปลอดภัย
ไม่ว่าคุณจะใช้วิธีการรับรองความถูกต้องแบบใด ให้ปกป้องสตริงการเชื่อมต่อของคุณด้วยแนวทางปฏิบัติที่ดีที่สุดเหล่านี้:
- จัดเก็บไว้ใน Azure Key Vault หรือตัวแปรสภาพแวดล้อม ไม่ใช่ในโค้ด
- ใช้ข้อมูลประจําตัวที่มีการจัดการเพื่อกําจัดข้อมูลประจําตัวออกจากสตริงการเชื่อมต่อทั้งหมด
- เปิดใช้งานการเชื่อมต่อที่เข้ารหัสด้วย
Encrypt=True;TrustServerCertificate=False - จํากัดการเข้าถึงเครือข่ายโดยใช้กฎไฟร์วอลล์และปลายทางส่วนตัว
สำคัญ
เมื่อใช้ข้อมูลลับของไคลเอ็นต์สําหรับบริการหลัก ให้จัดเก็บไว้ใน Azure Key Vault และหมุนเวียนเป็นประจํา การรับรองความถูกต้องตามใบรับรองให้การรักษาความปลอดภัยที่แข็งแกร่งกว่าข้อมูลลับที่ใช้ร่วมกัน
ดูและตรวจสอบสิทธิ์
คุณสามารถสืบค้นมุมมองระบบเพื่อทําความเข้าใจการกําหนดสิทธิ์ปัจจุบัน:
-- View all permissions for a specific principal
SELECT
prin.name AS PrincipalName,
perm.permission_name,
perm.state_desc AS PermissionState,
obj.name AS ObjectName
FROM sys.database_permissions perm
INNER JOIN sys.database_principals prin ON perm.grantee_principal_id = prin.principal_id
LEFT JOIN sys.objects obj ON perm.major_id = obj.object_id
WHERE prin.name = 'SalesAnalyst';
-- Check effective permissions for the current user
SELECT * FROM fn_my_permissions('Sales.Orders', 'OBJECT');
ทําให้เป็นนิสัยในการตรวจสอบการมอบหมายสิทธิ์อย่างสม่ําเสมอเพื่อให้แน่ใจว่ายังคงสอดคล้องกับหน้าที่งานปัจจุบัน และอย่าลืมว่าสิทธิ์ระดับอ็อบเจ็กต์จะทํางานได้ดีที่สุดเมื่อรวมกับฟีเจอร์ความปลอดภัยอื่นๆ เช่น Row-Level Security และ Dynamic Data Masking เพื่อการป้องกันที่ครอบคลุม