إدارة الأجازات والوصول الآمن
تتحكم أفعالات الكائن على مستوى الكائنات في الإجراءات التي يمكن للمستخدمين تنفيذها على كائنات قاعدة البيانات مثل الجداول، والعروض، والإجراءات المخزنة، والوظائف. بينما يقوم Row-Level Security بتصفية البيانات داخل الكائنات، تحدد الأذونات على مستوى الكائن ما إذا كان بإمكان المستخدم الوصول إلى كائن على الإطلاق وما هي العمليات التي يمكنه تنفيذها.
نموذج الإذن المصمم جيدا يسير جنبا إلى جنب مع المصادقة الآمنة. تغطي هذه الوحدة كلا الأمرين: كيفية منح الأذونات الصحيحة وكيفية ضمان المصادقة الآمن للمستخدمين، ويفضل بدون كلمات مرور.
افهم تسلسل التصاريح
يستخدم SQL Server نموذج صلاحيات هرمي حيث تتدفق الأذونات الممنوحة في المستويات الأعلى إلى المستويات الأدنى. فكر فيها كسلسلة متسلسلة: خادم → قاعدة بيانات → مخطط → كائنات فردية.
على مستوى الخادم، تتحكم الأذونات في إدارة تسجيل الدخول وتكوين الخادم. تحكم الأذونات على مستوى قاعدة البيانات الإجراءات داخل قاعدة بيانات محددة. تطبق صلاحيات مستوى المخطط على جميع الكائنات داخل المخطط، بينما تستهدف أذونات مستوى الكائن جداول أو عروض أو إجراءات محددة.
إليك نمطا قويا: عندما تمنح SELECT الإذن على مخطط، يمكن للمستخدمين اختيار من جميع الجداول والعروض في ذلك المخطط—بما في ذلك الكائنات التي تم إنشاؤها في المستقبل:
-- 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 Database، 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 المتصلة بقاعدة بيانات 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 Masked لحماية شاملة.