سطوح دسترسی- T-SQL-Row-Level Security-Server-Level Permissions-Database-Level Permissions-Object-Level Permissions-Sql Permissions-SQL

سطوح دسترسی در SQL Server چیست؟

سطوح دسترسی (Permissions) در SQL Server مجموعه‌ای از مجوزها هستند که مشخص می‌کنند چه کاربران یا نقش‌هایی می‌توانند چه عملیاتی را روی منابع مختلف (مانند سرور، پایگاه داده، جداول یا پروسیجرها) انجام دهند. این دسترسی‌ها در ۳ سطح اصلی دسته‌بندی می‌شوند:
  1. سطح سرور (Server-Level Permissions) :مربوط به کل سرور و عملیات‌های مدیریتی آن
  2. سطح پایگاه داده (Database-Level Permissions) :مربوط به یک پایگاه داده خاص و عملیات‌های آن
  3. سطح اشیاء (Object-Level Permissions) :مربوط به اشیاء خاص درون پایگاه داده، مانند جداول یا پروسیجرها
مدیریت دقیق این دسترسی‌ها از اصول کلیدی امنیت پایگاه داده است و از دسترسی غیرمجاز به داده‌های حساس جلوگیری می‌کند.

انواع دسترسی‌ها در SQL Server

۱. دسترسی‌های سطح سرور (Server-Level Permissions)

دسترسی‌های سطح سرور به عملیات‌هایی مربوط می‌شوند که کل سرور SQL Server را تحت تأثیر قرار می‌دهند، مانند مدیریت لاگین‌ها، ایجاد پایگاه داده، یا مشاهده وضعیت سرور. این دسترسی‌ها معمولاً به نقش‌های سطح سرور یا کاربران خاص اعطا می‌شوند. برخی از مهم‌ترین دسترسی‌های سطح سرور عبارت‌اند از:
  • CONTROL SERVER: کنترل کامل روی سرور، شامل تمام عملیات‌ها.
  • CREATE ANY DATABASE: اجازه ایجاد پایگاه داده جدید.
  • ALTER ANY LOGIN: مدیریت لاگین‌های سرور (ایجاد، تغییر، حذف).
  • VIEW SERVER STATE: مشاهده وضعیت و آمار عملکرد سرور.
  • SHUTDOWN: خاموش کردن سرور.
  • CONNECT SQL: اتصال به سرور.
دستور:
GRANT CONTROL SERVER TO UserName;

۲. دسترسی‌های سطح پایگاه داده (Database-Level Permissions)

این دسترسی‌ها به یک پایگاه داده خاص محدود هستند و عملیات‌های کلی یا مربوط به اشیاء درون آن پایگاه داده را کنترل می‌کنند. برخی از مهم‌ترین دسترسی‌های سطح پایگاه داده شامل موارد زیر هستند:
  • ALTER: تغییر ساختار پایگاه داده یا اشیاء آن (مانند جداول، نماها، پروسیجرها).
  • BACKUP DATABASE: گرفتن نسخه پشتیبان از پایگاه داده.
  • BACKUP LOG: گرفتن نسخه پشتیبان از لاگ تراکنش‌ها.
  • CONNECT: اجازه اتصال به پایگاه داده.
  • CONTROL: کنترل کامل بر پایگاه داده، شامل تمام دسترسی‌ها.
  • CREATE TABLE/PROCEDURE/VIEW: ایجاد اشیاء جدید.
  • SELECT/INSERT/UPDATE/DELETE: خواندن یا تغییر داده‌ها در تمام جداول.
  • EXECUTE: اجرای پروسیجرها یا توابع.
  • VIEW DEFINITION: مشاهده تعریف اشیاء (مانند ساختار جدول).
  • VIEW DATABASE STATE: مشاهده وضعیت پایگاه داده.
دستور:
GRANT SELECT, BACKUP DATABASE ON DATABASE::MyDatabase TO UserName;

۳. دسترسی‌های سطح اسکیما و اشیاء

  • Schema-Level Permissions: دسترسی به تمام اشیاء درون یک اسکیما (مانند SELECT روی تمام جداول یک اسکیما).
  • Object-Level Permissions: دسترسی به یک شیء خاص، مانند یک جدول یا پروسیجر. مثال:
    • SELECT ON TableName: خواندن داده‌ها از یک جدول خاص.
    • EXECUTE ON ProcedureName: اجرای یک پروسیجر خاص.
دستور:
GRANT SELECT ON Employees TO UserName;

مدیریت دسترسی‌ها

دسترسی‌ها از طریق دستورات T-SQL زیر مدیریت می‌شوند:
GRANT: اعطای دسترسی.
GRANT SELECT ON TableName TO UserName;
DENY: منع صریح دسترسی.
DENY SELECT ON TableName TO UserName;
REVOKE: لغو دسترسی اعطا شده یا منع شده.
REVOKE SELECT ON TableName FROM UserName;

