MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

ہیلو ساتھیوں! آج، جب دور دراز کے کام کے بارے میں جنون تھوڑا سا کم ہو گیا ہے، زیادہ تر منتظمین نے کارپوریٹ نیٹ ورک تک ملازمین کی ریموٹ رسائی کے کام کو فتح کر لیا ہے، اب وقت آگیا ہے کہ میں VPN سیکیورٹی کو بہتر بنانے میں اپنے دیرینہ تجربے کا اشتراک کروں۔ یہ مضمون فی الحال فیشن ایبل IPSec IKEv2 اور xAuth کا احاطہ نہیں کرے گا۔ یہ ایک نظام کی تعمیر کے بارے میں ہے دو عنصر کی توثیق (2FA) VPN صارفین جب MikroTik VPN سرور کے طور پر کام کرتا ہے۔ یعنی، جب پی پی پی جیسے "کلاسک" پروٹوکول استعمال کیے جاتے ہیں۔

MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

آج میں آپ کو بتاؤں گا کہ MikroTik PPP-VPN کی حفاظت کیسے کی جائے چاہے آپ کا صارف اکاؤنٹ ہائی جیک ہو جائے۔ جب یہ اسکیم میرے ایک گاہک کو متعارف کرائی گئی، تو اس نے مختصراً اسے "اچھا، اب یہ بالکل بینک کی طرح ہے!"

یہ طریقہ بیرونی مستند خدمات کا استعمال نہیں کرتا ہے۔ کام اندرونی طور پر روٹر کے ذریعہ انجام دیئے جاتے ہیں۔ منسلک کلائنٹ کے لیے کوئی قیمت نہیں۔ یہ طریقہ پی سی کلائنٹس اور موبائل آلات دونوں کے لیے کام کرتا ہے۔

عام تحفظ کی اسکیم مندرجہ ذیل ہے:

  1. VPN سرور سے کامیابی کے ساتھ جڑنے والے صارف کا اندرونی IP ایڈریس خود بخود گرے لسٹ میں شامل ہو جاتا ہے۔
  2. کنکشن ایونٹ خود بخود ایک وقتی کوڈ تیار کرتا ہے جو دستیاب طریقوں میں سے ایک کا استعمال کرتے ہوئے صارف کو بھیجا جاتا ہے۔
  3. اس فہرست میں موجود پتوں کو مقامی نیٹ ورک کے وسائل تک محدود رسائی حاصل ہے، سوائے "Authenticator" سروس کے، جو ایک بار پاس ورڈ کوڈ حاصل کرنے کی توقع رکھتی ہے۔
  4. کوڈ پیش کرنے کے بعد، صارف کو اندرونی نیٹ ورک کے وسائل تک رسائی حاصل ہوتی ہے۔

سب سے پہلے ہمیں جس سب سے چھوٹی پریشانی کا سامنا کرنا پڑا وہ صارف کے بارے میں رابطے کی معلومات کو ذخیرہ کرنا تھا تاکہ اسے 2FA کوڈ بھیج سکے۔ چونکہ Mikrotik میں صارفین کے مطابق صوابدیدی ڈیٹا فیلڈز بنانا ناممکن ہے، اس لیے موجودہ "تبصرہ" فیلڈ استعمال کیا گیا تھا:

/ppp راز کا اضافہ کریں name=Petrov پاس ورڈ=4M@ngr! تبصرہ="89876543210"

دوسری مسئلہ زیادہ سنگین نکلا - کوڈ کی فراہمی کے راستے اور طریقہ کا انتخاب۔ فی الحال، تین اسکیمیں نافذ کی گئی ہیں: a) USB موڈیم کے ذریعے SMS ب) ای میل ج) ای میل کے ذریعے SMS ریڈ موبائل آپریٹر کے کارپوریٹ کلائنٹس کے لیے دستیاب ہے۔

