راهنمای جامع پیکربندی احراز هویت Kerberos برای SQL Server: گام به گام
Kerberos یک پروتکل احراز هویت شبکه است که برای امنسازی تعاملات سرویسگیرنده و سرویسدهنده طراحی شده است. پیکربندی صحیح Kerberos برای SQL Server در سناریوهای خاصی از جمله سرورهای لینکشده (Linked Servers)، تراکنشهای توزیعشده (Distributed Transactions)، گزارشگیری و سرویسهای تحلیلی، و به خصوص برای احراز هویت “double-hop” یا چندین مرحلهای ضروری است. عدم پیکربندی صحیح Kerberos میتواند منجر به خطاهای اتصال، مشکلات کارایی و نقض امنیتی شود. درک عمیق نحوه عملکرد Kerberos و مدیریت SPNها (Service Principal Names) کلید پیادهسازی موفق آن است.
Kerberos از یک ساختار مبتنی بر تیکت برای تأیید هویت کاربران و سرویسها استفاده میکند. این فرآیند با درخواست کاربر از مرکز توزیع کلید (KDC) برای دریافت تیکت آغاز میشود. KDC شامل دو بخش سرویس احراز هویت (Authentication Service – AS) و سرویس اعطای تیکت (Ticket Granting Service – TGS) است. ابتدا AS یک TGT (Ticket Granting Ticket) به کاربر میدهد. سپس کاربر با استفاده از TGT خود از TGS درخواست یک Service Ticket برای دسترسی به یک سرویس خاص (مانند SQL Server) را میکند. در نهایت، کاربر Service Ticket را به سرویسدهنده ارائه میدهد تا احراز هویت و اجازه دسترسی انجام شود.
برای اینکه Kerberos بتواند به درستی کار کند، هر سرویسی که از Kerberos استفاده میکند، باید یک نام اصلی سرویس (SPN) منحصر به فرد در اکتیو دایرکتوری داشته باشد. SPN در واقع شناسه سرویس در شبکه است و برای نگاشت یک سرویس به یک حساب کاربری اکتیو دایرکتوری استفاده میشود. اگر SPN برای سرویس SQL Server شما به درستی ثبت نشده باشد، احراز هویت Kerberos با شکست مواجه شده و SQL Server به طور پیشفرض از NTLM استفاده خواهد کرد که محدودیتهایی دارد (به خصوص برای سناریوهای double-hop).
فرمت کلی SPN به شرح زیر است:
serviceclass/host:port/servicename
برای SQL Server، کلاس سرویس معمولاً `MSSQLSvc` است و فرمتهای رایج SPN به این شکل هستند:
MSSQLSvc/hostname:port
MSSQLSvc/hostname.fullyqualifieddomainname:port
اگر SQL Server روی پورت پیشفرض 1433 اجرا میشود، پورت را میتوان حذف کرد.
برای یک اینستنس پیشفرض SQL Server که با پورت 1433 کار میکند، SPNها به شکل زیر خواهند بود:
MSSQLSvc/SQLSERVERHOSTNAME:1433
MSSQLSvc/SQLSERVERHOSTNAME.domain.com:1433
اگر اینستنس پیشفرض از پورت پیشفرض 1433 استفاده میکند، میتوان پورت را حذف کرد:
MSSQLSvc/SQLSERVERHOSTNAME
MSSQLSvc/SQLSERVERHOSTNAME.domain.com
برای یک اینستنس نامگذاری شده (Named Instance) SQL Server، باید نام اینستنس نیز در SPN گنجانده شود.
اگر اینستنس نامگذاری شده `SQLINSTANCENAME` روی پورت `2000` اجرا میشود، SPNها به این صورت هستند:
MSSQLSvc/SQLSERVERHOSTNAME:2000
MSSQLSvc/SQLSERVERHOSTNAME.domain.com:2000
MSSQLSvc/SQLSERVERHOSTNAME:2000/SQLINSTANCENAME
MSSQLSvc/SQLSERVERHOSTNAME.domain.com:2000/SQLINSTANCENAME
ثبت SPNها میتواند به صورت خودکار یا دستی انجام شود. زمانی که SQL Server با حساب `Local System` یا `Network Service` اجرا میشود، SPNها به طور خودکار در هنگام راهاندازی سرویس ثبت میشوند. اما اگر SQL Server با یک حساب کاربری دامنه (Domain User Account) اجرا شود، باید SPNها را به صورت دستی ثبت کنید، مگر اینکه به حساب سرویس SQL Server مجوزهای لازم برای ثبت SPN داده شده باشد. برای ثبت SPNها نیاز به دسترسی مدیر دامنه یا کاربر با مجوزهای `Validated write to service principal name` دارید.
برای بررسی SPNهای موجود برای یک حساب کاربری خاص، میتوانید از ابزار `setspn` در خط فرمان استفاده کنید. فرض کنید سرویس SQL Server شما با حساب `SQLServiceAccount` اجرا میشود:
setspn -L SQLServiceAccount
این دستور لیست تمام SPNهای ثبت شده برای `SQLServiceAccount` را نشان میدهد. اگر SPN مربوط به اینستنس SQL Server شما وجود ندارد یا اشتباه است، باید آن را اضافه یا اصلاح کنید.
برای ثبت یک SPN جدید، از دستور `setspn -A` استفاده میشود:
setspn -A MSSQLSvc/SQLSERVERHOSTNAME:1433 SQLServiceAccount
setspn -A MSSQLSvc/SQLSERVERHOSTNAME.domain.com:1433 SQLServiceAccount
دقت کنید که SPNها باید منحصر به فرد باشند. اگر SPN تکراری وجود داشته باشد، Kerberos احراز هویت را برای هیچ یک از سرویسهای مرتبط انجام نمیدهد. برای حذف یک SPN نادرست، از دستور `setspn -D` استفاده کنید:
setspn -D MSSQLSvc/SQLSERVERHOSTNAME:1433 SQLServiceAccount
یک جنبه مهم دیگر در پیکربندی Kerberos، قابلیت “Delegation” است. Delegation به یک سرویس اجازه میدهد تا هویت کاربر را به یک سرویس دیگر نمایندگی کند. این ویژگی برای سناریوهای “double-hop” مانند سرورهای لینکشده یا تراکنشهای توزیعشده که در آن SQL Server باید به یک منبع دیگر با هویت کاربر اصلی دسترسی پیدا کند، حیاتی است.
انواع Delegation عبارتند از:
1. Unconstrained Delegation (Delegation نامحدود): این روش قدیمیتر و کمامنیتتر است که به سرویس اجازه میدهد هویت کاربر را به هر سرویس دیگری نمایندگی کند. این روش از نظر امنیتی توصیه نمیشود و باید از آن اجتناب شود.
2. Constrained Delegation (Delegation محدود): این روش امنتر است و به سرویس اجازه میدهد تا هویت کاربر را فقط به سرویسهای خاص و از پیش تعریف شده نمایندگی کند. برای پیکربندی این مورد، به کنسول `Active Directory Users and Computers` رفته، ویژگیهای حساب سرویس SQL Server را باز کرده و در تب `Delegation`، گزینه `Trust this computer for delegation to specified services only` را انتخاب کنید و سپس سرویسهایی که SQL Server باید به آنها دسترسی داشته باشد را اضافه کنید.
3. Resource-based Constrained Delegation (Delegation محدود مبتنی بر منبع): این روش جدیدتر و امنتر است که در ویندوز سرور 2012 معرفی شد. در این روش، به جای اینکه حساب سرویسدهنده را برای نمایندگی به یک سرویس خاص پیکربندی کنید، سرویس گیرنده نهایی (که قرار است هویت به آن نمایندگی شود) را برای پذیرش نمایندگی از یک حساب سرویس خاص پیکربندی میکنید. این تنظیمات روی شیء منبع (سرور هدف) اعمال میشود.
برای عیبیابی مشکلات Kerberos، چندین ابزار مفید وجود دارد:
`klist`: این ابزار لیست تیکتهای Kerberos موجود در حافظه پنهان کاربر یا سیستم را نمایش میدهد.
klist tickets
`nltest`: برای بررسی ارتباط با کنترلکنندههای دامنه و بررسی وضعیت trustها استفاده میشود.
nltest /dsgetdc:domain.com
nltest /sc_query:domain.com
`setspn`: همانطور که قبلاً ذکر شد، برای مدیریت SPNها استفاده میشود.
Log Parser: برای تجزیه و تحلیل رویدادهای مربوط به Kerberos در Event Viewer.
KerbTray (یک ابزار GUI قدیمیتر): برای مشاهده تیکتهای Kerberos.
Wireshark: برای تجزیه و تحلیل ترافیک شبکه و بررسی بستههای Kerberos.
با پیروی دقیق از این دستورالعملها و استفاده از ابزارهای مناسب، میتوانید احراز هویت Kerberos را برای SQL Server خود به درستی پیکربندی کرده و از مزایای امنیتی و عملکردی آن بهرهمند شوید. پیکربندی صحیح SPNها و Delegation، ستون فقرات یک محیط SQL Server مبتنی بر Kerberos است و به شما اطمینان میدهد که برنامههای کاربردی شما در سناریوهای پیچیده نیز به درستی کار میکنند.