نقش‌های سطح سرور در SQL Server

نقش‌های سطح سرور (Server Roles) گروه‌هایی از دسترسی‌های از پیش تعریف‌شده هستند که به لاگین‌ها در سطح سرور تخصیص داده می‌شوند. این نقش‌ها برای مدیریت عملیات‌های کل سرور طراحی شده‌اند و به ساده‌سازی تخصیص دسترسی‌ها کمک می‌کنند. SQL Server مجموعه‌ای از نقش‌های پیش‌فرض سطح سرور ارائه می‌دهد که در ادامه توضیح داده شده‌اند:

۱. sysadmin

دسترسی‌ها: کنترل کامل بر تمام جنبه‌های سرور، شامل تمام پایگاه‌های داده، تنظیمات، و عملیات‌ها.
کاربرد: برای مدیران ارشد سرور که نیاز به دسترسی نامحدود دارند.
توجه: این نقش بسیار قدرتمند است و باید با احتیاط استفاده شود.
ALTER SERVER ROLE sysadmin ADD MEMBER LoginName;

۲. serveradmin

دسترسی‌ها: مدیریت تنظیمات سرور و انجام عملیات‌هایی مانند خاموش کردن سرور یا تغییر پیکربندی.
کاربرد: برای مدیرانی که مسئول تنظیمات سرور هستند، اما نیازی به کنترل کامل ندارند.
مثال:
ALTER SERVER ROLE serveradmin ADD MEMBER LoginName;

۳. securityadmin

دسترسی‌ها: مدیریت لاگین‌ها و دسترسی‌های سطح سرور، مانند ایجاد، تغییر، یا حذف لاگین‌ها.
کاربرد: برای مدیرانی که مسئول امنیت سرور هستند.
مثال:
ALTER SERVER ROLE securityadmin ADD MEMBER LoginName;

۴. processadmin

دسترسی‌ها: مدیریت فرآیندهای در حال اجرا در سرور، مانند توقف یا بررسی فرآیندها.
کاربرد: برای مدیرانی که نیاز به نظارت بر عملکرد سرور دارند.
مثال:
ALTER SERVER ROLE processadmin ADD MEMBER LoginName;

۵. setupadmin

دسترسی‌ها: مدیریت سرورهای لینک‌شده (Linked Servers) و تنظیمات مرتبط.
کاربرد: برای مدیرانی که مسئول اتصال سرورها هستند.
مثال:
ALTER SERVER ROLE setupadmin ADD MEMBER LoginName;

۶. bulkadmin

دسترسی‌ها: انجام عملیات‌های بارگذاری انبوه (Bulk Insert).
کاربرد: برای کاربرانی که نیاز به وارد کردن داده‌های حجیم دارند.
مثال:
ALTER SERVER ROLE bulkadmin ADD MEMBER LoginName;

۷. diskadmin

دسترسی‌ها: مدیریت فایل‌های دیسک مرتبط با پایگاه داده (مانند فایل‌های داده و لاگ).
کاربرد: برای مدیرانی که مسئول مدیریت فضای ذخیره‌سازی هستند.
مثال:
ALTER SERVER ROLE diskadmin ADD MEMBER LoginName;

۸. dbcreator

دسترسی‌ها: ایجاد، تغییر، حذف، یا بازیابی پایگاه‌های داده.
کاربرد: برای کاربرانی که نیاز به مدیریت پایگاه‌های داده دارند، اما نیازی به کنترل کامل سرور ندارند.
مثال:
ALTER SERVER ROLE dbcreator ADD MEMBER LoginName;

۹. public (نقش عمومی سطح سرور)

دسترسی‌ها: تمام لاگین‌ها به‌طور پیش‌فرض عضو این نقش هستند و دسترسی‌های پایه (مانند اتصال به سرور) را دریافت می‌کنند.
کاربرد: برای اعطای دسترسی‌های عمومی به همه لاگین‌ها.
مثال:
GRANT CONNECT SQL TO public;

نقش‌های سطح پایگاه داده در SQL Server

نقش‌های سطح پایگاه داده (Database Roles) برای مدیریت دسترسی‌ها در یک پایگاه داده خاص استفاده می‌شوند. این نقش‌ها به کاربران یا گروه‌ها تخصیص داده می‌شوند و می‌توانند دسترسی‌های از پیش تعریف‌شده یا سفارشی را شامل شوند. نقش‌های پایگاه داده به سه دسته تقسیم می‌شوند:

۱. نقش‌های پیش‌فرض (Fixed Database Roles)

