نحوه دادن دسترسی به یک User فقط روی یک Database
یکی از اصول پایهای امنیت پایگاهداده، اصل حداقل دسترسی لازم (Principle of Least Privilege) است: هر کاربر یا برنامه باید فقط به همان چیزی دسترسی داشته باشد که واقعاً به آن نیاز دارد — نه بیشتر. اگر یک اپلیکیشن فقط باید با پایگاهدادهی ShopDB کار کند، هیچ دلیلی ندارد که به HR_DB یا سایر پایگاهدادههای روی همان سرور هم دسترسی داشته باشد.
پیشنیاز این راهنما، درک تفاوت Login و User است — اگر با آن آشنا نیستی، اول نحوه ساخت User و Login و تفاوت آنها را بخوان.
نکتهی کلیدی: بهطور پیشفرض هیچ دسترسیای وجود ندارد
مرحله ۱ — ساخت Login (اگر از قبل وجود ندارد)
CREATE LOGIN shop_app WITH PASSWORD = N'Str0ngP@ssw0rd!';
مرحله ۲ — تنظیم پایگاهدادهی پیشفرض (اختیاری ولی مفید)
برای اینکه این Login بهطور پیشفرض وقتی وصل میشود روی پایگاهدادهی درست باز شود (نه master)، در SSMS هنگام ساخت Login، در تب General فیلد Default database را روی ShopDB تنظیم کن:
مرحله ۳ — ساخت User فقط در همان یک پایگاهداده
در تب User Mapping، فقط تیک ShopDB را بزن و بقیهی پایگاهدادهها را خالی بگذار:
sysadmin یا securityadmin نکنی — این نقشها در سطح کل سرور عمل میکنند و دسترسی به همهی پایگاهدادهها را میدهند، حتی اگر در User Mapping فقط یک پایگاهداده را تیک زده باشی.همین کار با T-SQL
-- ساخت Login با پایگاهدادهی پیشفرض مشخص CREATE LOGIN shop_app WITH PASSWORD = N'Str0ngP@ssw0rd!', DEFAULT_DATABASE = ShopDB; -- ساخت User فقط در ShopDB (نه در هیچ پایگاهدادهی دیگری) USE ShopDB; CREATE USER shop_app FOR LOGIN shop_app; ALTER ROLE db_datareader ADD MEMBER shop_app; ALTER ROLE db_datawriter ADD MEMBER shop_app;
همینقدر کافی است. چون هیچوقت CREATE USER shop_app را در HR_DB یا AccountingDB اجرا نکردیم، این Login حتی اگر تلاش کند به آن پایگاهدادهها وصل شود، با خطای دسترسی روبهرو میشود.
راستیآزمایی دسترسی
برای اطمینان از اینکه این User واقعاً فقط به ShopDB دسترسی دارد، این کوئری را با یک Login مدیریتی روی master اجرا کن:
SELECT name AS database_name FROM sys.databases WHERE HAS_DBACCESS(name) = 1;
جمعبندی
- یک Login بهطور پیشفرض به هیچ پایگاهدادهای دسترسی ندارد.
- برای محدودکردن دسترسی به یک پایگاهدادهی خاص، فقط باید در همان یک پایگاهداده User بسازی — نیازی به تنظیم اضافه نیست.
- مراقب نقشهای سطح سرور (مثل sysadmin) باش؛ آنها این محدودیت را دور میزنند.
برای یادگیری کاملتر مدیریت دسترسی، درسهای Roles و Permissions را در دورهی SQLFarsi ببین.
سوالات متداول دربارهی این موضوع
چطور فقط به یک User اجازهی دیدن یک پایگاهداده را بدهم؟
Login را فقط به همان پایگاهداده نگاشت کن (User Mapping) و نقشهای حداقلی مثل db_datareader بده. برای مخفی کردن بقیهی پایگاهها میتوانی VIEW ANY DATABASE را برای آن Login رد (DENY) کنی.
آیا برای کار روزمره نقش db_owner لازم است؟
معمولاً نه. db_datareader و db_datawriter برای اغلب برنامهها کافی است؛ db_owner مالکیت کامل پایگاهداده را میدهد.
اصل حداقل دسترسی (Least Privilege) یعنی چه؟
هر کاربر فقط مجوزهایی را داشته باشد که برای کارش لازم است، نه بیشتر؛ تا در صورت نفوذ یا اشتباه، خسارت محدود بماند.
میخوای مفاهیم امنیت SQL Server را کامل یاد بگیری؟
فصل امنیت دورهی SQLFarsi، Login، User، Role و Permission را از پایه توضیح میدهد.
شروع فصل امنیت