نقشهای ثابت پایگاه داده (Fixed Database Roles): راهنمای جامع مدیریت دسترسی و امنیت
نقشهای ثابت پایگاه داده (Fixed Database Roles) راهی ساده و موثر برای مدیریت امنیت و دسترسی در SQL Server ارائه میدهند. این نقشها به صورت پیشفرض در SQL Server موجود هستند و میتوان آنها را به کاربران یا نقشهای دیگر اختصاص داد تا مجوزهای خاصی را در یک پایگاه داده به آنها اعطا کرد. برخلاف نقشهای سفارشی پایگاه داده که قابل تغییر هستند، نقشهای ثابت پایگاه داده را نمیتوان ویرایش یا حذف کرد؛ مجوزهای آنها توسط مایکروسافت از پیش تعریف شده و کاملاً غیرقابل تغییر (immutable) هستند. درک این نقشها برای هر متخصص SQL Server و مدیر پایگاه داده ضروری است تا بتواند امنیت پایگاه داده و مجوزهای کاربران را به درستی مدیریت کند.
در ادامه به بررسی دقیق هر یک از نقشهای ثابت پایگاه داده و کاربردهای آنها میپردازیم:
۱. db_owner
عضویت در نقش db_owner به کاربر دسترسی کامل به تمام عملیات و تنظیمات پایگاه داده را میدهد. این افراد میتوانند تمام فعالیتهای پیکربندی، نگهداری و حذف پایگاه داده را انجام دهند، از جمله تغییر ساختار، افزودن یا حذف دادهها و مدیریت کاربران. این نقش بالاترین سطح دسترسی را در یک پایگاه داده دارد و معادل نقش sysadmin در سطح سرور است، اما محدود به یک پایگاه داده خاص.
برای افزودن یک کاربر به نقش db_owner، از دستور زیر استفاده کنید:
EXEC sp_addrolemember 'db_owner', 'اسم_کاربر';
برای حذف یک کاربر از این نقش، دستور زیر را به کار ببرید:
EXEC sp_droprolemember 'db_owner', 'اسم_کاربر';
۲. db_securityadmin
اعضای نقش db_securityadmin میتوانند مجوزها را در یک پایگاه داده مدیریت کنند. این شامل اعطای (GRANT)، لغو (REVOKE) و رد کردن (DENY) مجوزها، و همچنین مدیریت نقشها و اعضای آنها میشود. آنها میتوانند مجوزهای اشیاء (objects) را تغییر دهند اما نمیتوانند دادهها را مستقیماً مشاهده یا تغییر دهند مگر اینکه مجوزهای صریح دیگری داشته باشند. این نقش برای مدیریت امنیتی و تعریف دسترسیها بسیار مهم است.
برای اضافه کردن یک کاربر به نقش db_securityadmin:
EXEC sp_addrolemember 'db_securityadmin', 'اسم_کاربر';
۳. db_accessadmin
اعضای db_accessadmin قادرند دسترسی کاربران و گروهها را به یک پایگاه داده مدیریت کنند. این شامل اضافه کردن یا حذف کردن کاربران و نقشها به پایگاه داده میشود، اما نمیتوانند مجوزهای اشیاء را مدیریت کنند. این نقش برای کنترل کلی دسترسی به پایگاه داده مفید است و به مدیران سیستم اجازه میدهد تا ورود و خروج کاربران را تنظیم کنند.
نمونهای از افزودن کاربر به نقش db_accessadmin:
EXEC sp_addrolemember 'db_accessadmin', 'اسم_کاربر';
۴. db_backupoperator
اعضای نقش db_backupoperator مجوز پشتیبانگیری (backup) از پایگاه داده و جداول آن را دارند. آنها میتوانند عملیات پشتیبانگیری را انجام دهند اما نمیتوانند ساختار پایگاه داده یا دادههای آن را تغییر دهند. این نقش برای تیمهای عملیاتی که مسئول تهیه و بازیابی پشتیبانها هستند، ایدهآل است و برای حفظ پایداری دادهها حیاتی است.
برای تخصیص نقش db_backupoperator به یک کاربر:
EXEC sp_addrolemember 'db_backupoperator', 'اسم_کاربر';
۵. db_datareader
این نقش به اعضای خود مجوز خواندن تمام دادهها از تمام جداول و نماها (views) در پایگاه داده را میدهد. آنها نمیتوانند دادهها را تغییر دهند، حذف کنند یا ساختار پایگاه داده را تغییر دهند. این نقش برای برنامههایی که نیاز به دسترسی فقط خواندنی (read-only) دارند یا کاربران تحلیلگر داده مناسب است و دسترسی ایمن به اطلاعات را فراهم میکند.
اضافه کردن کاربر به db_datareader:
EXEC sp_addrolemember 'db_datareader', 'اسم_کاربر';
۶. db_datawriter
اعضای نقش db_datawriter میتوانند دادهها را در تمام جداول و نماهای پایگاه داده درج (insert)، به روزرسانی (update) و حذف (delete) کنند. آنها نمیتوانند ساختار جداول را تغییر دهند یا دادهها را مشاهده کنند مگر اینکه نقش db_datareader نیز به آنها اعطا شده باشد. اغلب، این نقش به همراه db_datareader استفاده میشود تا عملیات کامل داده را فراهم کند.
برای دادن مجوز نوشتن داده به یک کاربر:
EXEC sp_addrolemember 'db_datawriter', 'اسم_کاربر';
۷. db_ddladmin
اعضای db_ddladmin میتوانند تمام دستورات زبان تعریف داده (DDL) را در پایگاه داده اجرا کنند. این شامل ایجاد (CREATE)، تغییر (ALTER) و حذف (DROP) جداول، نماها، رویهها (procedures) و سایر اشیاء پایگاه داده میشود. این نقش برای توسعهدهندگانی که نیاز به مدیریت ساختار پایگاه داده دارند، مفید است و در چرخه عمر توسعه نرمافزار کاربرد فراوان دارد.
نمونهای از افزودن کاربر به db_ddladmin:
EXEC sp_addrolemember 'db_ddladmin', 'اسم_کاربر';
۸. db_denydatareader
نقش db_denydatareader مجوز خواندن دادهها را از تمام جداول و نماهای پایگاه داده به اعضای خود «رد میکند» (DENY). این نقش برای جلوگیری از دسترسی کاربران خاص به دادهها، حتی اگر مجوزهای دیگری به آنها داده شده باشد، استفاده میشود. مجوز DENY همیشه بر مجوز GRANT ارجحیت دارد و برای اعمال محدودیتهای امنیتی کاربرد دارد.
برای محروم کردن یک کاربر از خواندن دادهها:
EXEC sp_addrolemember 'db_denydatareader', 'اسم_کاربر';
۹. db_denydatawriter
نقش db_denydatawriter مجوز تغییر دادهها (درج، بهروزرسانی، حذف) را از تمام جداول و نماهای پایگاه داده به اعضای خود «رد میکند» (DENY). این نقش برای جلوگیری از تغییر دادهها توسط کاربران خاص به کار میرود و مانند db_denydatareader، بر مجوز GRANT ارجحیت دارد. این برای حفاظت از یکپارچگی دادهها و جلوگیری از تغییرات ناخواسته بسیار مهم است.
برای جلوگیری از تغییر دادهها توسط یک کاربر:
EXEC sp_addrolemember 'db_denydatawriter', 'اسم_کاربر';
۱۰. public
هر کاربر پایگاه داده به طور پیشفرض عضو نقش public است و نمیتوان آن را حذف کرد. این نقش کمترین سطح دسترسی را دارد و تمام مجوزهایی که به public اعطا میشوند، به تمام کاربران پایگاه داده تعلق میگیرد. معمولاً مجوزهای پایهای مانند مشاهده متادادهها از طریق این نقش اعطا میشوند و هرگز نباید مجوزهای حساس به آن داده شود.
بررسی عضویت کاربران در نقشهای ثابت برای مدیریت دسترسی
برای مشاهده اینکه کدام کاربران عضو یک نقش خاص هستند یا یک کاربر عضو کدام نقشها است، میتوانید از کوئریهای سیستمی SQL Server استفاده کنید. این عملیات برای بررسی وضعیت امنیت پایگاه داده و مدیریت مجوزها حیاتی است و به شما در ممیزی دسترسیها کمک میکند.
برای مشاهده تمام اعضای یک نقش پایگاه داده خاص، میتوانید از کوئری زیر استفاده کنید. به عنوان مثال، برای نقش db_owner، این کوئری لیست تمام کاربرانی را که عضو این نقش هستند، نمایش میدهد:
SELECT
DP1.name AS DatabaseRoleName,
DP2.name AS DatabaseUserName
FROM
sys.database_role_members AS DRM
JOIN
sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id
JOIN
sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id
WHERE
DP1.name = 'db_owner';
این کوئری اطلاعات دقیقی در مورد اعضای یک نقش خاص ارائه میدهد و به شما کمک میکند تا به راحتی دسترسیهای کاربران را در SQL Server ردیابی کنید و مطابقت با سیاستهای امنیتی را بررسی نمایید.
همچنین، برای بررسی اینکه یک کاربر خاص عضو کدام نقشهای پایگاه داده است، میتوانید نام کاربر را در شرط WHERE تغییر دهید:
SELECT
DP1.name AS DatabaseRoleName,
DP2.name AS DatabaseUserName
FROM
sys.database_role_members AS DRM
JOIN
sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id
JOIN
sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id
WHERE
DP2.name = 'اسم_کاربر';
این اسکریپت نیز برای ممیزی امنیت و اطمینان از اختصاص صحیح مجوزهای SQL Server به کاربران بسیار کاربردی است و یک ابزار کلیدی در مدیریت کاربری پایگاه داده محسوب میشود.
نتیجهگیری
نقشهای ثابت پایگاه داده در SQL Server ابزارهای قدرتمندی برای سادهسازی مدیریت امنیت و دسترسی هستند. با درک صحیح و استفاده مناسب از این نقشها، میتوانید به طور موثرتری مجوزهای کاربران را کنترل کرده و از امنیت پایگاه داده SQL Server خود اطمینان حاصل کنید. همیشه توصیه میشود اصل کمترین امتیاز (Principle of Least Privilege) را رعایت کنید و فقط حداقل مجوزهای لازم را به کاربران و برنامهها اختصاص دهید تا سطح امنیت دادهها را به حداکثر برسانید.