SQL Server مجموعه‌ای از نقش‌های پیش‌فرض را برای هر پایگاه داده ارائه می‌دهد. این نقش‌ها عبارت‌اند از:

db_owner

دسترسی‌ها: کنترل کامل بر پایگاه داده، شامل تمام عملیات DDL (ایجاد، تغییر، حذف) و DML (خواندن، تغییر داده‌ها)، مدیریت کاربران، و گرفتن نسخه پشتیبان.
کاربرد: برای مدیران پایگاه داده یا مالکان آن.
مثال:
ALTER ROLE db_owner ADD MEMBER UserName;

db_accessadmin

دسترسی‌ها: مدیریت دسترسی کاربران به پایگاه داده (افزودن/حذف کاربران، مدیریت CONNECT).
کاربرد: برای مدیرانی که مسئول کنترل دسترسی کاربران هستند.
مثال:
ALTER ROLE db_accessadmin ADD MEMBER UserName;

db_securityadmin

دسترسی‌ها: مدیریت نقش‌ها و دسترسی‌ها، مشاهده تعریف اشیاء.
کاربرد: برای مدیریت تنظیمات امنیتی پایگاه داده.
مثال:
ALTER ROLE db_securityadmin ADD MEMBER UserName;

db_ddladmin

دسترسی‌ها: اجرای دستورات DDL (ایجاد، تغییر، حذف اشیاء) بدون دسترسی به داده‌ها.
کاربرد: برای توسعه‌دهندگانی که نیاز به تغییر ساختار پایگاه داده دارند.
مثال:
ALTER ROLE db_ddladmin ADD MEMBER UserName;

db_backupoperator

دسترسی‌ها: گرفتن نسخه پشتیبان از پایگاه داده و لاگ تراکنش‌ها.
کاربرد: برای کاربران مسئول مدیریت نسخه‌های پشتیبان.
مثال:
ALTER ROLE db_backupoperator ADD MEMBER UserName;

db_datareader

دسترسی‌ها: خواندن داده‌ها (SELECT) از تمام جداول و نماها.
کاربرد: برای کاربرانی که فقط نیاز به مشاهده داده‌ها دارند (مانند گزارش‌سازان).
مثال:
ALTER ROLE db_datareader ADD MEMBER UserName;

db_datawriter

دسترسی‌ها: افزودن، به‌روزرسانی، و حذف داده‌ها (INSERT, UPDATE, DELETE) در تمام جداول.
کاربرد: برای اپلیکیشن‌های تراکنشی یا کاربرانی که نیاز به تغییر داده‌ها دارند.
مثال:
ALTER ROLE db_datawriter ADD MEMBER UserName;

db_denydatareader

دسترسی‌ها: منع خواندن داده‌ها از جداول و نماها.
کاربرد: برای محدود کردن دسترسی در سناریوهای امنیتی حساس.
مثال:
ALTER ROLE db_denydatareader ADD MEMBER UserName;

db_denydatawriter

دسترسی‌ها: منع تغییر داده‌ها در جداول.
کاربرد: برای جلوگیری از تغییرات ناخواسته.
مثال:
ALTER ROLE db_denydatawriter ADD MEMBER UserName;

۲. نقش عمومی (public Role)

نقش public به‌طور پیش‌فرض در هر پایگاه داده وجود دارد و تمام کاربران پایگاه داده عضو آن هستند.
دسترسی‌ها: دسترسی‌های پایه (مانند CONNECT) یا دسترسی‌های اعطا شده توسط مدیر.
کاربرد: برای اعطای دسترسی‌های عمومی به همه کاربران.
مثال:
GRANT SELECT ON TableName TO public;

۳. نقش‌های سفارشی (User-Defined Database Roles)

نقش‌هایی که توسط مدیر پایگاه داده ایجاد می‌شوند و می‌توانند دسترسی‌های دلخواه را شامل شوند.
نحوه ایجاد:
CREATE ROLE CustomRoleName;
GRANT SELECT, INSERT ON TableName TO CustomRoleName;
ALTER ROLE CustomRoleName ADD MEMBER UserName;
کاربرد: برای گروه‌های کاری خاص (مانند تیم حسابداری یا فروش).
مثال:
CREATE ROLE FinanceTeam;
GRANT SELECT, UPDATE ON FinancialTable TO FinanceTeam;
ALTER ROLE FinanceTeam ADD MEMBER Ali;

۴. نقش‌های برنامه‌ای (Application Roles)

نقش‌هایی برای مدیریت دسترسی اپلیکیشن‌ها به پایگاه داده، با استفاده از رمز عبور.
نحوه ایجاد و استفاده:
CREATE APPLICATION ROLE AppRoleName WITH PASSWORD = 'SecurePassword';
GRANT SELECT ON TableName TO AppRoleName;
EXEC sp_setapprole 'AppRoleName', 'SecurePassword';
کاربرد: برای اپلیکیشن‌هایی که از اتصال مشترک استفاده می‌کنند (مانند اپلیکیشن‌های وب).