جی ہاں، ایس ایم ایس اسکیموں کی لاگت آتی ہے۔ لیکن اگر آپ اسے دیکھیں تو، "سیکیورٹی ہمیشہ پیسے کے بارے میں ہوتی ہے" (c)۔
مجھے ذاتی طور پر ای میل اسکیم پسند نہیں ہے۔ اس لیے نہیں کہ اس کے لیے میل سرور کا تصدیق شدہ کلائنٹ کے لیے دستیاب ہونا ضروری ہے - ٹریفک کو تقسیم کرنا کوئی مسئلہ نہیں ہے۔ تاہم، اگر کلائنٹ نے لاپرواہی سے براؤزر میں VPN اور ای میل دونوں کے پاس ورڈ محفوظ کیے، اور پھر اپنا لیپ ٹاپ کھو دیا، تو حملہ آور اس سے کارپوریٹ نیٹ ورک تک مکمل رسائی حاصل کر لے گا۔

لہذا، یہ فیصلہ کیا گیا ہے - ہم SMS پیغامات کا استعمال کرتے ہوئے ایک وقتی کوڈ فراہم کرتے ہیں۔

تیسرا مسئلہ یہ تھا کہ کہاں اور MikroTik میں 2FA کے لیے چھدم بے ترتیب کوڈ کیسے بنایا جائے۔. RouterOS اسکرپٹنگ لینگویج میں random() فنکشن کا کوئی اینالاگ نہیں ہے، اور میں نے اس سے پہلے کئی کرچ اسکرپٹڈ سیوڈو رینڈم نمبر جنریٹرز دیکھے ہیں۔ مجھے مختلف وجوہات کی بنا پر ان میں سے کوئی بھی پسند نہیں آیا۔

حقیقت میں، MikroTik میں ایک چھدم بے ترتیب ترتیب جنریٹر ہے! یہ /سرٹیفیکیٹس scep-server کے تناظر میں سطحی نظر سے پوشیدہ ہے۔ پہلا راستہ ایک وقتی پاس ورڈ حاصل کرنا آسان اور آسان ہے - کمانڈ کے ساتھ /سرٹیفکیٹس scep-server otp پیدا کرتا ہے۔. اگر ہم ایک سادہ متغیر اسائنمنٹ آپریشن کرتے ہیں تو ہمیں ایک اری ویلیو ملے گی جو بعد میں اسکرپٹس میں استعمال کی جا سکتی ہے۔

دوسرا راستہ ایک بار کا پاس ورڈ حاصل کرنا، جو استعمال کرنا بھی آسان ہے - ایک بیرونی سروس کا استعمال کرتے ہوئے بے ترتیب سیوڈورنڈم نمبرز کی ترتیب کی مطلوبہ قسم پیدا کرنے کے لیے۔ یہاں ایک آسان ہے۔ cantilevered متغیر میں ڈیٹا وصول کرنے کی مثال:

