نحوه راه اندازی تونل IPsec در لینوکس

تونل IPsec
Strongswan یک نرم افزار متن باز و سازگار با اکثر سیستم عاملها و کامل میباشد که در سناریوهای مبتنی بر IPsec برای امن سازی لایه شبکه استفاده میشود.IPsec در واقع از دو مکانیزم زیر برای امنیت لایه شبکه استفاده میکند.
Authentication Header(AH)
Encapsulation Security Payload(ESP)
ارکان اصلی امنیت اطلاعات
- Confidentiality
- Integrity
- Authenticity
- Availablity
- NonRepudiation
با توجه به ارکان اصلی امنیت اطلاعات، IPsec کار حفظ یکپارچگی و احراز هویت بستهها را با استفاده از پروتکل AH و مولفه ESP آن محرمانگی و سایر ویژگی های امنیتی مورد نیاز را فراهم میکند. در حال حاضر StrongSwan یک پیاده سازی متن باز از پروتکل IPsec میباشد که بدلیل استفاده گسترده آن در اکثر محصولات امنیتی به عنوان زیرساخت تونل Site-to-Site، ابزاری شناخته شده میباشد. Strongswan ازهر دو نسخه تبادل کلید (IKE v1/2) پشتیانی میکند.
بدلیل اینکه تبادل کلید بخشی اصلی و مهم پروتکل IPsec را تشکیل میدهد این پروتکل برای امن سازی تبادل کلید از مکانیزم IKE برای تبادل کلید بین طرفین استفاده میکند. IKE همچنین برای امن سازی فرآیند تبادل کلید از الگوریتمهای رمزنگاری و یکپارچگی AES ،SHA وسایر الگوریتمهای رمزنگاری و یکپارچه سنجی و کتابخانههای OpenSSL پشتیبانی میکند. با وجود این الگوریتمهای امنیتی پیاده سازی شده در هسته لینوکس در اصلیترین قسمت پروتکل (IPsec (ESP&AH استفاده میشوند.
ویژگی های StrongSwan
- پشتیبانی از احراز هویت مبتنی بر کلید اشتراکی (PSK)
- پشتیبانی از گواهی دیجیتال (X.509) برای احراز هویت
- پشتیبانی از IKE ورژن 1 و 2 برای تبادل کلید
- ادغام افزونهها و کتابخانههای Third party
- پشتیبانی از رمز سخت افزار با استفاده از پروژه openSc
در نرم افزار متن باز StrongSwan هر دو مد ایجاد تونل IPsec یعنی Gateway-to-Gateway و Road warrior پشتیبانی میشود. در تونل Site-to-Site با وجود اینکه ترافیک شبکه در دستگاههای ورودی سازمان رمزنگاری و رمزگشایی می شود. ولی با برقراری تونل امن Site-to-Site یک کانال امن دومی نیز از Gateway تا کاربر نهایی یا دستگاه نیز ایجاد میشود.
در ادامه قصد داریم نرم افزار StrongSwan را برروی Ubuntu نسخه ۱۶.۰۴ نصب کنیم و نحوه یکپارچه سازی OpenSC با Strongswan برای استفاده از توکنهای سخت افزاری (HSM) و کارتهای هوشمند برای نگهداری کلید خصوصی و عمومی وهمچنین گواهیهای دیجیتال را نشان دهیم. در آخر نیز نحوه ایجاد تونل Site-to-Site با استفاده از کلید PSK و گواهی دیجیتال را نشان خواهیم داد. توکنهای سخت افزار پشتیبانی شده در StrongSwan با استفاده از OpenSc (مجموعه ای از ابزارها و کتابخانه ها) به عنوان یک پروژه متن باز انجام شده است. همچنین ساختار اصلی فایل PKCS#15 و دسترسی به کارت هوشمند از طریق رابط نرم افزاری PKCS#11 توسط ابزارها و کتابخانههای OpenSc فراهم شده است.
کارتهای هوشمند سازگار با Opensc
- WestCOS
- SetCOS
- CardOS
- STARCOS
- ASEPCOS
نصب StrongSwan با استفاده از فایل باینری و کامپایل Source کد
با توجه به توزیعهای مختلف لینوکس تقریبا بستههای باینری ارایه شده از StrongSwan، قابل نصب بر روی تمام توزیعهای لینوکس میباشد. در ادامه نحوه نصب StrongSwan با استفاده از فایل باینری و سورس کد در ادامه توضیح داده شده است.
برای نصب بسته باینری StrongSwan فقط کافسیت دستور زیر را اجرا کنیم.
Iranshell@StrongSwan $ sudo apt install strongswan

بعد از نصب StrongSwan برروی اوبونتو، فایل ها و پوشههای پیکربندی آن در دایرکتوری etc/ ذخیره میشوند.
- ipsec.conf
- ipsec.secrets
- ipsec.d
- strongswan.conf
- strongswan.d
کامپایل و نصب StrongSwan با استفاده از source
- OpenSc (برای پشتیبانی از HSM در StrongSwan)
- PC/SC (برای پشتیبانی از کارتخوان هوشمند در پلتفرم اوبونتو لازم است)
- کتابخانه GMP (برای عملیات ریاضی در StrongSwan لازم است)
- ابزار OpenSSL (نسخه پیاده سازی شناخته شده از الگوریتم های رمزنگاری مانند AES, SHA1).
- PKCS (استانداردهای رمزنگاری کلید عمومی) 1، 7، 8، 11، 12.
در این مقاله، ابزار PCSC-Lite همراه با OpenSC بر روی سیستم عامل اوبونتو نصب می شود تا پشتیبانی از کارتخوان های هوشمند را اضافه کند. PCSC-Lite برای خوانندگان CCID توصیه می شود.
پیش نیازهای نصب StrongSwan از سورس کد
نصب OpenSc
Iranshell@StrongSwan $ sudo apt install opensc
نصب GMP library
Iranshell@StrongSwan $ sudo apt install libgmp10
نصب کتابخانه توسعه GMP
Iranshell@StrongSwan $ sudo apt install libgmp-dev
نصب OpenSSl libcrypto
Iranshell@StrongSwan $ sudo apt install libssl-dev
کامپایل و نصب StrongSwan
برای شروع نصب StrongSwan به مسیر /usr/src/ رفته و با استفاده از دستور wget آخرین نسخه StrongSwan را دانلود کنید.
Iranshell@StrongSwan $ cd /usr/src
Iranshell@StrongSwan $ wget https://download.strongswan.org/strongswan-5.5.0.tar.gz
با استفاده از دستور زیر فایل را از حالت فشرده خارج کرده و از داخل فایل اسکریپت پیکربندی را اجرا کنید.
Iranshell@StrongSwan $ tar -xvf strongswan-5.5.0.tar.gz
Iranshell@StrongSwan $ cd strongswan-5.5.50
در ابتدا اسکریپت پیکربندی را جهت بررسی وابستگیهای StrongSwan اجرا کنید. همانطور که در زیر نشان داده شده پشتیبانی HSM از قبل در آخرین نسخه برای StrongSwan فعال شده است.

اسکریپت پیکربندی را اجرا کنید و از فلگ prefix /usr/local برای مشخص کردن مسیر ذخیره فایلهای کامپایل شده استفاده کنید، و با استفاده از فلگ enable-openssl پشتیبانی از openssl را فعال کنید.
Iranshell@StrongSwan $ ./configure --prefix=/usr/local --enable-openssl
عکس زیر نشان می دهد که هیچ خطایی بعد از اجرای اسکریپت پیکربندی وجود ندارد. دلیل این موضوع است که تمام پیش نیازهای از قبل روی سیستم نصب شدهاند.

دو دستور زیر را برای کامپایل و نصب StrongSwan در مسیر usr/local/ اجرا کنید.
Iranshell@StrongSwan $ sudo make
Iranshell@StrongSwan $ sudo make install
در اینجای کار کامپایل و نصب StrongSwan انجام شده و فایلها و پوشههای مربوط به پیکربندی StrongSwan در مسیر/usr/local/etc/ کپی می شوند. پیکربندی مربوط به تونلهای VPN در فایل ipsec.conf و تنظیمات مربوط به کلید محرمانه در فایل ipsec.secrets ذخیره می شود. همچنین پیکربندیهای مربوط به پلاگینهای StrongSwan در دایرکتوری strongswan.d ذخیره می شود.
در StrongSwan هر دو مد Transport و Tunnel برای IPsec توسط strongswan پشتیبانی میشود. ولی فقط در حالت Tunnel است که امنیت کانال Site-to-Site فراهم میشود. یکی دیگر از ویژگیهای مهم StrongSwan این است که میتوانیم با استفاده از آن با سایر محصولات و دستگاههایی مانند سیسکو، هوآوی و جونیپر که از تونل IPsec پشتیبانی میکنند، تونل برقرار نماییم.
تنطیمات تونل Site-to-Site
شکل زیرنحوه قرارگیری VPN Gateway Device که بر روی آن StrongSwan راه اندازی شده است را در یک شبکه نشان میدهد. در این سناریو یک کانال ارتباطی امن بین شبکه های خصوصی 192.168.223.0/24 و 192.168.222.0/24 ایجاد می شود.

قبل از استفاده از IPsec بین شبکههای خصوصی A و B، مطمئن شوید که مسیریابی بین دستگاههای VPN سازمان برقرار باشد. بایستی ابتدا دستگاه VPN سمت A بتواند دستگاه VPN از راه دور B را پینگ کند. همچنین بین این دو دستگاه بایستی پورتهای مورد نیاز (UDP 500 و 4500 UDP) برای برقراری IPsec قابل دسترس باشند.
همانطور که در زیر نشان داده شده است، پیکربندی پیش فرض ابزار StrongSwan در مسیر usr/local/etc/ قرار دارد.

تونل IPsec مبتنی بر کلید مشترک (Pre-Shared key)
در حالت اول یک تونل مبتنی بر کلید مشترک بین دستگاههای VPN برقرار می شود. در این مد از Diffie-Hellman، معرفترین الگوریتم به اشتراک گذاری کلید توسط StrongSwan برای احراز هویت Gatewayها استفاده می شود.
پیکربندی VPN
سرور A :
فایل اصلی مربوط به پیکربندی سیاستها و تونلهای StrongSwan در فایل ipsec.conf قرار دارد. برای برقراری تونل نیاز است موارد زیر را در فایل کانفیگ IPsec انجام دهیم.
- نسخه IKE
- نوع تونل
- Gatewayهای مبدا و مقصد
- مشخص کردن شبکههای خصوصی دو طرف
تنظیمات مورد نیاز برای سرور A :
Iranshell@StrongSwan $ vi /usr/local/etc/ipsec.conf
config setup
charondebug="all"
uniqueids="yes"
strictcrlpolicy="no"
conn %default
conn tunnel Teh-TBZ
left=192.168.1.101
eftsubnet=192.168.223.0/24
right=192.168.1.102
rightsubnet=192.168.222.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries="0"
ikelifetime="1h"
lifetime="8h"
dpddelay="30"
dpdtimeout="120"
dpdaction="request"
authby="PSK"
auto="start"
keyexchange="ikev2"
type=tunnel
تنظیمات مربوط به IPsec secrets ( کلیدهای مشترک، رمز عبور کلید خصوصی، پین مورد نیاز برای باز کردن قفل HSM) در فایل ipsec.secrets ذخیره میشود. طبق تنظیمات انجام شده در فایل ipsec.secrets کلید مشترک بین Gateway مقدار “test123456” تعیین شده است.
Iranshell@StrongSwan $ sudo vi /usr/local/etc/ipsec.secrets
192.168.1.101 192.168.1.102 : PSK "test123456"
تنظیمات مورد نیاز برای سرور B :
Iranshell@StrongSwan $ vi /usr/local/etc/ipsec.conf
config setup
charondebug="all"
uniqueids="yes"
strictcrlpolicy="no"
conn %default
conn tunnel TBZ-TEH
left=192.168.1.102
leftsubnet=192.168.222.0/24
right=192.168.1.101
rightsubnet=192.168.223.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries="0"
ikelifetime="1h"
lifetime="8h"
dpddelay="30"
dpdtimeout="120"
dpdaction="request"
authby="PSK"
auto="start"
keyexchange="ikev2"
type=tunnel
اعمال تنظیمات مورد نیاز در فایل ipsec.secrets برای سرور B :
Iranshell@StrongSwan $ sudo vi /usr/local/etc/ipsec.secrets
192.168.1.102 192.168.1.101 : PSK "test123456"
تونل IPsec مبتنی بر گواهی دیجیتال
در تنظیمات مربوط به تونل مبتنی بر گواهی x.509 (احراز هویت کلید عمومی) نیاز است گواهیهایی مورد نیاز برای احراز هویت طرفین از طریق مرجع صدور گواهینامه (C)، ایجاد شود.
ایجاد گواهی self-sign برای CA با استفاده از ابزار PKI
وارد مسیر usr/local/etc/ipsec.d شده و دستورات زیر را اجرا کنید:
Iranshell@StrongSwan $ cd /usr/local/etc/ipsec.d
ایجاد کلید حضوصی برای سرور CA جهت استفاده برای امضای گواهیها
Iranshell@StrongSwan $ ipsec pki --gen --type rsa --size 4096 --outform pem > private/strongswanKey.pem
ایجاد گواهی عمومی برای سرور CA
Iranshell@StrongSwan $ ipsec pki --self --ca --lifetime 3650 --in private/strongswanKey.pem --type rsa --dn "C=IR, O=Iranshell, CN=Root CA" outform pem > cacerts/stronswanCert.pm
صدور گواهی برای سرور A
Iranshell@StrongSwan $ ipsec pki --gen --type rsa --size 4096 --outform pem > private/client1key.pem
Iranshell@StrongSwan $ chmod 600 private/client1key.pem
Iranshell@StrongSwan $ ipsec pki --pub --in private/client1key.pem --type rsa / ipsec pki --issue --lifetime 730 --cacert cacert/strongswanCert.pem--cakey private/strongswanKey.pem --dn "C=IR, O=Iranshell, CN=device1" --flag serverAuth --flag ikeIntermediate --outform pem > certs/client1Cert.pem
مشابه سرور A، جفت کلید عمومی و خصوصی و گواهی ایجاد شده را برای سرور B ایجاد می کینم :
Iranshell@StrongSwan $ ipsec pki --gen --type rsa --size 4096 --outform pem > private/client2key.pem
Iranshell@StrongSwan $ chmod 600 private/client2key.pem
Iranshell@StrongSwan $ ipsec pki --pub --in private/client2key.pem--type rsa / ipsec pki --issue --lifetime 730 --cacert cacert/strongswanCert.pem--cakey private/strongswanKey.pem --dn "C=IR, O=Iranshell, CN=device2" --flag serverAuth --flag ikeIntermediate --outform pem > certs/client2Cert.pem
پس از تولید موفقیت آمیز گواهیهای سرور CA و Deviceها، مرحله بعدی تغییر پیکربندی ipsec.conf و ipsec.secrets بر روی نقطه A و B میباشد.
اعمال تنظیمات مورد نیاز برای سرور A
Iranshell@StrongSwan $ vi /usr/local/etc/ipsec.conf
config setup
charondebug="all"
uniqueids="yes"
strictcrlpolicy="no"
conn %default
conn tunnel Teh-TBZ
left=192.168.1.101
leftsubnet=192.168.223.0/24
right=192.168.1.102
rightsubnet=192.168.222.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries="0"
ikelifetime="1h"
lifetime="8h"
dpddelay="30"
dpdtimeout="120"
dpdaction="request"
authby="rsasig"
auto="start"
keyexchange="ikev2"
type=tunnel
leftcert=client1Cer.pem
leftid="C=IR, O=Iranshell, CN=device1"
rightid="C=IR, O=Iranshell, CN=device2"
اعمال تنطیمات مورد نیاز در فایل ipsec.secrets سرور A :
Iranshell@StrongSwan $ sudo vi /usr/local/etc/ipsec.secrets
C=IR, O=Iranshell, CN=device1 C=IR, O=Iranshell, CN=device2 : RSA client1key.pem
اعمال تنظیمات مورد نیاز برای سرور B
Iranshell@StrongSwan $ vi /usr/local/etc/ipsec.conf
config setup
charondebug="all"
uniqueids="yes"
strictcrlpolicy="no"
conn %default
conn tunnel TBZ-TEH
left=192.168.1.102
leftsubnet=192.168.222.0/24
right=192.168.1.101
rightsubnet=192.168.223.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries="0"
ikelifetime="1h"
lifetime="8h"
dpddelay="30"
dpdtimeout="120"
dpdaction="request"
authby="rsasig"
auto="start"
keyexchange="ikev2"
type=tunnel
leftcert=client2Cer.pem
leftid="C=IR, O=Iranshell, CN=device2"
rightid="C=IR, O=Iranshell, CN=device1"
اعمال تنظیمات مورد نیاز در فایل ipsec.secrets سرور B :
Iranshell@StrongSwan $ sudo vi /usr/local/etc/ipsec.secrets
C=IR, O=Iranshell, CN=device2 C=IR, O=Iranshell, CN=device1 : RSA client2key.pem
در آخر دستور ipsec restart را برای اعمال تغییرات اجرا میکنیم. برای بررسی وضعیت تونلها از دستور ipsec statusallاستفاده میکنیم.
دیدگاهتان را بنویسید