محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

آموزش اولویت بندی درخواستهای Login به دومین کنترلرها به زبان ساده

شاید تا به حال بر این باور بوده اید که در یک شبکه زمانیکه شما دو یا بیش از دو عدد Domain Controller راه اندازی می کنید درخواست ها بین این Domain Controller ها برای احراز هویت کلاینت ها و همچنین Logon به سیستم ها تقسیم می شود. این برداشت تا حدودی نادرست است. ما می توانیم بر اساس نیاز خودمان سرورهای Domain Controller را برای احراز هویت و Logon کلاینت ها اولویت بندی کنیم و در واقع درخواست های مختلف را به سرورهای مختلف ارسال کنیم و خودمان بصورت دستی برای کلاینت ها محدوده احزا هویت تعریف کنیم . اینکار توسط دو پارامتر در رکوردهای SRV سرویس DNS به نامهای Weight و Priority تعریف می شود و شما با دستکاری این دو رکورد در LDAP SRV Record می توانید اولویت های خود را تغییر بدهید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
وب سایت توسینسو

تصور کنید که در شبکه ای قرار دارید که نرم افزارهای سرورهای شما بصورت جداگانه و کلاینت های شما هم بصورت جداگانه به Domain Controller درخواست احراز هویت می دهند و آنقدر سر Domain Controller شلوغ می شود که بعضا نمی تواند به درخواست های کلاینت ها پاسخ بدهد ، در چنین مواقعی شما می توانید دو عدد Domain Controller در شبکه با weight و priority مختلف ایجاد کنید که یکی از آنها فقط درخواست های کلاینت ها را پاسخگویی کند و دیگری فقط و فقط درخواست های نرم افزارهای کاربردی سرورها را پاسخ بدهد.

کلاینت ها زمانیکه می خواهند به یک Domain Controller درخواست Login بدهند ابتدا درخواست خود را به DNS سرور ارسال می کنند ، DNS سرور لیستی از Domain Controller هایی را که سرویس Kerberos و LDAP ارائه می دهند را به کلاینت ارسال می کند ، در این لیست دو پارامتر weight و priority نیز ارسال می شود که کلاینت بر اساس آنها تصمیم می گیرد که باید درخواست خود را به کدامیک از سرورهای مذکور ارسال کند به مثال زیر توجه کنید در این شبکه سه عدد Domain Controller وجود دارد که درخواست کلاینت به شکل زیر پاسخ داده شده است :

_exmp1.tcp.tosinso.com IN SRV 10 50 389 server1.tosinso.com
_exmp1.tcp.tosinso.com IN SRV 10 50 389 server2.tosinso.com
_exmp1.tcp.tosinso.com IN SRV 10 50 389 server3.tosinso.com

در مثالی که در بالا مشاهده می کنید و نتیجه Query یک کلاینت از DNS سرور برای پیدا کردن Domain Controller مناسب برای Login به سیستم است عدد 10 نمایانگر priority یا اولویت و عدد 50 به عنوان weight یا بار در server1.tosinso.com نشان داده شده اند. در مثال بالا کلاینت های شبکه همیشه برای احراز هویت از سرور server1.tosinso.com استفاده خواهند کرد و تا زمانیکه این سرور در شبکه فعال باشد به سراغ سرورهای دیگر نخواهند رفت. اگر می خواهید کلاینت های شما همیشه برای احراز هویت از سرور server2.tosinso.com استفاده کنند بایستی مقدار عددی priority مربوط به سرور server2.tosinso.com را در کنسول مدیریتی DNS تغییر بدهید.

کلاینت ها در صورتیکه همه موارد از قبیل weight و priority برای همه سرورها برابر باشد همیشه از سرور اولی که در Query بازگشت داده می شود برای احراز هویت استفاده می کنند. کلاینت ها همیشه برای احراز هویت به دنبال سروری هستند که دارای priority پاییتنری باشد. برای مثال اگر شما عدد priority مربوط به سرور server2.tosinso.com را تغییر بدهید و از عدد 10 به عدد 6 تبدیل کنید. بعد از اعمال تغییرات در SRV Record در DNS سرور ، زمانیکه کلاینت از سرور برای رکوردهای مورد نظر Domain Controller ها Query بگیرد اینبار پاسخ DNS سرور به شکل زیر خواهد بود و ترتیب معرفی سرورها تغییر خواهد کرد :

_exmp1.tcp.tosinso.com IN SRV 6 50 389 server2.tosinso.com
_exmp1.tcp.tosinso.com IN SRV 10 50 389 server1.tosinso.com
_exmp1.tcp.tosinso.com IN SRV 10 50 389 server3.tosinso.com

