Έλεγχος ταυτότητας δύο παραγόντων των χρηστών VPN μέσω MikroTik και SMS

Γεια σας συνάδελφοι! Σήμερα, όταν η ένταση των παθών γύρω από την «απομακρυσμένη εργασία» υποχώρησε λίγο, η πλειοψηφία των διαχειριστών κέρδισε το καθήκον της απομακρυσμένης πρόσβασης των εργαζομένων στο εταιρικό δίκτυο, ήρθε η ώρα να μοιραστώ τη μακροχρόνια εμπειρία μου στη βελτίωση της ασφάλειας VPN. Αυτό το άρθρο δεν θα είναι της μόδας τώρα IPSec IKEv2 και xAuth. Πρόκειται για την κατασκευή ενός συστήματος. έλεγχος ταυτότητας δύο παραγόντων (2FA) Χρήστες VPN όταν το MikroTik λειτουργεί ως διακομιστής VPN. Δηλαδή, όταν χρησιμοποιούνται «κλασικά» πρωτόκολλα όπως το PPP.

Έλεγχος ταυτότητας δύο παραγόντων των χρηστών VPN μέσω MikroTik και SMS

Σήμερα θα σας πω πώς να προστατεύσετε το MikroTik PPP-VPN ακόμα κι αν ο λογαριασμός χρήστη έχει "πειρατεύσει". Όταν παρουσιάστηκε αυτό το σχέδιο σε έναν από τους πελάτες μου, το περιέγραψε εν συντομία ως «καλά, τώρα είναι ακριβώς όπως σε μια τράπεζα!».

Η μέθοδος δεν χρησιμοποιεί υπηρεσίες εξωτερικού ελέγχου ταυτότητας. Οι εργασίες εκτελούνται εσωτερικά από τον ίδιο τον δρομολογητή. Χωρίς κόστος για τον πελάτη που συνδέει. Η μέθοδος λειτουργεί τόσο για υπολογιστές-πελάτες όσο και για κινητές συσκευές.

Το γενικό σύστημα προστασίας έχει ως εξής:

  1. Η εσωτερική διεύθυνση IP ενός χρήστη που έχει συνδεθεί επιτυχώς στον διακομιστή VPN μπαίνει αυτόματα σε γκρίζα λίστα.
  2. Το συμβάν σύνδεσης δημιουργεί αυτόματα έναν κωδικό μιας χρήσης που αποστέλλεται στον χρήστη χρησιμοποιώντας μία από τις διαθέσιμες μεθόδους.
  3. Οι διευθύνσεις σε αυτήν τη λίστα έχουν περιορισμένη πρόσβαση στους πόρους του τοπικού δικτύου, με εξαίρεση την υπηρεσία "authenticator", η οποία περιμένει να λάβει έναν κωδικό πρόσβασης μίας χρήσης.
  4. Μετά την παρουσίαση του κώδικα, ο χρήστης έχει πρόσβαση στους εσωτερικούς πόρους του δικτύου.

Πρώτα το μικρότερο πρόβλημα που είχα να αντιμετωπίσω ήταν να αποθηκεύσω τα στοιχεία επικοινωνίας του χρήστη για να του στείλω τον κωδικό 2FA. Δεδομένου ότι είναι αδύνατο να δημιουργηθούν αυθαίρετα πεδία δεδομένων που αντιστοιχούν σε χρήστες στο Mikrotik, χρησιμοποιήθηκε το υπάρχον πεδίο «σχολιασμό»:

/ppp secrets add name=Petrov password=4M@ngr! σχόλιο = "89876543210"

Η δεύτερη το πρόβλημα αποδείχθηκε πιο σοβαρό - η επιλογή της διαδρομής και της μεθόδου παράδοσης του κώδικα. Επί του παρόντος εφαρμόζονται τρία προγράμματα: α) SMS μέσω USB-μόντεμ β) e-mail γ) SMS μέσω e-mail που διατίθεται για εταιρικούς πελάτες του παρόχου κόκκινης κινητής τηλεφωνίας.