امنیت در سطح ردیف (Row-Level Security)

SQL Server امکان محدود کردن دسترسی به ردیف‌های خاص در یک جدول را از طریق Row-Level Security (RLS) فراهم می‌کند. این قابلیت با استفاده از توابع امنیتی و سیاست‌های دسترسی پیاده‌سازی می‌شود و برای سناریوهای حساس، مانند محدود کردن دسترسی کاربران به داده‌های مربوط به خودشان، بسیار کاربردی است.

مثال:

CREATE FUNCTION Security.fn_securitypredicate(@UserID AS INT)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT ۱ AS fn_securitypredicate_result
    WHERE @UserID = USER_ID();

پیشنهاد مطالعه:

بهترین روش‌ها برای مدیریت دسترسی‌ها و نقش‌ها

برای اطمینان از امنیت و کارایی در مدیریت دسترسی‌ها، رعایت نکات زیر ضروری است:

اصل حداقل دسترسی (Principle of Least Privilege): فقط دسترسی‌های مورد نیاز را به کاربران یا نقش‌ها اعطا کنید.
استفاده از نقش‌ها به جای دسترسی مستقیم: نقش‌های سطح سرور و پایگاه داده مدیریت دسترسی‌ها را ساده‌تر می‌کنند.
ایجاد نقش‌های سفارشی برای تیم‌ها: نقش‌های سفارشی برای گروه‌های کاری خاص امنیت و انعطاف‌پذیری را افزایش می‌دهند.
محدود کردن نقش‌های قدرتمند: نقش‌هایی مانند sysadmin یا db_owner را با احتیاط تخصیص دهید.
بررسی دوره‌ای دسترسی‌ها: از DMVs مانند sys.server_permissions و sys.database_permissions برای نظارت بر دسترسی‌ها استفاده کنید:
SELECT * FROM sys.server_permissions;
SELECT * FROM sys.database_permissions;
اجتناب از حساب sa: این حساب دسترسی کامل دارد و باید غیرفعال یا محدود شود.
استفاده از ابزارهای نظارتی: از SQL Server Audit برای بررسی تغییرات دسترسی‌ها استفاده کنید.

ابزارهای مدیریت دسترسی‌ها

SQL Server Management Studio (SSMS): رابط گرافیکی برای مدیریت دسترسی‌ها و نقش‌ها.
دستورات T-SQL: برای مدیریت دقیق و اسکریپت‌نویسی.
Dynamic Management Views (DMVs): برای مشاهده دسترسی‌های فعلی:
SELECT * FROM sys.fn_my_permissions(NULL, 'SERVER');
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE');

مثال‌های کاربردی

۱. تخصیص دسترسی به تیم توسعه‌دهندگان
CREATE ROLE Developers;
GRANT CREATE TABLE, SELECT ON DATABASE::MyDatabase TO Developers;
ALTER ROLE Developers ADD MEMBER DevUser;
۲. محدود کردن دسترسی یک کاربر
ALTER ROLE db_denydatareader ADD MEMBER RestrictedUser;
۳. ایجاد نقش برنامه‌ای برای اپلیکیشن
CREATE APPLICATION ROLE WebAppRole WITH PASSWORD = 'AppPass123';
GRANT SELECT, INSERT ON Orders TO WebAppRole;
EXEC sp_setapprole 'WebAppRole', 'AppPass123';
۴. اعطای نقش سطح سرور
ALTER SERVER ROLE dbcreator ADD MEMBER LoginName;
نتیجه‌گیری

مدیریت سطوح دسترسی و نقش‌های سطح سرور و پایگاه داده در SQL Server بخش حیاتی از امنیت داده‌ها است. نقش‌های سطح سرور (مانند sysadmin و dbcreator) برای مدیریت کل سرور و نقش‌های سطح پایگاه داده (مانند db_owner و db_datareader) برای مدیریت پایگاه‌های داده خاص طراحی شده‌اند. با استفاده از دسترسی‌های مناسب، نقش‌های پیش‌فرض، سفارشی، برنامه‌ای و رعایت بهترین روش‌ها، می‌توانید پایگاه داده‌ای امن و کارآمد داشته باشید.

اگر سوال یا سناریوی خاصی دارید، در بخش نظرات مطرح کنید تا راهنمایی دقیق‌تری ارائه شود!

ارتباط و مشاوره

برای اطلاعات بیشتر و مشاوره می‌توانید از طریق زیر با ما در ارتباط باشید:

نظری داده نشده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *