VPN چيست؟ (بخش سوم)

VPN با لينوكس (1)
يكي از توانايي هاي VPN امكان كاربران دور از شبكه(Remote) در دسترسي به آ ن است . IPsec در اين ميان نقش مهمي در فراهم كردن ايمني لازم براي داده ها دارد . يكي از مناسب ترين و به صرفه ترين وسيله ها در پياده سازي اين امكانات لينوكس و Free S/WAN كه در اين بخش به آن مي پردازيم .

IPsec و Free S/WAN
اگر چه لينوكس هم به دليل توانايي هاي خوبFirewall بستر بسيار مناسبي براي يك دروازه امنيتي(Security Gateway) برپايه IPsec است مال خودش به طور پيش فرض بخش هاي لازم براي IPsec را به همراه ندارد. اين برنامه ها را مي توانيد در مجموعه Free S/WAN بيابيد. Free S/WAN (www.fresswan.org) در اصل مجمعي متشكل از برنامه نويسان زبده و تامين كنندگان مالي است كه برنامه هاي ويژه لينوكس را فراهم مي كنند. برنامه Free S/WAN از دو بخش اصلي تشكيل شده يكي KLIPS(Kernel IPsec ) است كه پروتكل هاي لازم را به Kernel اضافه مي كند و ديگري Daemon كه وظيفهبرقراري ارتباط و رمز گذاري را بر عهده دارد.
در اين بخش مي بينيد كه IPsec چگونه كار مي كند و چگونه بايد آن را به كمك Free S/WAN در لينوكس براي VPN پيكر بندي كرد. در ادامه خواهيم گفت كه با X.509 چطور زير ساخت هاي لازم براي يك شركت پياده سازي مي شود.

نگاهي به IPsec
IPsec در اصل مجموعه اي از پروتكل ها و روش هايي است كه به كمك آنها مي توان روي اينترنت يك ارتباط مطمئن و ايمن ايجاد كرد.
جزييات IPsec يا Internet Protocol Security در RFC هاي شماره 2401 تا 2410 آمده. IPsec براي اطمينان بخشيدن به ارتباط هاي اينترنتي از شيوه هاي تعيين اعتبار و رمز گذاري داده ها استفاده مي كند. براي اين منظور در لايه شبكه دو حالت انتقال و دو لايه ايمني فراهم مي كند.

Transport در مقايسه با Tunnel
در حالت Transport دو ميزبان به طور مستقيم روي اينترنت با هم گفتگو مي كنند. در اين حالت مي توان IPsec را براي تعيين اعتبار و همچنين يكپارچگي و درستي داده ها به كار برد. به كمك IPsec نه تنها مي توان از هويت طرف گفتگو مطمئن شدبلكه مي توان نسبت به درستي و دست نخوردگي داده هاهم اطمينان حاصل كرد . به كمك عملكرد رمز گذاري مي توان افزون بر آن خوانده شدن داده ها از سوي افراد غير مجاز جلوگيري كرد.
اما از آنجا كه در اين شيوه، دو كامپيوتر به طور مستقيم داده ها را مبادله ميكنند نمي توان مبدا و مقصد داده ها را پنهان كرد. از حالت Tunnel هنگامي كه استفاده مي شود كه دست كم يكي از كامپيوترها به عنوان Security Gateway به كار برود. در اين وضعيت حداقل يكي از كامپيوترهايي كه در گفتگو شركت مي كند در پشت Gateway قراردارد و در نتيجه ناشناس مي ماند. حتي اگر دو شبكه از از طريق Security Gateway هاي خود با هم داده مبادله كنند نمي توان از بيرون فهميد كه دقيقا كدام كامپيوتر به تبادل داده مشغول است. در حالت Tunnel هم مي توان از كاركردهاي تعيين اعتبار ،كنترل درستي داده ها و رمز گذاري بهره برد.

Authentication Header
وظيفه Authentication Header IP آن است كه داده هاي در حال انتقال بدون اجازه از سوي شخص سوم مورد دسترسي و تغيير قرار نگيرد . براي اين منظور از روي Header مربوط به IP و داده هاي اصلي يك عددHash به دست آمده و به همراه فيلدهاي كنترلي ديگر به انتهاي Header اضافه مي شود. گيرنده با آزمايش اين عدد مي تواند به دستكاري هاي احتمالي در Header يا داده هاي اصلي پي ببرد. Authentication Header هم در حالت Transport و هم در حالت Tunnel كاربرد دارد.
AH در حالت Transport ميان Header مربوط به IP و داده هاي اصلي مي نشيند . در مقابل، در حالت Tunneling ، Gateway كل Paket را همراه با Header مربوط به داده ها در يك IP Packet بسته بندي مي كند. در اين حالت، AH ميان Header جديد و Packet اصلي قرار مي گيرد. AH در هر دو حالت، اعتبار و سلامت داده ها را نشان مي دهد اما دليلي بر قابل اطمينان بودن آنها نيست چون عملكرد رمز گذاري ندارد.

Encapsulated Security Payload
Encapsulated Security Payload IP براي اطمينان از ايمني داده ها به كار مي رود . اين پروتكل داده ها در قالب يك Header و يك Trailer رمز گذاري مي كند. به طوري اختياري مي توان به انتهاي Packet يك فيلدESP Auth اضافه كرد كه مانند AH اطلاعات لازم براي اطمينان از درستي داده ها رمز گذاري شده را در خود دارد. در حالت Transport، Header مربوط به ESP و Trailer تنها داده هاي اصلي IP از پوشش مي دهند و Header مربوط به Packet بدون محافظ باقي مي ماند.
اما در حالت Tunneling همه Packet ارسالي از سوي فرستنده، داده اصلي به شمار مي رود و Security Gateway آن را در قالب يك Packet مربوط به IP به همراه آدرس هاي فرستنده و گيرنده رمز گذاري مي كند. در نتيجه،ESP نه تنها اطمينان از داده ها بلكه اطمينان از ارتباط را هم تامين مي كند . در هر دوحالت،ESP در تركيب با AH ما را از درستي بهترين داده هاي Header مربوط به IP مطمئن مي كند.

Security Association
براي اينكه بتوانESP/AH را به كار برد بايد الگوريتم هاي مربوط به درهم ريزي(Hashing)، تعيين اعتبار و رمز گذاري روي كامپيوترهاي طرف گفتگو يكسان باشد. همچنين دو طرف گفتگو بايد كليدهاي لازم و طول مدت اعتبار آنها را بدانند. هر دو سر ارتباط IPsec هر بار هنگام برقرار كردن ارتباط به اين پارامترهاي نياز دارند. SA يا Security Association به عنوان يك شبه استاندارد در اين بخش پذيرفته شده. براي بالا بردن امنيت، از طريق SA مي توان كليدها را تا زماني كه ارتباط برقرار است عوض كرد. اين كار را مي توان در فاصله هاي زماني مشخص يا پس از انتقال حجم مشخصي از داده ها انجام داد.

Internet Key Exchang
پروتكل Internet Key Exchang يا IKE( RFC 2409 ) روند كار روي IPsec SA را تعريف مي كند. اين روش را Internet Security Association and Key Management Protocol يا ISAKMP نيز مي نامند. اين پروتكل مشكل ايجاد ارتباط ميان دو كامپيوتر را كه هيچ چيز از هم نمي دانند و هيچ كليدي ندارند حل مي كند. در نخستين مرحله IKE(IKE Phase 1) كه به آن حالت اصلي(Main Mode) هم گفته مي شود دو طرف گفتگو نخست بر سر پيكر بندي ممكن براي SA و الگوريتم هاي لازم براي درهم ريزي (Hashing)، تعيين اعتبار و رمزگذاري به توافق مي رسند.
آغاز كننده(Initiator) ارتباط به طرف مقابل(يا همان Responder) چند گزينه را پيشنهاد مي كند. Responder هم مناسب ترين گزينه را انتخاب كرده و سپس هر دو طرف گفتگو، از طريق الگوريتم Diffie-Hellman يك كليد رمز(Secret Key) مي سازند كه پايه همه رمز گذاري هاي بعدي است. به اين ترتيب صلاحيت طرف مقابل براي برقراري ارتباط تاييد مي شود.
اكنون مرحله دوم IKE(2 ( IKE Phase آغاز مي گردد كه حالت سريع (Ouick Mode) هم ناميده مي شود. اين مرحله SA مربوط به IPsec را از روي پارامترهاي مورد توافق برا ي ESP و AH مي سازد.

گواهينامه x.506
همانطور كه پيش از اين گفتيم بهترين راه براي تبادل Public Key ها x.509 Certificate(RFC شماره 2495( است. يك چنين گواهينامه اي يك Public Key براي دارنده خود ايجاد مي كند. اين گواهينامه، داده هايي مربوط به الگوريتم به كار رفته براي امضاء ايجاد كننده، دارنده و مدت اعتبار در خود دارد كه در اين ميان، Public Keyمربوط به دارنده از بقيه مهمتر است. CA هم گواهينامه را با يك عدد ساخته شده از روي داده ها كه با Public Key خودش تركيب شده امضاء مي كند.
براي بررسي اعتبار يك گواهينامه موجود، گيرنده بايد اين امضاء را با Public Key مربوط به CA رمز گشايي كرده و سپس با عدد نخست مقايسه كند . نقطه ضعف اين روش در طول مدت اعتبار گواهينامه و امكان دستكاري و افزايش آن است. اما استفاده از اين گواهينامه ها در ارتباطهاي VPN مشكل چنداني به همراه ندارد چون مدير شبكه Security Gateway و همه ارتباط ها را زير نظر دارد.

IPsec يا FreeS/WAN
همانطور كه گفتيم FreeS/WAN مجموعه كاملي براي راه اندازي IPsec روي لينكوس است . البته بيشتر نگارش هاي لينوكس برنامه هاي لازم براي اين كار را با خود دارند. اما بر اساس تجربه بهتر است FreeS/WANرا به كار ببريد.
در اينجا ما از RedHatLinux نگارش 2/7 با هسته 2.4.18 وFreeS/WAN197 (ftp://ftp.xs4all.nl/pub/cryypto/freesean/ ) استفاده كرده ايم. درصورت لزوم مي توان FreeS/WAN را با هسته هسته هاي خانواده 2.2 هم به كار برد. البته در اين حالت دست كم به نگارش 2.2.19 لينوكس نياز داريد. اين را هم بايد در نظر داشته باشيد كه راه انداختن VPN Gateway همراه با ديواره آتش سودمنداست و هسته نگارش 2.4 امكانات خوبي براي راه انداختن ديواره آتش دارد.

نصب
براي نصب بايد هسته را در/usr/ser/linux و Free S/WAN را در /usr/scr/freeswan-versionnumber باز كنيد. سپس با فرمان هاي make menuconfig و make xconfig پيكربندي هسته را انجام بدهيد. گزينه هاي لازم براي تنظيمات اضافي را در Networking Options\IPsec Options مي يابيد كه معمولا نيازي به تغيير دادن تنظيمات پيش فرض آن نيست . براي راه انداختن x.509 patch بايد بسته مربوطه را باز كرده و فايل freewan.diff را در فهرست Free S/WAN كپي كنيد. پس از آن، فرمان patch-p1 < freewan.diff همه چيز را برايتان تنظيم مي كند. در پايان بايد هسته را كه اكنون تغيير كرده كامپايل كنيد. اين مار را با صادر كردن فرمان make kinstall وقتي در فهرست Free S/WAN هستيد انجام بدهيد.
پس از اضافه كردن هسته تازه به مدير بوت و راه اندازي كامپيوتر مي توانيد نتيجه كارهايي كه انجام داديد را ببينيد. فرمان dmesg پيام هاي آغاز به كار KLIPS را نشان مي دهد. لازم است كه روي Runlevel ها هم كارهايي انجام بدهيد. از آنجا كه Free S/WAN بع رابط هاي eth0 و eth1، ipsec0 را اضافه مي كند، سيستم نخست Networking سپس Free S/WAN و در پايان iptables را اجرا مي كند.

پيكر بندي
ما قصد داريم كه Security Gateway خود را به گونه اي پيكربندي كنيم كه يك Firewall هم باشد. اين ديواره آتش بايد به هر كامپيوتر از فضاي اينترنت با هر IP دلخواه اجازه ارتباط با شبكه داخلي(172.16.0.0/16) را بدهد . اين كامپيوتر براي اين كار دو رابط Ethernet(eth0 براي شبكه داخلي (172.16.0.0/16) و eth1 براي محيط بيروني)دارد . بايد ميان اين دو رابط عملكرد IP-Forwarding فعال باشد. نخست بايد ديواره آتش را در اين Security Gateway طوري تنظيم كنيم كه Packet هاي AH و ESP را بپذيرد. به همين دليل روي رابط بيروني(همان eth1) Packet هاي UDP را روي پورت 500(ESP) مي فرستيم.
تنظيمات FreeS/WAN در فايل /etc/ipsec.conf ثبت مي شود . اين تنظيمات به سه گروه تقسيم مي شوند. Config setup به تنظيمات پايه اي مربوط مي شود و conn%default تنظيمات مشترك براي همه ارتباط ها را در خود دارد. گروه سوم كه با لغت كليدي conn و يك نام دلخواه مشخص مي شود پارامترهاي ارتباطي با همان نام را در خود دارد. در اين مثال ما نام اين بخش را Roadwarrior گذاشته ايم كه كاربراني كه از بيرون با كامپيوترهاي همراه به شبكه متصل مي شوند مربوط مي شود.

/etc/ipsec.conf
در بخش Config setup پيش از هر چيز بايد رابطي كه درخواست ارتباط هاي IPsec روي آن مي روند رامشخص كرد. براي اين منظور، فرمان interfaces=%defaultroute كافي است كه البته مي توانيد بجاي %defaultroute آدرس IP مربوط به كارت را هم وارد كنيد. با تنظيم كردن kilpsdebug و plutodebug روي none حالت Debug را غير فعال مي كنيم . Plutoload و plutostart را روي %search تنظيم مي كنيم تا ارتباط ها پس از درخواست از سمت مقابل ، ايجاد شوند.
دربخشي conn %defqult فرمان keyingtries = 0 به Gateway مي گويد كه در صورت تغيير كليدهاي رمز تا پيدايش آنها صبر كند. براي انتخاب اين روش تعيين اعتبار فرمان authby = rsasig باعث مي شود تا هر دو طرف گفتگو حتما ميان خود گواهينامه مبادله كنند: leftrsasigkey = %cert rightsasigkey = %cert
براي left هم دوباره %defaultroute را اعلام مي كنيم كه به عنوان left subnet شبكه داخلي(172.16.0.0/16) به كار مي رود. كمي بعد اين بخش رابا leftid كامل مي كنيم كه گواهينامه ما را براي Gateway مشخص مي كند. در بخش conn Roadwarrior هم با فرمان right = %any به همه كساني كه بتوانند گواهينامه ارائه كننداجازه دسترسي مي دهيم. حالت ارتباط را هم با type = tunnel مشخص مي كنيم كه در آن تبادل كليدها از طريق IKE(key exchang = ike) با Perfect Forwarding Secrecy (pfc = yes) انجام مي گيرد. Auto = add هم به Free S/WAN مي گويد كه ارتباط در پي در خواست از سوي كاربران بيرون از شبكه برقرار شود.

گواهينامه
اكنون S/WAN Free براي برقرار كردن ارتباط با يك رمز گذاري قوي از طريق تبادل گواهينامه پيكربندي شده. گواهينامه لازم براي Gateway و كاربران بيرون از شبكه را خودمان مي سازيم. براي اين كار از توانايي هاي SSL open بهره مي گيريم. نخست يك ساختار فهرست براي ايجاد گواهينامه مي سازيم. براي نمونه فهرست /etc/fenrisCA را در نظر مي گيريم. اينجا فهرست هاي certs و private key ها مي سازيم.
فهرست private به طور منطقي بايد در دسترس root باشد. در فهرست/etc/fenrisCA به دو فايل index.txt و serial نياز داريم. با touch، index.txt را خالي مي كنيم. Open SSL بعدا در اين فايل ليستي از گواهينامه هاي صادر شده ثبت مي كند. اكنون در فايل OPENSSL.CNF (كه در /usr/ssl يا /usr/share/ssl قرار دارد) مسير فهرست CA را به عنوان پارامتر dir وارد مي كنيم.

RootCA
اكنون به سراغ RootCA مي رويم . براي اين كار نخست يك RSAPrivate به طول 2048 بيت مي سازيم :openssl gersa –des3 –out private/caKey.pem2048 گزينه des3 باعث مي شود كه از طريق روش Triple DES ساخته شود تا افراد غير مجاز نتوانند گواهينامه را درستكاري كنند. البته اكنون گواهينامه را درستكاري كنند. البته اگر خودمان هم Passphrase را فراموش كنيم امكان انجام اين كار را نخواهيم داشت.
اكنون گواهينامه RootCA خودمان را ايجاد كرده و آن را به يك بازه زماني محدوده مي كنيم:
Openssl req –new-x509 –days = 1825 – key private/cakey.pem out caCert.pem به عنوان passphrase از همان چيزي كه براي Private Key كار برديم استفاده كرده ايم. سپس openssl تك تك عناصر مربوط به شناسايي دارنده گواهينامه مي پرسد.
در پايان گواهينامه Root CA را در /eht/ipsec.d/cacerts براي Free S/WAN كپي مي كنيم.

گواهينامه Gateway
ساختن گواهينامه براي Gateway دقيقا همانند روشي است كه براي گواهينامه Root CA شرح داديم. به كمك گواهينامه Gateway به كاربران بيرون از شبكه اجازه ارتباط و استفاده از آن ر امي دهيم .
نخست به يك Private key نياز داريم كه اين بار طول آن 1024 بيت است:
openssl gersa –des3 –out private/gwKey.pem1024
اكنون گام بعدي را بر مي داريم:
openssl req –new-key private/gwKey.pem –out geReq.pem
اكنون Request را به عنوان Root CA امضاء مي كنيم:
Openssl ca –notext –in gwReq.pem –out gwCert.pem
اين گواهينامه را بايد در قالب فايل /etc/x509cert.der به شكل باينر روي Gateway ذخيره كنيم . عمل تبديل با فرمان زير انجام مي گيرد:
openssl x509 –in gwcwert.pem –outform der –out /etc/x509cert.der
Private key با نام gwkey.pem را براي Free S/WAN در /etc/ipsec.d/private كپي مي كنيم. از اين گذشته بايد Passphrase مربوطه به طور واضح در فايل /etc/ipsec.secrets آمده باشد. اگر Passphrase به طور نمونه « asample Passphrase » باشد آن را در سطر زير مي نويسيم :
« asample Passphrase » :RAS gwkey.pem
روشن است كه تنها root بايد به ipsec.secrets دسترسي داشته باشد. اكنون آخرين جاي خالي را در /etc/ipsec.conf پر مي كنيم.
Leftid = "C = IR,ST = Tehran, L = Tehran, O = Rayaneh Magazine, OU = Editorial,CN = fashkain, Email = fashkain@rayanehmag.net"

گواهينامه هاي كاربران
اكنون بايد عمل تعيين اعتبار را براي هر كاربر يكبار انجام بدهيم. در فرمان زير كه براي ساختن Private key براي يك كاربر به كار مي رود:
openssl genrsa –des3 –out private/userkey.pem –out 1024
بايد براي هر كاربر Passphrase جداگانه اي وارد كنيد. در گام بعدي فرمان زير را به كار ببريد:
openssl req –new-key private/gwKey.pem –out geReq.pem
اكنون بايد گواهينامه اي را كه آن را در قالب Root CA امضاءخواهيد كرد بسازيد.-enddate در اينجا براي مشخص كردن مدت اعتبار به كار مي رود:
Openssl ca –notext –eddate 020931200z in gwReq.pem –out gwCert.pem
در آخرين مرحله روي اين گواهينامه يك فايل باينري با فرمت PKCS#12 مي سازيم كهدر ادامه براي سرويس گيرنده هاي ويندوز xp /2000 لازم داريم.
Openssl pkcs12 –export –inusercert.pem –inkey private/userkey.pem –certfile caCert.pem-out user.p12

چشم انداز
پيكربندي Security Gateway را با موفقيت پشت سر گذاشتيم. در بخش بعدي به سرويس گيرنده هاي VPN در ويندوز مي پردازيم. براي اين كار از ابزارهاي موجود در ويندوز 2000 و xp بهره خواهيم برد.