خانه/ امنیت/ Logins

Login: کارت ورود به خودِ سرور، نه به یک پایگاه‌داده‌ی خاص

مبتدی ۱۱ دقیقه مطالعه
این درس و بقیه‌ی درس‌های این فصل (به‌جز تزریق SQL) درباره‌ی مکانیزم امنیتی SQL Server هستند. SQLite (موتور همین Playground) هیچ سیستم احراز هویت یا مجوزدهی‌ای ندارد — امنیتش فقط به سطح دسترسی فایل سیستم‌عامل محدود می‌شود. به همین دلیل، درس‌های این فصل جعبه‌ی اجرا ندارند؛ روی کدهای واقعی SQL Server تمرکز می‌کنیم.

وقتی به یک نمونه (Instance) از SQL Server وصل می‌شوی، اولین سوالی که پاسخ داده می‌شود این است: «اصلاً تو کی هستی؟» — این پاسخ را Login می‌دهد. Login یک شناسه در سطح سرور است؛ به‌تنهایی هیچ اجازه‌ای برای دیدن یا تغییر داده‌ی هیچ پایگاه‌داده‌ای نمی‌دهد — فقط اجازه‌ی «وارد شدن به سرور» را می‌دهد.

دو روش احراز هویت

  • Windows Authentication: از حساب کاربری ویندوز که کاربر با آن وارد سیستم‌عامل شده استفاده می‌کند. رمز عبور جداگانه‌ای نیاز نیست — اعتبارسنجی به‌طور کامل توسط Active Directory/ویندوز انجام می‌شود. گزینه‌ی پیشنهادی مایکروسافت برای محیط‌های سازمانی.
  • SQL Server Authentication: نام کاربری و رمز عبوری که مستقل از ویندوز، مستقیم داخل خودِ SQL Server تعریف و ذخیره می‌شود. برای برنامه‌ها یا کاربرانی که خارج از دامنه‌ی ویندوز هستند لازم است.
sql
-- ساخت یک Login با SQL Server Authentication:
CREATE LOGIN ali_app WITH PASSWORD = N'Str0ngP@ssw0rd!';

-- ساخت یک Login که به یک حساب ویندوزی نگاشت می‌شود:
CREATE LOGIN [DOMAIN\ali] FROM WINDOWS;

Login به‌تنهایی کافی نیست

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

دیدن Loginهای سرور

همه‌ی Loginها در نمای sys.server_principals نگه‌داری می‌شوند. ستون type_desc نوع هر Login را نشان می‌دهد (SQL_LOGIN، WINDOWS_LOGIN یا WINDOWS_GROUP):

sql
SELECT name, type_desc, is_disabled, create_date
FROM sys.server_principals
WHERE type IN ('S', 'U', 'G')      -- SQL / Windows user / Windows group
ORDER BY name;

مدیریت Login: غیرفعال‌کردن، تغییر رمز و حذف

sql
ALTER LOGIN ali_app DISABLE;     -- بدون حذف، ورود را متوقف می‌کند
ALTER LOGIN ali_app ENABLE;

-- تغییر رمز با الزام به رعایت سیاست رمز عبور
ALTER LOGIN ali_app WITH PASSWORD = N'N3w!Str0ngPass#', CHECK_POLICY = ON;

DROP LOGIN ali_app;              -- حذف کامل (ابتدا Userهای وابسته را بررسی کن)

گزینه‌های CHECK_POLICY و CHECK_EXPIRATION سیاست پیچیدگی و انقضای رمز ویندوز را روی Login اعمال می‌کنند. روی سرورهای واقعی آن‌ها را فعال نگه دار.

Login گروهی ویندوز

به‌جای ساختن Login برای تک‌تک کاربران، می‌توان یک گروه ویندوز (مثلاً DOMAIN\Accountants) را Login کرد؛ با اضافه یا حذف شدن افراد از گروه در Active Directory، دسترسی‌شان خودکار تغییر می‌کند و نیازی به دستکاری SQL Server نیست.

اگر هنگام اتصال با خطای Login failed for user روبه‌رو شدی، راهنمای حل مشکل احراز هویت در SQL Server را ببین؛ و برای انتخاب نوع احراز هویت، مقاله‌ی Windows در برابر SQL Authentication را.

جمع‌بندی این درس

  • Login یک شناسه در سطح کل سرور SQL Server است، نه یک پایگاه‌داده‌ی خاص.
  • دو روش احراز هویت داریم: Windows Authentication و SQL Server Authentication.
  • داشتن Login به‌تنهایی، هیچ اجازه‌ی دسترسی به داده‌های هیچ پایگاه‌داده‌ای نمی‌دهد.

در درس بعدی می‌بینیم چطور یک Login را به یک User در یک پایگاه‌داده‌ی مشخص نگاشت می‌کنیم تا واقعاً بتواند به داده دسترسی داشته باشد.

تمرین‌های خودآزمایی

اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.

۱یک Login با SQL Authentication بساز.نمایش پاسخ
پاسخ
CREATE LOGIN ali_app WITH PASSWORD = 'Str0ng!Pass#2026';
۲Login ویندوزی و Login از نوع SQL چه فرقی دارند؟نمایش پاسخ
پاسخ

Login ویندوزی از حساب ویندوز/دامنه استفاده می‌کند (CREATE LOGIN [DOMAIN\user] FROM WINDOWS) و رمز در SQL Server نگهداری نمی‌شود؛ Login نوع SQL نام‌کاربری و رمز داخل خودِ SQL Server دارد.