احراز هویت کاربران در پراکسی سرور یکی از روش هایی است که اغلب در ایران از آن برای مدیریت دسترسی کاربران شبکه محلی به اینترنت استفاده می شود .معمولا در شبکه های ویندوزی از پراکسی سرور ISA برای این منظور استفاده می گردد . اما اگر به هر دلیلی تصمیم گرفته اید تا از پراکسی Squid برای این منظور بهره بگیرید از چه راهکاری استفاده می کنید ؟ آیا تمامی کاربران را در سرویس های معادل ActiveDirectory در لینوکس دوباره تعریف می کنید ؟ اگر تعداد کاربران تعریف شده کم است همین کار را توصیه می کنم ولی اگر تعریف دوباره کاربران در سرویس هایی مانند Samba یا LDAP برای شما امکان پذیر نیست یا اعمال سیاست های اعمالی به کاربران و گروههای مختلف در اکتیو دایرکتوری در سرویس های مبتنی بر لینوکس غیر ممکن یا مشکل ساز باشد چه می کنید؟
در این مقاله به نحوه احراز هویت کاربران اکتیودایرکتوری در اسکویید می پردازم .
Squid از سه روش برای بدست آوردن اطلاعات مورد نیاز برای احراز هویت کاربران بهره می گیرد . که عبارتند از :
1 - Basic
2- Digest
3 – NTLM
از لحاظ امنیتی روش Basic بسیار ضعیف است و روش های Digest و NTLM از امنیت بالاتری برخوردار هستند.
Squid برای اعمال این روش ها نیاز به برنامه های ( اسکریپت ها ) کمکی دارد که به authentication helpers مشهورند . برای مشاهده لیستی از این برنامه های کمکی می توانید محتوای دایرکتوری /usr/bin/squid را مشاهده کنید .

اگر اسکویید را از طریق source code کامپایل و نصب می نمایید در هنگام کامپایل باید از گزینه مناسب برای استفاده از برنامه کمکی بهره بگیرید .
مثال :
درخواست های احراز هویت که از کلاینت ها به سوی سرور پراکسی اسکویید ارسال می شود در یک صف قرار می گیرند . و اسکویید به ترتیب به آنها ترتیب اثر خواهد داد .
اسکویید این قابلیت را دارد تا نتایج احراز هویت را کش کند و به این ترتیب از بار پردازش ها بر خود بکاهد . اگر بار این پردازش ها بر اسکویید از حدی بیشتر شود اسکویید با ارسال یک پیام fatal error متوقف می شود .
برای احراز هویت کاربران اکتیودایرکتوری در اسکویید به دو روش Basic و NTLM نیاز است و در نتیجه در این مقاله فقط به بررسی این دورش و تگ های مربوط به آنها می پردازیم . ( اگر چه اکثر تگ های موجود در روش Digest نیز مشابهند .)
1 – Basic Authentication :
ساده ترین و نا امن ترین روش احراز هویت از طریق پروتوکل http روش Basic است . در این روش تبادل اطلاعات از جمله نام کاربری و کلمه عبور به صورت فایل ها (رشته های ) متنی ساده است . اگر چه این رشته های به کاراکتر های خاصی کد می شوند ولی دیکد کردن آنها به سادگی امکان پذیر است .
به عنوان مثال فرض کنید شما از نام کاربری Fannie و کلمه عبور FuRpAnTsClUb برای احراز هویت خود جهت دسترسی به اینترنت از طریق پراکسی اسکویید استفاده می کنید .
در روش Basic ابتدا نام کاربری و کلمه عبور با استفاده از یک کالن از یکدیگر جدا می شوند :
سپس رشته بدست آمده توسط کد گذاری Base64 که در RFC شماره 2045 به آن پرداخته شده است کد گذاری می شود . این رشته کد گذاری شده در سرآیند http به صورت زیر نمایش داده می شود :
بدین ترتیب هر کسی با Sniff کردن ترافیک شبکه شما و استفاده از اسکریپت base64.py که به طور پیش فرض در هنگام نصب pythone در سیستم شما کپی می شود قادر خواهد بود به نام کاربری و پسوورد شما دست یابد .

در روش Basic از پارامترهای زیر می توان برای تنظیم خصوصیات مختلف استفاده کرد :
2 – پارامتر children : مشخص می کند که اسکویید مجاز است تا چه تعداد پردازش برای عمل احراز هویت اختصاص دهد . مقدار پیش فرض 5 است .
3 – پارامتر realm : در اینجا realm را میتوان نام دامنه اکتیو دایرکتوری که کاربران باید از آن خوانده شود در نظر گرفت . ( توجه شود با حروف بزرگ نوشته می شود . )
4 – پارامتر credentials ttl : زمان پیش فرضی را مشخص می کند که اسکویید نتایج عمل احراز هویت کاربران را در خود ذخیره ( کش ) می کند . واضح است که هر چه این مقدار بیشتر باشد بار پردازش های احراز هویت بر اسکویید کمتر خواهد بود .
این نکته حائز اهمیت است که عمل کش شدن نتایج فقط برای نتایج مثبت انجام می گیرد و نه منفی .
همچنین مقدار زیاد این پارامتر باعث به خطر افتادن امنیت و مشکلات جدی خواهد شد .
مثال : تنظیم پارامتر های مورد نیاز اسکویید برای بهره گرفتن از احراز هویت از طریق pam
البته در ادامه نیاز است تا با تعریف ACL زیر و دسترسی به آن احراز هویت فقط برای کاربران مجاز انجام گیرد:
( توجه کنید که در این مثال فقط تنظیمات squid بیان شده است و برای احراز هویت با استفاده از pam به تنظیمات لازم برای pam نیاز است که خارج از حیطه این مقاله است . )
از دیگر برنامه های کمکی برای احراز هویت در این روش می توان به NCSA ( ncsa_auth ) ، LDAP ( squid_ldap_auth ) و SMB ( smb_auth ) نام برد .
2 – Microsoft NTLM Authentication
NTLM که مخفف واژه های NT Lan Manager است پروتوکلی است که توسط Microsoft ایجاد و توسعه داده شد و گروه های مختلفی از جمله گروه squid از اطلاعات محدود موجود و آنالیز ترافیک شبکه آنرا مهندسی معکوس کرده اند .
NTLM از مکانیزم دستدهی سه طرفه ) 3 – way handshake ) برای احراز هویت یک اتصال بهره می برد . در این روش وقتی یک اتصال در احراز هویت جواب مثبت دریافت کرد هر درخواستی در این اتصال دیگر نیازی به احراز هویت نخواهد داشت .
NTLM از توابع رمزنگاری و مقادیر کد گذاری شده در تبادلات داده استفاده می کند .
اگر چه NTLM امنیت بسیار بالاتری نسبت به روش Basic فراهم می آورد ولی متخصصان عقیده دارند که این روش نسبت به روش احراز هویت از طریق Digest از امنیت ضعیف تری برخوردار است .
در روش NTLM از پارامترهای زیر می توان برای تنظیم خصوصیات مختلف استفاده کرد :
موارد 1 و 2 همانند روش Basic عمل می کنند و دو پارامتر بعدی خصوصیات احراز هویت اتصال بین کلاینت و سرور را مشخص می کنند .
( در 3 – way handshake ، ابتدا کلاینت درخواست اتصال را با ارائه اطلاعاتی به سرور ارسال می کند ، سپس سرور پیامی به نام challenge به کلاینت ارسال می کند و در آخر کلاینت درخواست خود را دوباره با جوابی مثبت به challenge به سرور ارسال می کند . )
3 – پارامتر max_challenge_reuse : مشخص می کند که پیام challenge چند بار می تواند مورد استفاده قرار گیرد . مقدار پیش فرض 0 است و مشخص می کند که هیچ گاه از یک پیام challenge
دوبار استفاده نخواهد شد .
بالابردن این مقدار بار انجام عمل احراز هویت توسط اسکویید را کم می کند و متعاقبا از امنیت می کاهد .
4 – پارامتر max_challenge_lifetime : میزان زمانی که پیام challenge معتبر است را مشخص می کند . مقدار پیش فرض 60 ثانیه است .
مثال :
برای این کار شما ابتدا باید لینوکس را به اکتیو دایرکتوری join کنید . ( در این پست طریقه join کردن linux را به windows 2003 Active Directory گفتم )
و سپس فایل اسکویید ) /etc/squid.conf ) را با استفاده از پارامتر های زیر ویرایش کنید :
1 - اگر از کانفیگ اسکوییدی استفاده می کنید که به رنجه خاصی از شبکه دسترسی کامل داده شده است به عنوان مثال :http_access allow LAN1 و اکنون می خواهید authentication برای آنها انجام گیرد باید این خطوط را حذف کنید .
2 – اگر در حال حاضر از اسکویید در حالت شفاف ( transparent ) استفاده می کنید آنرا از حالت شفاف خارج سازید .
3 – بعد از اعمال تغییرات سرویس اسکویید را ریستارت کنید . )
اکنون اگر تنظیمات مربوط به آی پی و پورت سرور پراکسی را مرورگر کلاینت ها را انجام دهید هنگام در خواست کاربران برای مرور اینترنت به کادری که نام کاربری و کلمه عبور را می خواهد مواجه خواهند شد .
امید مهاجرانی
Omid dot mohajerani at gmail dot com
http://linux-notes.blogfa.com
در این مقاله به نحوه احراز هویت کاربران اکتیودایرکتوری در اسکویید می پردازم .
Squid از سه روش برای بدست آوردن اطلاعات مورد نیاز برای احراز هویت کاربران بهره می گیرد . که عبارتند از :
1 - Basic
2- Digest
3 – NTLM
از لحاظ امنیتی روش Basic بسیار ضعیف است و روش های Digest و NTLM از امنیت بالاتری برخوردار هستند.
Squid برای اعمال این روش ها نیاز به برنامه های ( اسکریپت ها ) کمکی دارد که به authentication helpers مشهورند . برای مشاهده لیستی از این برنامه های کمکی می توانید محتوای دایرکتوری /usr/bin/squid را مشاهده کنید .

اگر اسکویید را از طریق source code کامپایل و نصب می نمایید در هنگام کامپایل باید از گزینه مناسب برای استفاده از برنامه کمکی بهره بگیرید .
مثال :
./configure -- enable_basic_auth_helpers = LDAP , NCSA
درخواست های احراز هویت که از کلاینت ها به سوی سرور پراکسی اسکویید ارسال می شود در یک صف قرار می گیرند . و اسکویید به ترتیب به آنها ترتیب اثر خواهد داد .
اسکویید این قابلیت را دارد تا نتایج احراز هویت را کش کند و به این ترتیب از بار پردازش ها بر خود بکاهد . اگر بار این پردازش ها بر اسکویید از حدی بیشتر شود اسکویید با ارسال یک پیام fatal error متوقف می شود .
برای احراز هویت کاربران اکتیودایرکتوری در اسکویید به دو روش Basic و NTLM نیاز است و در نتیجه در این مقاله فقط به بررسی این دورش و تگ های مربوط به آنها می پردازیم . ( اگر چه اکثر تگ های موجود در روش Digest نیز مشابهند .)
1 – Basic Authentication :
ساده ترین و نا امن ترین روش احراز هویت از طریق پروتوکل http روش Basic است . در این روش تبادل اطلاعات از جمله نام کاربری و کلمه عبور به صورت فایل ها (رشته های ) متنی ساده است . اگر چه این رشته های به کاراکتر های خاصی کد می شوند ولی دیکد کردن آنها به سادگی امکان پذیر است .
به عنوان مثال فرض کنید شما از نام کاربری Fannie و کلمه عبور FuRpAnTsClUb برای احراز هویت خود جهت دسترسی به اینترنت از طریق پراکسی اسکویید استفاده می کنید .
در روش Basic ابتدا نام کاربری و کلمه عبور با استفاده از یک کالن از یکدیگر جدا می شوند :
Fannie:FuRpAnTsClUb
سپس رشته بدست آمده توسط کد گذاری Base64 که در RFC شماره 2045 به آن پرداخته شده است کد گذاری می شود . این رشته کد گذاری شده در سرآیند http به صورت زیر نمایش داده می شود :
Authorization: Basic RmFubmllOkZ1UnBBblRzQ2xVYgo=
بدین ترتیب هر کسی با Sniff کردن ترافیک شبکه شما و استفاده از اسکریپت base64.py که به طور پیش فرض در هنگام نصب pythone در سیستم شما کپی می شود قادر خواهد بود به نام کاربری و پسوورد شما دست یابد .
echo RmFubmllOkZ1UnBBblRzQ2xVYgo= | /usr/local/lib/python.5/base64.py –d

در روش Basic از پارامترهای زیر می توان برای تنظیم خصوصیات مختلف استفاده کرد :
1 - auth_param basic programcommand
2 - auth_param basic childrennumber
3 - auth_param basic realm String
4 - auth_param basic credentialsttltime-specification
1 – پارامتر program : دستور مورد نیاز برای اجرای برنامه کمکی و آرگومان های مورد نیاز ( در صورت وجود ) را مشخص می کند .در بیشتر مواقع این پارامتر مشخص کننده مسیر به یکی از authentication helpers است ، که بطور پیش فرض در مسیر /usr/local/squid واقع اند .2 - auth_param basic childrennumber
3 - auth_param basic realm String
4 - auth_param basic credentialsttltime-specification
2 – پارامتر children : مشخص می کند که اسکویید مجاز است تا چه تعداد پردازش برای عمل احراز هویت اختصاص دهد . مقدار پیش فرض 5 است .
3 – پارامتر realm : در اینجا realm را میتوان نام دامنه اکتیو دایرکتوری که کاربران باید از آن خوانده شود در نظر گرفت . ( توجه شود با حروف بزرگ نوشته می شود . )
4 – پارامتر credentials ttl : زمان پیش فرضی را مشخص می کند که اسکویید نتایج عمل احراز هویت کاربران را در خود ذخیره ( کش ) می کند . واضح است که هر چه این مقدار بیشتر باشد بار پردازش های احراز هویت بر اسکویید کمتر خواهد بود .
این نکته حائز اهمیت است که عمل کش شدن نتایج فقط برای نتایج مثبت انجام می گیرد و نه منفی .
همچنین مقدار زیاد این پارامتر باعث به خطر افتادن امنیت و مشکلات جدی خواهد شد .
مثال : تنظیم پارامتر های مورد نیاز اسکویید برای بهره گرفتن از احراز هویت از طریق pam
auth_param basic program /usr/local/squid/libexec/pam_auth
auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour
auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour
البته در ادامه نیاز است تا با تعریف ACL زیر و دسترسی به آن احراز هویت فقط برای کاربران مجاز انجام گیرد:
acl KnownUsers *****_auth REQUIRED
http_access allow KnownUsers
http_access allow KnownUsers
( توجه کنید که در این مثال فقط تنظیمات squid بیان شده است و برای احراز هویت با استفاده از pam به تنظیمات لازم برای pam نیاز است که خارج از حیطه این مقاله است . )
از دیگر برنامه های کمکی برای احراز هویت در این روش می توان به NCSA ( ncsa_auth ) ، LDAP ( squid_ldap_auth ) و SMB ( smb_auth ) نام برد .
2 – Microsoft NTLM Authentication
NTLM که مخفف واژه های NT Lan Manager است پروتوکلی است که توسط Microsoft ایجاد و توسعه داده شد و گروه های مختلفی از جمله گروه squid از اطلاعات محدود موجود و آنالیز ترافیک شبکه آنرا مهندسی معکوس کرده اند .
NTLM از مکانیزم دستدهی سه طرفه ) 3 – way handshake ) برای احراز هویت یک اتصال بهره می برد . در این روش وقتی یک اتصال در احراز هویت جواب مثبت دریافت کرد هر درخواستی در این اتصال دیگر نیازی به احراز هویت نخواهد داشت .
NTLM از توابع رمزنگاری و مقادیر کد گذاری شده در تبادلات داده استفاده می کند .
اگر چه NTLM امنیت بسیار بالاتری نسبت به روش Basic فراهم می آورد ولی متخصصان عقیده دارند که این روش نسبت به روش احراز هویت از طریق Digest از امنیت ضعیف تری برخوردار است .
در روش NTLM از پارامترهای زیر می توان برای تنظیم خصوصیات مختلف استفاده کرد :
1 - auth_param ntlm program command
2 - auth_param ntlm children number
3 - auth_param ntlm max_challenge_reuses number
4 - auth_param ntlm max_challenge_lifetime time-specification
2 - auth_param ntlm children number
3 - auth_param ntlm max_challenge_reuses number
4 - auth_param ntlm max_challenge_lifetime time-specification
موارد 1 و 2 همانند روش Basic عمل می کنند و دو پارامتر بعدی خصوصیات احراز هویت اتصال بین کلاینت و سرور را مشخص می کنند .
( در 3 – way handshake ، ابتدا کلاینت درخواست اتصال را با ارائه اطلاعاتی به سرور ارسال می کند ، سپس سرور پیامی به نام challenge به کلاینت ارسال می کند و در آخر کلاینت درخواست خود را دوباره با جوابی مثبت به challenge به سرور ارسال می کند . )
3 – پارامتر max_challenge_reuse : مشخص می کند که پیام challenge چند بار می تواند مورد استفاده قرار گیرد . مقدار پیش فرض 0 است و مشخص می کند که هیچ گاه از یک پیام challenge
دوبار استفاده نخواهد شد .
بالابردن این مقدار بار انجام عمل احراز هویت توسط اسکویید را کم می کند و متعاقبا از امنیت می کاهد .
4 – پارامتر max_challenge_lifetime : میزان زمانی که پیام challenge معتبر است را مشخص می کند . مقدار پیش فرض 60 ثانیه است .
مثال :
auth_param basic program /usr/local/squid/libexec/pam_auth
auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour
و ACl و http_access مورد نیاز :auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour
acl KnownUsers *****_auth REQUIRED
http_access allow KnownUsers
خوب بعد از همه این تفاسیر می رسیم به مبحث اصلی یعنی Squid ***** Authentication Against ActiveDirectoryhttp_access allow KnownUsers
برای این کار شما ابتدا باید لینوکس را به اکتیو دایرکتوری join کنید . ( در این پست طریقه join کردن linux را به windows 2003 Active Directory گفتم )
و سپس فایل اسکویید ) /etc/squid.conf ) را با استفاده از پارامتر های زیر ویرایش کنید :
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes
auth_param ntlm use_ntlm_negotiate off
# (in the ntlm basic area)
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm LINUX-NOTES.IR
auth_param basic credentialsttl 2 hours
و حالا تنظیمات مربوط به ACL :auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes
auth_param ntlm use_ntlm_negotiate off
# (in the ntlm basic area)
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm LINUX-NOTES.IR
auth_param basic credentialsttl 2 hours
acl ntlm *****_auth REQUIRED
و بالاخره :http_access allow ntlm
( توجه کنید که 1 - اگر از کانفیگ اسکوییدی استفاده می کنید که به رنجه خاصی از شبکه دسترسی کامل داده شده است به عنوان مثال :http_access allow LAN1 و اکنون می خواهید authentication برای آنها انجام گیرد باید این خطوط را حذف کنید .
2 – اگر در حال حاضر از اسکویید در حالت شفاف ( transparent ) استفاده می کنید آنرا از حالت شفاف خارج سازید .
3 – بعد از اعمال تغییرات سرویس اسکویید را ریستارت کنید . )
اکنون اگر تنظیمات مربوط به آی پی و پورت سرور پراکسی را مرورگر کلاینت ها را انجام دهید هنگام در خواست کاربران برای مرور اینترنت به کادری که نام کاربری و کلمه عبور را می خواهد مواجه خواهند شد .
امید مهاجرانی
Omid dot mohajerani at gmail dot com
http://linux-notes.blogfa.com