یکی از اصول پایهای امنیت پایگاهداده، اصل حداقل دسترسی لازم (Principle of Least Privilege) است: هر کاربر یا برنامه باید فقط به همان چیزی دسترسی داشته باشد که واقعاً به آن نیاز دارد — نه بیشتر. اگر یک اپلیکیشن فقط باید با پایگاهدادهی ShopDB کار کند، هیچ دلیلی ندارد که به HR_DB یا سایر پایگاهدادههای روی همان سرور هم دسترسی داشته باشد.
پیشنیاز این راهنما، درک تفاوت Login و User است — اگر با آن آشنا نیستی، اول نحوه ساخت User و Login و تفاوت آنها را بخوان.
CREATE LOGIN shop_app WITH PASSWORD = N'Str0ngP@ssw0rd!';
برای اینکه این Login بهطور پیشفرض وقتی وصل میشود روی پایگاهدادهی درست باز شود (نه master)، در SSMS هنگام ساخت Login، در تب General فیلد Default database را روی ShopDB تنظیم کن:
در تب User Mapping، فقط تیک ShopDB را بزن و بقیهی پایگاهدادهها را خالی بگذار:
sysadmin یا securityadmin نکنی — این نقشها در سطح کل سرور عمل میکنند و دسترسی به همهی پایگاهدادهها را میدهند، حتی اگر در User Mapping فقط یک پایگاهداده را تیک زده باشی.-- ساخت 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;
برای یادگیری کاملتر مدیریت دسترسی، درسهای Roles و Permissions را در دورهی SQLFarsi ببین.
فصل امنیت دورهی SQLFarsi، Login، User، Role و Permission را از پایه توضیح میدهد.
شروع فصل امنیت