Ναι, τα προγράμματα SMS έχουν κόστος. Αλλά αν κοιτάξετε, "η ασφάλεια είναι πάντα για τα χρήματα" (γ).
Προσωπικά δεν μου αρέσει το σχέδιο με το e-mail. Όχι επειδή απαιτεί ο διακομιστής αλληλογραφίας να είναι διαθέσιμος για τον πελάτη που ελέγχεται - δεν είναι πρόβλημα ο διαχωρισμός της κυκλοφορίας. Ωστόσο, εάν ένας πελάτης αποθηκεύσει απρόσεκτα τους κωδικούς πρόσβασης vpn και email σε ένα πρόγραμμα περιήγησης και στη συνέχεια έχανε τον φορητό υπολογιστή του, ο εισβολέας θα αποκτούσε πλήρη πρόσβαση στο εταιρικό δίκτυο από αυτό.

Έτσι, αποφασίστηκε - παραδίδουμε έναν κωδικό μιας χρήσης χρησιμοποιώντας μηνύματα SMS.

Третья Το πρόβλημα ήταν που πώς να δημιουργήσετε έναν ψευδοτυχαίο κώδικα για το 2FA στο MikroTik. Δεν υπάρχει ανάλογο της συνάρτησης random() στη γλώσσα δέσμης ενεργειών RouterOS και έχω δει αρκετές γεννήτριες ψευδοτυχαίων αριθμών με δεκανίκι. Δεν μου άρεσε κανένα από αυτά για διάφορους λόγους.

Στην πραγματικότητα, υπάρχει μια γεννήτρια ψευδοτυχαίων ακολουθιών στο MikroTik! Είναι κρυμμένο από μια επιφανειακή ματιά στο πλαίσιο του /certificates scep-server. Ο πρώτος τρόπος Η λήψη ενός κωδικού πρόσβασης μίας χρήσης είναι εύκολη και απλή - με την εντολή /certificates scep-server otp δημιουργία. Εάν εκτελέσουμε μια απλή λειτουργία εκχώρησης μεταβλητής, θα λάβουμε μια τιμή πίνακα που μπορεί να χρησιμοποιηθεί αργότερα σε σενάρια.

Ο δεύτερος τρόπος λήψη ενός κωδικού πρόσβασης μίας χρήσης, ο οποίος είναι επίσης εύκολος στην εφαρμογή - χρησιμοποιώντας μια εξωτερική υπηρεσία 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. Η ακόλουθη εντολή "put" εμφανίζει απλώς τη μεταβλητή στην κονσόλα 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

Τώρα ας αρχίσουμε να στερεώνουμε όλο αυτό τον πλούτο στην υπηρεσία ΣΔΙΤ. Το MikroTik σάς επιτρέπει να χρησιμοποιείτε σενάρια σε προφίλ (ppp-profile) και να τα εκχωρείτε στα συμβάντα δημιουργίας και διακοπής μιας σύνδεσης ppp. Οι ρυθμίσεις του προφίλ ppp μπορούν να εφαρμοστούν τόσο στον διακομιστή PPP στο σύνολό του όσο και σε μεμονωμένους χρήστες. Ταυτόχρονα, το προφίλ που έχει εκχωρηθεί στον χρήστη έχει προτεραιότητα, παρακάμπτοντας τις παραμέτρους του προφίλ που έχει επιλεγεί για το διακομιστή στο σύνολό του με τις καθορισμένες παραμέτρους του.

Ως αποτέλεσμα αυτής της προσέγγισης, μπορούμε να δημιουργήσουμε ένα ειδικό προφίλ για έλεγχο ταυτότητας δύο παραγόντων και να το εκχωρήσουμε όχι σε όλους τους χρήστες, αλλά μόνο σε αυτούς που θεωρούν απαραίτητο να το κάνουν. Αυτό μπορεί να είναι σχετικό εάν χρησιμοποιείτε υπηρεσίες PPP όχι μόνο για τη σύνδεση τελικών χρηστών, αλλά ταυτόχρονα για τη δημιουργία συνδέσεων τοποθεσίας σε τοποθεσία.

Στο ειδικό προφίλ που δημιουργήθηκε πρόσφατα, χρησιμοποιούμε τη δυναμική προσθήκη της διεύθυνσης και της διεπαφής του συνδεδεμένου χρήστη στις "γκρίζες" λίστες διευθύνσεων και διεπαφών:

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

Είναι απαραίτητο να χρησιμοποιήσετε και τις λίστες "address-list" και "interface-list" για τον εντοπισμό και την καταγραφή της κίνησης από μη δευτερεύοντες πελάτες VPN στην αλυσίδα dstnat (προδρομολόγηση).

Όταν ολοκληρωθεί η προετοιμασία, δημιουργηθούν πρόσθετες αλυσίδες τείχους προστασίας και ένα προφίλ, θα γράψουμε ένα σενάριο υπεύθυνο για την αυτόματη δημιουργία του κώδικα 2FA και μεμονωμένους κανόνες τείχους προστασίας.

Τεκμηρίωση wiki.mikrotik.com στο PPP-Profile μας εμπλουτίζει με πληροφορίες σχετικά με μεταβλητές που σχετίζονται με συμβάντα σύνδεσης-αποσύνδεσης πελάτη 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

Ειδικά για όσους τους αρέσει να κάνουν άσκοπα copy-paste, σας προειδοποιώ - ο κώδικας προέρχεται από τη δοκιμαστική έκδοση και μπορεί να περιέχει μικρά λάθη. Δεν θα είναι δύσκολο για ένα άτομο με κατανόηση να καταλάβει πού ακριβώς.

Όταν ένας χρήστης αποσυνδέεται, δημιουργείται ένα συμβάν "On-Down" και καλείται το αντίστοιχο σενάριο με παραμέτρους. Ο σκοπός αυτού του σεναρίου είναι να καθαρίσει τους κανόνες του τείχους προστασίας που έχουν δημιουργηθεί για τον αποσυνδεδεμένο χρήστη.

Κωδικός που χρησιμοποιείται στο προφίλ για συμβάν σύνδεσης PPP on-down

: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
Έλεγχος ταυτότητας δύο παραγόντων των χρηστών VPN μέσω MikroTik και SMS

Κώδικας
/ppp secrets set [find name=Petrov] profile=2FA

Πώς φαίνεται από την πλευρά του πελάτη.

Όταν δημιουργηθεί μια σύνδεση VPN, ένα τηλέφωνο/tablet Android/iOS με κάρτα SIM λαμβάνει ένα SMS όπως αυτό:

γραπτό μήνυμα
Έλεγχος ταυτότητας δύο παραγόντων των χρηστών VPN μέσω MikroTik και SMS

Εάν η σύνδεση δημιουργηθεί απευθείας από το τηλέφωνο / tablet, τότε μπορείτε να περάσετε από το 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.

Υποθέτω ότι η εικόνα μπορεί να προσαρμοστεί χρησιμοποιώντας το εργαλείο "hotspot", μεταφορτώνοντας τη δική σας έκδοση εκεί και ορίζοντας τη διεύθυνση URL Deny Redirect σε αυτήν με το WebProxy.

Ένα μεγάλο αίτημα σε όσους προσπαθούν να αγοράσουν το φθηνότερο «παιχνίδι» Mikrotik για 20 $ και να αντικαταστήσουν ένα ρούτερ 500 $ με αυτό - μην το κάνετε αυτό. Συσκευές όπως το "hAP Lite" / "hAP mini" (home access point) έχουν πολύ αδύναμη CPU (smips) και είναι πιθανό να μην αντεπεξέλθουν στο φόρτο στο επιχειρηματικό τμήμα.

Προσοχή! Αυτή η λύση έχει ένα μειονέκτημα: όταν οι πελάτες συνδέονται ή αποσυνδέονται, συμβαίνουν αλλαγές διαμόρφωσης, τις οποίες ο δρομολογητής προσπαθεί να αποθηκεύσει στη μη πτητική μνήμη του. Με μεγάλο αριθμό πελατών και συχνές συνδέσεις και αποσυνδέσεις, αυτό μπορεί να οδηγήσει σε υποβάθμιση της εσωτερικής αποθήκευσης στο δρομολογητή.

ΥΓ: Οι μέθοδοι παράδοσης κώδικα στον πελάτη μπορούν να επεκταθούν και να συμπληρωθούν εφόσον επαρκούν οι δυνατότητες προγραμματισμού σας. Για παράδειγμα, μπορείτε να στείλετε μηνύματα στο τηλεγράφημα ή να ... προτείνετε επιλογές!

Ελπίζω ότι το άρθρο θα σας φανεί χρήσιμο και θα σας βοηθήσει να κάνετε τα δίκτυα των μικρομεσαίων επιχειρήσεων λίγο πιο ασφαλή.

Πηγή: www.habr.com