کوڈ
:global rnd1 [:pick ([/tool fetch url="https://www.random.org/strings/?num=1&len=7&digits=on&unique=on&format=plain&rnd=new" as-value output=user ]->"da
ta") 1 6] :put $rnd1

کنسول کے لیے فارمیٹ کی گئی درخواست (اسکرپٹ کے باڈی میں خصوصی حروف سے بچنے کی ضرورت ہوگی) $rnd1 متغیر میں چھ عددی حروف کی ایک تار وصول کرتی ہے۔ درج ذیل "put" کمانڈ صرف MikroTik کنسول میں متغیر کو دکھاتی ہے۔

چوتھا مسئلہ جسے فوری طور پر حل کرنا تھا کہ تصدیق کے دوسرے مرحلے پر منسلک کلائنٹ اپنا یک وقتی کوڈ کیسے اور کہاں منتقل کرے گا۔

MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

MikroTik راؤٹر پر ایک سروس ہونی چاہیے جو کوڈ کو قبول کر سکے اور اسے کسی مخصوص کلائنٹ سے میچ کر سکے۔ اگر فراہم کردہ کوڈ متوقع سے میل کھاتا ہے، تو کلائنٹ کا پتہ ایک مخصوص "سفید" فہرست میں شامل ہونا چاہیے، ایسے پتے جن سے کمپنی کے اندرونی نیٹ ورک تک رسائی کی اجازت ہے۔

خدمات کے محدود انتخاب کی وجہ سے، Mikrotik میں بنائے گئے ویب پراکسی کا استعمال کرتے ہوئے HTTP کے ذریعے کوڈز قبول کرنے کا فیصلہ کیا گیا۔ اور چونکہ فائر وال آئی پی ایڈریس کی متحرک فہرستوں کے ساتھ کام کر سکتا ہے، یہ فائر وال ہے جو کوڈ کو تلاش کرتا ہے، اسے کلائنٹ آئی پی سے ملاتا ہے اور اسے Layer7 regexp کا استعمال کرتے ہوئے "سفید" فہرست میں شامل کرتا ہے۔ خود راؤٹر کو ایک مشروط DNS نام "gw.local" تفویض کیا گیا ہے، اور PPP کلائنٹس کو جاری کرنے کے لیے اس پر ایک مستحکم A ریکارڈ بنایا گیا ہے:

DNS
/ip dns static add name=gw.local address=172.31.1.1

پراکسی کے ذریعے غیر تصدیق شدہ کلائنٹس سے ٹریفک حاصل کرنا:
/ip firewall nat add chain=dstnat dst-port=80,443 in-interface=2fa protocol=tcp !src-address-list=2fa_approved action=redirect to-ports=3128

اس صورت میں، پراکسی کے دو کام ہوتے ہیں۔

1. کلائنٹس کے ساتھ TCP کنکشن کھولیں۔

2. کامیاب اجازت کی صورت میں، کلائنٹ براؤزر کو کسی ایسے صفحہ یا تصویر پر بھیجیں جو کامیاب تصدیق کے بارے میں مطلع کرے:

پراکسی ترتیب
/ip proxy
set enabled=yes port=3128
/ip proxy access
add action=deny disabled=no redirect-to=gw.local./mikrotik_logo.png src-address=0.0.0.0/0

میں کنفیگریشن کے اہم عناصر کی فہرست دوں گا:

  1. انٹرفیس کی فہرست "2fa" - کلائنٹ انٹرفیس کی ایک متحرک فہرست، ٹریفک جس سے 2FA کے فریم ورک کے اندر کارروائی کی ضرورت ہوتی ہے؛
  2. ایڈریس لسٹ "2fa_jailed" - VPN کلائنٹس کے سرنگ IP پتوں کی "گرے" فہرست؛
  3. ایڈریس_لسٹ "2fa_approved" - VPN کلائنٹس کے سرنگ IP پتوں کی ایک سفید فہرست جنہوں نے کامیابی کے ساتھ دو عنصر کی توثیق کی ہے۔
  4. فائر وال چین "input_2fa" - یہ TCP پیکٹ کو اجازت دینے والے کوڈ کی موجودگی کے لیے چیک کرتا ہے اور آیا کوڈ بھیجنے والے کا IP ایڈریس مطلوبہ سے میل کھاتا ہے۔ سلسلہ میں قواعد کو متحرک طور پر شامل اور ہٹا دیا جاتا ہے۔

ایک آسان پیکٹ پروسیسنگ فلو چارٹ اس طرح لگتا ہے:

MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

"گرے" لسٹ میں کلائنٹس سے ٹریفک کو شامل کرنے کے لیے جنہوں نے ابھی تک تصدیق کے دوسرے مرحلے کو Layer7 اسکین میں نہیں گزارا ہے، معیاری "ان پٹ" چین میں ایک اصول بنایا گیا ہے:

کوڈ
/ip firewall filter add chain=input !src-address-list=2fa_approved action=jump jump-target=input_2fa

اب اس ساری دولت کو پی پی پی کی خدمت سے جوڑنا شروع کرتے ہیں۔ MikroTik آپ کو پروفائلز (ppp-profile) میں اسکرپٹ استعمال کرنے اور پی پی پی کنکشن قائم کرنے اور توڑنے کے واقعات کے لیے تفویض کرنے کی اجازت دیتا ہے۔ پی پی پی پروفائل سیٹنگز کو پی پی پی سرور پر مجموعی طور پر اور انفرادی صارفین دونوں پر لاگو کیا جا سکتا ہے۔ اس صورت میں، صارف کو تفویض کردہ پروفائل کو ترجیح حاصل ہوتی ہے، جو اپنے مخصوص پیرامیٹرز کے ساتھ مجموعی طور پر سرور کے لیے منتخب کردہ پروفائل کے پیرامیٹرز کو اوور رائیڈ کرتا ہے۔

اس نقطہ نظر کے نتیجے میں، ہم دو عنصر کی تصدیق کے لیے ایک خصوصی پروفائل بنا سکتے ہیں اور اسے تمام صارفین کو نہیں بلکہ صرف ان لوگوں کو تفویض کر سکتے ہیں جنہیں ہم ایسا کرنا ضروری سمجھتے ہیں۔ یہ متعلقہ ہو سکتا ہے اگر آپ PPP سروسز کا استعمال نہ صرف آخری صارفین کو جوڑنے کے لیے کرتے ہیں، بلکہ ایک ہی وقت میں سائٹ سے سائٹ کنکشن بنانے کے لیے کرتے ہیں۔

نئے بنائے گئے خصوصی پروفائل میں، ہم ایڈریس اور انٹرفیس کی "گرے" فہرستوں میں جڑے ہوئے صارف کے ایڈریس اور انٹرفیس کا متحرک اضافہ استعمال کرتے ہیں:

winbox
MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

کوڈ
/ppp profile add address-list=2fa_jailed change-tcp-mss=no local-address=192.0.2.254 name=2FA interface-list=2fa only-one=yes remote-address=dhcp_pool1 use-compression=no use-encryption= required use-mpls=no use-upnp=no dns-server=172.31.1.1

VPN کلائنٹس سے ٹریفک کی شناخت اور قبضہ کرنے کے لیے "ایڈریس-لسٹ" اور "انٹرفیس-لسٹ" کی فہرستوں کو ایک ساتھ استعمال کرنا ضروری ہے جنہوں نے dstnat (prerouting) سلسلہ میں ثانوی اجازت نہیں دی ہے۔

جب تیاری مکمل ہو جائے گی، اضافی فائر وال کی زنجیریں اور ایک پروفائل بنا دیا جائے گا، ہم 2FA کوڈ اور انفرادی فائروال قواعد کی خودکار تخلیق کے لیے ذمہ دار اسکرپٹ لکھیں گے۔

دستاویزات wiki.mikrotik.com پی پی پی پروفائل پر ہمیں پی پی پی کلائنٹ کنکشن اور منقطع ہونے کے واقعات سے وابستہ متغیرات کے بارے میں معلومات سے مالا مال کرتا ہے۔ "صارف لاگ ان-ایونٹ پر اسکرپٹ پر عمل کریں۔ یہ دستیاب متغیرات ہیں جو ایونٹ اسکرپٹ کے لیے قابل رسائی ہیں: صارف، لوکل ایڈریس، ریموٹ ایڈریس، کالر آئی ڈی، کال آئی ڈی، انٹرفیس". ان میں سے کچھ ہمارے لیے بہت مفید ہوں گے۔

پی پی پی آن اپ کنکشن ایونٹ کے لیے پروفائل میں استعمال کردہ کوڈ

#Логируем для отладки полученные переменные 
:log info (

quot;local-address")
:log info (


quot;remote-address")
:log info (


quot;caller-id")
:log info (


quot;called-id")
:log info ([/int pptp-server get (


quot;interface") name])
#Объявляем свои локальные переменные
:local listname "2fa_jailed"
:local viamodem false
:local modemport "usb2"
#ищем автоматически созданную запись в адрес-листе "2fa_jailed"
:local recnum1 [/ip fi address-list find address=(


quot;remote-address") list=$listname]

#получаем псевдослучайный код через random.org
#:local rnd1 [:pick ([/tool fetch url="https://www.random.org/strings/?num=1&len=7&digits=on&unique=on&format=plain&rnd=new" as-value output=user]->"data") 0 4] #либо получаем псевдослучайный код через локальный генератор
#:local rnd1 [pick ([/cert scep-server otp generate as-value minutes-valid=1]->"password") 0 4 ]

#Ищем и обновляем коммент к записи в адрес-листе. Вносим искомый код для отладки
/ip fir address-list set $recnum1 comment=$rnd1
#получаем номер телефона куда слать SMS
:local vphone [/ppp secret get [find name=$user] comment]

#Готовим тело сообщения. Если клиент подключается к VPN прямо с телефона ему достаточно
#будет перейти прямо по ссылке из полученного сообщения
:local msgboby ("Your code: ".$comm1."n Or open link http://gw.local/otp/".$comm1."/")

# Отправляем SMS по выбранному каналу - USB-модем или email-to-sms
if $viamodem do={
/tool sms send phone-number=$vphone message=$msgboby port=$modemport }
else={
/tool e-mail send server=a.b.c.d [email protected] [email protected] subject="@".$vphone body=$msgboby }

#Генерируем Layer7 regexp
local vregexp ("otp\/".$comm1)
:local vcomment ("2fa_".(


quot;remote-address"))
/ip firewall layer7-protocol add name=(


quot;vcomment") comment=(


quot;remote-address") regexp=(


quot;vregexp")

#Генерируем правило проверяющее по Layer7 трафик клиента в поисках нужного кода
#и небольшой защитой от брутфорса кодов с помощью dst-limit
/ip firewall filter add action=add-src-to-address-list address-list=2fa_approved address-list-timeout=none-dynamic chain=input_2fa dst-port=80,443,3128 layer7-protocol=(


quot;vcomment") protocol=tcp src-address=(


quot;remote-address") dst-limit=1,1,src-address/1m40s

میں آپ کو خاص طور پر ان لوگوں کے لیے متنبہ کرتا ہوں جو بغیر سوچے سمجھے کاپی پیسٹ کرنا پسند کرتے ہیں - کوڈ ٹیسٹ ورژن سے لیا گیا تھا اور اس میں معمولی غلطیاں ہو سکتی ہیں۔ سمجھنے والے کے لیے یہ جاننا مشکل نہیں ہوگا کہ وہ کہاں ہے۔

جب صارف کا رابطہ منقطع ہوتا ہے، تو ایک "آن-ڈاؤن" ایونٹ تیار ہوتا ہے اور پیرامیٹرز کے ساتھ متعلقہ اسکرپٹ کو کال کیا جاتا ہے۔ اس اسکرپٹ کا مقصد منقطع صارف کے لیے بنائے گئے فائر وال قوانین کو صاف کرنا ہے۔

پی پی پی آن ڈاؤن کنکشن ایونٹ کے لیے پروفائل میں استعمال کیا گیا کوڈ

:local vcomment ("2fa_".(

quot;remote-address"))
/ip firewall address-list remove [find address=(


quot;remote-address") list=2fa_approved] /ip firewall filter remove [find chain="input_2fa" src-address=(


quot;remote-address") ] /ip firewall layer7-protocol remove [find name=$vcomment]
اس کے بعد آپ صارفین بنا سکتے ہیں اور ان میں سے کچھ یا سبھی کو دو فیکٹر تصدیقی پروفائل میں تفویض کر سکتے ہیں۔

winbox
MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

کوڈ
/ppp secrets set [find name=Petrov] profile=2FA

یہ کلائنٹ کی طرف کیسا لگتا ہے۔

جب آپ VPN کنکشن قائم کرتے ہیں، تو تقریباً اس طرح کا ایک SMS آپ کے Android/iOS فون/ٹیبلیٹ پر سم کارڈ کے ساتھ بھیجا جاتا ہے:

پیغام
MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

اگر کنکشن براہ راست آپ کے فون/ٹیبلیٹ سے قائم ہوا ہے، تو آپ صرف میسج کے لنک پر کلک کرکے 2FA سے گزر سکتے ہیں۔ یہ آرام دہ ہے۔

اگر پی سی سے وی پی این کنکشن قائم ہوتا ہے، تو صارف کو پاس ورڈ کی کم سے کم شکل داخل کرنے کی ضرورت ہوگی۔ وی پی این سیٹ اپ کرتے وقت HTML فائل کی شکل میں ایک چھوٹا سا فارم صارف کو بھیجا جاتا ہے۔ فائل کو بذریعہ ڈاک بھی بھیجا جا سکتا ہے تاکہ صارف اسے محفوظ کر سکے اور مناسب جگہ پر شارٹ کٹ بنا سکے۔ یہ کچھ اس طرح لگتا ہے:

میز پر لیبل
MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

صارف شارٹ کٹ پر کلک کرتا ہے، ایک سادہ کوڈ انٹری فارم کھلتا ہے، جو کھولے ہوئے یو آر ایل میں کوڈ داخل کرے گا:

فارم اسکرین
MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

شکل سب سے قدیم ہے، مثال کے طور پر دی گئی ہے۔ جو چاہیں وہ اس میں ترمیم کر سکتے ہیں تاکہ وہ اپنی مرضی کے مطابق ہو۔

2fa_login_mini.html

<html>
<head> <title>SMS OTP login</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
<form name="login" action="location.href='http://gw.local/otp/'+document.getElementById(‘text').value"  method="post"
 <input id="text" type="text"/> 
<input type="button" value="Login" onclick="location.href='http://gw.local/otp/'+document.getElementById('text').value"/> 
</form>
</body>
</html>

اگر اجازت کامیاب ہو جاتی ہے، تو صارف کو براؤزر میں MikroTik لوگو نظر آئے گا، جو کامیاب تصدیق کے سگنل کے طور پر کام کرے گا:

MikroTik اور SMS کے ذریعے VPN صارفین کی دو فیکٹر تصدیق

نوٹ کریں کہ تصویر کو بلٹ ان MikroTik ویب سرور سے WebProxy Deny Redirect کا استعمال کرتے ہوئے واپس کیا گیا ہے۔

مجھے یقین ہے کہ تصویر کو "ہاٹ اسپاٹ" ٹول کا استعمال کرتے ہوئے اپنی مرضی کے مطابق بنایا جا سکتا ہے، وہاں آپ کا اپنا ورژن اپ لوڈ کر کے اور WebProxy کے ساتھ اس پر ڈینی ری ڈائریکٹ یو آر ایل سیٹ کر سکتے ہیں۔

ان لوگوں کے لیے ایک بڑی درخواست جو سب سے سستا "کھلونا" Mikrotik $20 میں خریدنے کی کوشش کر رہے ہیں اور اسے $500 کے راؤٹر سے بدل دیں - ایسا نہ کریں۔ "hAP Lite"/"hAP mini" (ہوم ​​ایکسیس پوائنٹ) جیسی ڈیوائسز کا CPU (smips) بہت کمزور ہوتا ہے، اور امکان ہے کہ وہ کاروباری طبقے میں بوجھ کا مقابلہ نہیں کر پاتے۔

انتباہ! اس حل میں ایک خرابی ہے: جب کلائنٹ کنیکٹ یا منقطع ہوتے ہیں، تو کنفیگریشن میں تبدیلیاں رونما ہوتی ہیں، جنہیں روٹر اپنی نان ولیٹائل میموری میں محفوظ کرنے کی کوشش کرتا ہے۔ کلائنٹس کی ایک بڑی تعداد اور بار بار کنکشن اور منقطع ہونے کے ساتھ، یہ روٹر میں اندرونی اسٹوریج کی کمی کا باعث بن سکتا ہے۔

PS: جہاں تک آپ کی پروگرامنگ کی صلاحیتوں کا تعلق ہے کلائنٹ کو کوڈ فراہم کرنے کے طریقوں کو بڑھایا جا سکتا ہے اور اس کی تکمیل کی جا سکتی ہے۔ مثال کے طور پر، آپ ٹیلیگرام پر پیغامات بھیج سکتے ہیں یا... اختیارات تجویز کر سکتے ہیں!

مجھے امید ہے کہ یہ مضمون آپ کے لیے مفید ثابت ہوگا اور چھوٹے اور درمیانے درجے کے کاروباری نیٹ ورکس کو کچھ زیادہ محفوظ بنانے میں مدد کرے گا۔

ماخذ: www.habr.com