مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

مرحبا زملائي! اليوم ، عندما خفت حدة المشاعر حول "العمل عن بُعد" قليلاً ، فاز غالبية المسؤولين بمهمة الوصول عن بُعد للموظفين إلى شبكة الشركة ، فقد حان الوقت لمشاركة خبرتي الطويلة في تحسين أمان VPN. هذه المقالة لن تكون عصرية الآن IPSec IKEv2 و xAuth. يتعلق الأمر ببناء نظام. المصادقة الثنائية (2FA) مستخدمو VPN عندما يعمل MikroTik كخادم VPN. أي عند استخدام البروتوكولات "الكلاسيكية" مثل PPP.

مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

سأخبرك اليوم بكيفية حماية MikroTik PPP-VPN حتى في حالة "اختطاف" حساب المستخدم. عندما تم تقديم هذا المخطط إلى أحد عملائي ، وصفه بإيجاز بأنه "حسنًا ، الآن كما هو الحال في أحد البنوك!".

لا تستخدم الطريقة خدمات المصادقة الخارجية. يتم تنفيذ المهام داخليًا بواسطة جهاز التوجيه نفسه. لا توجد تكلفة للعميل المتصل. تعمل الطريقة لكل من عملاء الكمبيوتر والأجهزة المحمولة.

مخطط الحماية العام كما يلي:

  1. يتم تلقائيًا إدراج عنوان IP الداخلي للمستخدم الذي اتصل بخادم VPN بنجاح.
  2. يقوم حدث الاتصال تلقائيًا بإنشاء رمز لمرة واحدة يتم إرساله إلى المستخدم باستخدام إحدى الطرق المتاحة.
  3. تتمتع العناوين الموجودة في هذه القائمة بوصول محدود إلى موارد الشبكة المحلية ، باستثناء خدمة "المصادقة" ، التي تنتظر استلام رمز مرور لمرة واحدة.
  4. بعد تقديم الرمز ، يمكن للمستخدم الوصول إلى الموارد الداخلية للشبكة.

الأول كانت أصغر مشكلة واجهتها هي تخزين معلومات الاتصال الخاصة بالمستخدم لإرسال رمز 2FA إليه. نظرًا لأنه من المستحيل إنشاء حقول بيانات عشوائية تتوافق مع المستخدمين في Mikrotik ، فقد تم استخدام حقل "التعليق" الحالي:

/ إضافة أسرار ppp اسم = كلمة مرور بتروف = 4M @ ngr! تعليق = "89876543210"

الثاني تبين أن المشكلة أكثر خطورة - اختيار المسار وطريقة تسليم الكود. يتم تنفيذ ثلاثة مخططات حاليًا: أ) الرسائل القصيرة عبر مودم USB ب) البريد الإلكتروني ج) الرسائل القصيرة عبر البريد الإلكتروني المتاحة للعملاء من الشركات لمشغل الهاتف الخلوي الأحمر.

نعم ، تسبب مخططات الرسائل القصيرة تكاليف. ولكن إذا نظرت ، "الأمن دائمًا يتعلق بالمال" (ج).
أنا شخصياً لا أحب المخطط مع البريد الإلكتروني. ليس لأنه يتطلب أن يكون خادم البريد متاحًا للعميل الذي تتم مصادقته - ليست مشكلة في تقسيم حركة المرور. ومع ذلك ، إذا قام العميل بحفظ كل من vpn وكلمات مرور البريد الإلكتروني بلا مبالاة في متصفح ثم فقد الكمبيوتر المحمول الخاص به ، فسيحصل المهاجم على وصول كامل إلى شبكة الشركة منه.

لذلك ، تقرر - نحن نقدم رمزًا لمرة واحدة باستخدام رسائل SMS.

ثالث كانت المشكلة أين كيفية إنشاء رمز شبه عشوائي لـ 2FA في MikroTik. لا يوجد تناظرية لوظيفة عشوائية () في لغة البرمجة النصية لـ RouterOS ، وقد رأيت العديد من مولدات الأرقام العشوائية الزائفة من قبل. لم يعجبني أي منهم لأسباب مختلفة.

في الواقع ، هناك مولد تسلسل شبه عشوائي في MikroTik! إنه مخفي عن نظرة سطحية في سياق / الشهادات scep-server. الطريقة الأولى الحصول على كلمة مرور لمرة واحدة سهل وبسيط - باستخدام الأمر / شهادات إنشاء خادم otp لخادم scep. إذا قمنا بإجراء عملية تخصيص متغير بسيطة ، فسنحصل على قيمة نوع مصفوفة يمكن استخدامها لاحقًا في البرامج النصية.

الطريقة الثانية الحصول على كلمة مرور لمرة واحدة والتي يسهل تطبيقها أيضًا - باستخدام خدمة خارجية random.org لتوليد النوع المطلوب من التسلسل من الأرقام شبه العشوائية. هنا مبسط الكابولي مثال على إدخال البيانات في متغير:

قانون
: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. يعرض الأمر "وضع" التالي ببساطة المتغير في وحدة تحكم MikroTik.

المشكلة الرابعة التي يجب حلها بسرعة - هذه هي الطريقة والمكان الذي سينقل فيه العميل المتصل رمز المرة الواحدة في المرحلة الثانية من المصادقة.

مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

يجب أن تكون هناك خدمة على جهاز التوجيه MikroTik يمكنها قبول الرمز ومطابقته مع عميل معين. إذا تطابق الرمز المقدم مع الرمز المتوقع ، فيجب تضمين عنوان العميل في قائمة "بيضاء" معينة ، يُسمح للعناوين من خلالها بالوصول إلى الشبكة الداخلية للشركة.

نظرًا لسوء اختيار الخدمات ، فقد تقرر قبول الرموز عبر http باستخدام webproxy المدمج في Mikrotik. ونظرًا لأن جدار الحماية يمكن أن يعمل مع قوائم ديناميكية لعناوين IP ، فإن جدار الحماية هو الذي يقوم بالبحث عن الكود ، ومطابقته مع عنوان IP الخاص بالعميل وإضافته إلى القائمة "البيضاء" باستخدام Layer7 regexp. تم تعيين اسم DNS الشرطي للموجه نفسه "gw.local" ، وقد تم إنشاء سجل A ثابت عليه لإصداره لعملاء PPP:

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" - قائمة "رمادية" لعناوين IP للنفق لعملاء VPN ؛
  3. address_list "2fa_approved" - قائمة "بيضاء" لعناوين IP للنفق لعملاء VPN الذين اجتازوا المصادقة الثنائية بنجاح.
  4. سلسلة جدار الحماية "input_2fa" - تتحقق من حزم tcp بحثًا عن وجود كود ترخيص ويطابق عنوان IP لمرسل الكود مع العنوان المطلوب. تتم إضافة القواعد في السلسلة وإزالتها ديناميكيًا.

يبدو المخطط الانسيابي المبسط لمعالجة الحزم كما يلي:

مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

للدخول في فحص Layer7 لحركة المرور من العملاء من القائمة "الرمادية" الذين لم يجتازوا المرحلة الثانية من المصادقة بعد ، تم إنشاء قاعدة في سلسلة "الإدخال" القياسية:

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

لنبدأ الآن في ربط كل هذه الثروة بخدمة PPP. يسمح لك MikroTik باستخدام البرامج النصية في ملفات التعريف (ملف تعريف ppp) وتخصيصها لأحداث إنشاء اتصال ppp وقطعه. يمكن تطبيق إعدادات ملف تعريف ppp على كل من خادم PPP ككل وعلى المستخدمين الفرديين. في الوقت نفسه ، يكون للملف الشخصي المعين للمستخدم الأولوية ، حيث يتجاوز معلمات التوصيف المحدد للخادم ككل بمعلماته المحددة.

نتيجة لهذا النهج ، يمكننا إنشاء ملف تعريف خاص للمصادقة الثنائية وتعيينه ليس لجميع المستخدمين ، ولكن فقط لأولئك الذين يعتبرون أنه من الضروري القيام بذلك. قد يكون هذا مناسبًا إذا كنت تستخدم خدمات PPP ليس فقط لتوصيل المستخدمين النهائيين ، ولكن في نفس الوقت لبناء اتصالات من موقع إلى موقع.

في ملف التعريف الخاص الذي تم إنشاؤه حديثًا ، نستخدم الإضافة الديناميكية للعنوان وواجهة المستخدم المتصل إلى القوائم "الرمادية" للعناوين والواجهات:

com.winbox
مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

قانون
/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 (التمهيد المسبق).

عند اكتمال الإعداد ، يتم إنشاء سلاسل جدار حماية إضافية وملف تعريف ، سنقوم بكتابة نص برمجي مسؤول عن الإنشاء التلقائي لكود 2FA وقواعد جدار الحماية الفردية.

التوثيق wiki.mikrotik.com على ملف تعريف PPP يثرينا بمعلومات حول المتغيرات المرتبطة بأحداث قطع اتصال عميل PPP "تنفيذ البرنامج النصي على حدث تسجيل دخول المستخدم. هذه هي المتغيرات المتاحة التي يمكن الوصول إليها من أجل البرنامج النصي للحدث: المستخدم ، والعنوان المحلي ، والعنوان البعيد ، ومعرف المتصل ، والمعرف المسمى ، والواجهة ". بعضها مفيد جدا لنا.

الرمز المستخدم في ملف التعريف لحدث اتصال PPP أثناء المتابعة

#Логируем для отладки полученные переменные 
: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

خاصة بالنسبة لأولئك الذين يحبون النسخ واللصق دون تفكير ، أحذرك - الرمز مأخوذ من الإصدار التجريبي وقد يحتوي على أخطاء إملائية بسيطة. لن يكون من الصعب على الشخص الفهم معرفة أين بالضبط.

عند قطع اتصال المستخدم ، يتم إنشاء حدث "On-Down" ويتم استدعاء البرنامج النصي المقابل مع المعلمات. الغرض من هذا البرنامج النصي هو تنظيف قواعد جدار الحماية التي تم إنشاؤها للمستخدم غير المتصل.

الرمز المستخدم في ملف التعريف لحدث اتصال PPP أثناء الاتصال

: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]
يمكنك بعد ذلك إنشاء مستخدمين وتعيين كل منهم أو بعضهم إلى ملف تعريف مصادقة ثنائية.

com.winbox
مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

قانون
/ppp secrets set [find name=Petrov] profile=2FA

كيف يبدو من جانب العميل.

عند إنشاء اتصال VPN ، يتلقى هاتف Android / iOS / الجهاز اللوحي المزود ببطاقة SIM رسالة نصية قصيرة مثل هذا:

رسالة قصيرة
مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

إذا تم إنشاء الاتصال مباشرة من الهاتف / الجهاز اللوحي ، فيمكنك المرور عبر 2FA ببساطة عن طريق النقر فوق الارتباط الموجود في الرسالة. انها مريحة.

إذا تم إنشاء اتصال VPN من جهاز كمبيوتر ، فسيُطلب من المستخدم إدخال نموذج الحد الأدنى من كلمة المرور. يتم إعطاء نموذج صغير في شكل ملف HTML للمستخدم عند إعداد VPN. يمكن حتى إرسال الملف عن طريق البريد بحيث يقوم المستخدم بحفظه وإنشاء اختصار في مكان مناسب. تبدو هكذا:

التسمية على الطاولة
مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

ينقر المستخدم على الاختصار ، يفتح نموذج إدخال رمز بسيط ، والذي سيلصق الرمز في عنوان URL المفتوح:

شكل الشاشة
مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

يتم إعطاء الشكل الأكثر بدائية كمثال. أولئك الذين يرغبون يمكنهم التعديل لأنفسهم.

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 في المتصفح ، والذي يجب أن يشير إلى مصادقة ناجحة:

مصادقة ثنائية لمستخدمي VPN عبر MikroTik و SMS

لاحظ أنه يتم إرجاع الصورة من خادم الويب MikroTik المدمج باستخدام WebProxy Deny Redirect.

أفترض أنه يمكن تخصيص الصورة باستخدام أداة "نقطة الاتصال" ، وتحميل نسختك الخاصة هناك وتعيين عنوان URL الخاص برفض إعادة التوجيه إليها باستخدام WebProxy.

طلب كبير لأولئك الذين يحاولون شراء أرخص "لعبة" Mikrotik مقابل 20 دولارًا واستبدال جهاز التوجيه 500 دولار بها - لا تفعل ذلك. أجهزة مثل "hAP Lite" / "hAP mini" (نقطة وصول منزلية) بها وحدة معالجة مركزية ضعيفة جدًا (smips) ، ومن المحتمل أنها لن تتعامل مع الحمل في قطاع الأعمال.

تحذير! هذا الحل له عيب واحد: عند اتصال العملاء أو قطع الاتصال ، تحدث تغييرات التكوين ، والتي يحاول جهاز التوجيه حفظها في ذاكرته غير المتطايرة. مع وجود عدد كبير من العملاء والتوصيلات وقطع الاتصال المتكررة ، يمكن أن يؤدي ذلك إلى تدهور وحدة التخزين الداخلية في جهاز التوجيه.

ملاحظة: يمكن توسيع طرق تقديم التعليمات البرمجية للعميل واستكمالها بقدر ما تكون قدرات البرمجة لديك كافية. على سبيل المثال ، يمكنك إرسال رسائل إلى Telegram أو ... اقتراح خيارات!

آمل أن تكون المقالة مفيدة لك وستساعد في جعل شبكات الشركات الصغيرة والمتوسطة أكثر أمانًا.

المصدر: www.habr.com