هر کلاینتی که به شبکه دومین ویندوزی ما Join می شود برای پیدا کردن Domain Controller مورد نظر خود برای Login کردن به اکتیودایرکتوری و پروتکل LDAP از یک Component به نام DCLocator که به عنوان یکی از اجزای سرویس NETLOGON وجود دارد استفاده می کند. همانطور که قبلا هم در پاراگراف های قبلی در این مقاله انجمن تخصصی فناوری اطلاعات ایران ذکر کردیم باید منطقی پشت این ماجرا باشد که بعد از درخواست کلاینت از DNS سرور DCLocator از کجا متوجه می شود که باید از کدام Domain Controller استفاده کند ؟ بر اساس تجربیات خودم ( Unity ) و همچنین جستجوهایی که در این خصوص انجام داده ام به این نتایج رسیده ام که عوامل زیر برای تعیین کردن سرور Login کلاینت ها بسیار مهم هستند :

  1. نسخه یا Version سیستم عامل سرور Domain Controller ( سیستم عامل جدیدتر زودتر از سیستم عامل قدیمی جواب می دهد)
  2. واکنش سریعتر سرورها ( معمولا سرورها با منابع بیشتر سخت افزاری سریعتر پاسخ می دهند )
  3. ترتیب رکورد هایی که از طریق DNS مشابه پاراگراف های قبلی بازگشت داده می شود ( رکوردهای gc__ و ldap__ )
  4. مقادیر priority و weight ای که برای رکوردهای SRV دامین کنترلرها تعریف می شود.

موارد متعدد و سناریوهای مختلفی وجود دارد که در آنها شما مجبور هستید که درخواست های LDAP ای که توسط سیستم های کلاینت ها ارسال می شوند را بین بیش از یک Domain Controller تقسیم کنید ، بصورت پیشفرض بر خلاف تصوراتی که می شود اکثر درخواست های کلاینت ها توسط یک Domain Controller انجام می شود ، از جمله این سناریوها که ما باید درخواست های LDAP را به سرورهای مختلف تقسیم کنیم به موارد زیر می توانیم اشاره کنیم :

  1. Domain Controller ای که دارای نقش PDC Emulator است بسیار پر کار شده است و کارایی Login و احراز هویت کاربران کم شده است
  2. بروز رسانی و یا مهاجرت سرورهای Domain Controller به یک سیستم عامل جدید باعث شده همه درخواست ها در سیستم عامل جدید پاسخگویی شوند
  3. می خواهید احراز هویت سرورها و سرویس های سازمان توسط یک Domain Controller اختصاصی انجام شود و نه توسط همان Domain Controller ای که همه سیستم های کلاینت ها از آن استفاده می کنند.

سرویس Netlogon از دو پارامتر برای کنترل کردن پاسخ های درخواست های LDAP به نام های LdapSrvWeigth و LdapSrvPriority استفاده می کند. بصورت پیشفرض هر DC یک priority با عدد صفر و یک weight با عدد 100 دارد همانطور که در مثال اول همین مقاله مشاهده کردید. پارامتر weight باعث می شود که DC هایی که دارای priority یکسان هستند اما weight بالاتری دارند پاسخگو تر باشند. اما اگر پارامتر priority پیکربندی شود بر روی پارامتر weight اولویت خواهد داشت.Domain Controller هایی که دارای بالاترین نمره weight باشند و کمترین priority را داشته باشند بیشتر با آنها تماس برقرار می شود. برای اینکه این رفتار را بتوانیم تغییر بدهیم ، بایستی دو عدد کلید رجیستری در Domain controller های مورد نظرمان بصورت REG__DWORD در مسیر زیر به نامهای LdapSrvWeight و LdapSrvPriority ایجاد کنیم :

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters

عددی که می توانیم انتخاب کنیم برای هر یک از پارامترهای ایجاد شده می تواند بین 0 تا 65535 باشد ، بعد از اعمال تغییرات بر روی Domain Controller مورد نظر سرویس Netlogon را یکبار Restart کنید و در کنسول DNS به SRV Record های مورد نظر مراجعه کنید و مطمئن شوید که تغییرات اعمال شده است ، تغییرات معمولا بلا فاصله ایجاد می شود ، برای مثال در جاییکه شما می خواهید دو عدد سرور همیشه پاسخگو باشند پیشنهاد می شود که weight سرور اول را 50 و priority آن را 10 قرار بدهید و برای سرور دوم عدد 100 را برای weight و عدد 10 را برای priority تعریف کنید و در نهایت برای سومین سرور که سرور بیکار ما خواهد بود عدد 100 را برای priority و عدد 0 را برای weight قرار بدهید .


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات