خانه/ وبلاگ/ دسترسی فقط به یک Database
امنیت SQL Server

نحوه دادن دسترسی به یک User فقط روی یک Database

امنیت ۲۸ مرداد ۱۴۰۴ ۸ دقیقه مطالعه

یکی از اصول پایه‌ای امنیت پایگاه‌داده، اصل حداقل دسترسی لازم (Principle of Least Privilege) است: هر کاربر یا برنامه باید فقط به همان چیزی دسترسی داشته باشد که واقعاً به آن نیاز دارد — نه بیشتر. اگر یک اپلیکیشن فقط باید با پایگاه‌داده‌ی ShopDB کار کند، هیچ دلیلی ندارد که به HR_DB یا سایر پایگاه‌داده‌های روی همان سرور هم دسترسی داشته باشد.

پیش‌نیاز این راهنما، درک تفاوت Login و User است — اگر با آن آشنا نیستی، اول نحوه ساخت User و Login و تفاوت آن‌ها را بخوان.

نکته‌ی کلیدی: به‌طور پیش‌فرض هیچ دسترسی‌ای وجود ندارد

خبر خوب این است که کاری برای «محدودکردن» دسترسی لازم نیست! یک Login به‌طور پیش‌فرض به هیچ پایگاه‌داده‌ای دسترسی ندارد، مگر اینکه صریحاً برایش یک User در آن پایگاه‌داده بسازی. پس کافی است فقط در همان یک پایگاه‌داده‌ای که نیاز داری، User بسازی و نقش بدهی — و بس.

مرحله ۱ — ساخت Login (اگر از قبل وجود ندارد)

sql
CREATE LOGIN shop_app WITH PASSWORD = N'Str0ngP@ssw0rd!';

مرحله ۲ — تنظیم پایگاه‌داده‌ی پیش‌فرض (اختیاری ولی مفید)

برای اینکه این Login به‌طور پیش‌فرض وقتی وصل می‌شود روی پایگاه‌داده‌ی درست باز شود (نه master)، در SSMS هنگام ساخت Login، در تب General فیلد Default database را روی ShopDB تنظیم کن:

Login Properties — shop_app — General
Default database:
ShopDB

مرحله ۳ — ساخت User فقط در همان یک پایگاه‌داده

در تب User Mapping، فقط تیک ShopDB را بزن و بقیه‌ی پایگاه‌داده‌ها را خالی بگذار:

Login Properties — shop_app — User Mapping
ShopDB ✓ تیک‌خورده
HR_DB
AccountingDB
Database role membership for: ShopDB
db_datareader
db_datawriter
مراقب باش این Login را عضو نقش‌های سرور مثل sysadmin یا securityadmin نکنی — این نقش‌ها در سطح کل سرور عمل می‌کنند و دسترسی به همه‌ی پایگاه‌داده‌ها را می‌دهند، حتی اگر در User Mapping فقط یک پایگاه‌داده را تیک زده باشی.

همین کار با T-SQL

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 اجرا کن:

sql
SELECT name AS database_name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1;

جمع‌بندی

  • یک Login به‌طور پیش‌فرض به هیچ پایگاه‌داده‌ای دسترسی ندارد.
  • برای محدودکردن دسترسی به یک پایگاه‌داده‌ی خاص، فقط باید در همان یک پایگاه‌داده User بسازی — نیازی به تنظیم اضافه نیست.
  • مراقب نقش‌های سطح سرور (مثل sysadmin) باش؛ آن‌ها این محدودیت را دور می‌زنند.

برای یادگیری کامل‌تر مدیریت دسترسی، درس‌های Roles و Permissions را در دوره‌ی SQLFarsi ببین.

می‌خوای مفاهیم امنیت SQL Server را کامل یاد بگیری؟

فصل امنیت دوره‌ی SQLFarsi، Login، User، Role و Permission را از پایه توضیح می‌دهد.

شروع فصل امنیت