VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Merhaba meslektaşlarım! Bugün, "uzaktan çalışma" tutkusunun yoğunluğu biraz azaldığında, yöneticilerin çoğu, çalışanların kurumsal ağa uzaktan erişimi görevini kazandı, VPN güvenliğini iyileştirme konusunda uzun süredir devam eden deneyimimi paylaşmanın zamanı geldi. Bu makale artık moda olmayacak IPSec IKEv2 ve xAuth. Bu bir sistem kurmakla ilgili. iki faktörlü kimlik doğrulama (2FA) MikroTik bir VPN sunucusu gibi davrandığında VPN kullanıcıları. Yani, PPP gibi "klasik" protokoller kullanıldığında.

VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Bugün size MikroTik PPP-VPN'i kullanıcı hesabının "kaçırılması" durumunda bile nasıl koruyacağınızı anlatacağım. Bu sistem bir müşterime tanıtıldığında, kısaca “iyi, şimdi tıpkı bir bankadaki gibi!”

Yöntem, harici kimlik doğrulama hizmetlerini kullanmaz. Görevler dahili olarak yönlendiricinin kendisi tarafından gerçekleştirilir. Bağlanan istemci için maliyet yok. Yöntem, hem PC istemcileri hem de mobil cihazlar için çalışır.

Genel koruma şeması aşağıdaki gibidir:

  1. VPN sunucusuna başarılı bir şekilde bağlanan kullanıcının dahili IP adresi otomatik olarak gri listeye alınır.
  2. Bağlantı olayı, mevcut yöntemlerden biri kullanılarak kullanıcıya gönderilen tek seferlik bir kodu otomatik olarak oluşturur.
  3. Bu listedeki adresler, tek seferlik bir geçiş kodu almayı bekleyen "doğrulayıcı" hizmeti dışında, yerel ağ kaynaklarına sınırlı erişime sahiptir.
  4. Kodu sunduktan sonra, kullanıcı ağın dahili kaynaklarına erişebilir.

ilk Karşılaştığım en küçük sorun, ona 2FA kodunu göndermek için kullanıcıyla ilgili iletişim bilgilerini depolamaktı. Mikrotik'te kullanıcılara karşılık gelen rasgele veri alanları oluşturmak mümkün olmadığından mevcut “yorum” alanı kullanılmıştır:

/ppp sırları add name=Petrov şifresi=4M@ngr! yorum = "89876543210"

İkinci sorunun daha ciddi olduğu ortaya çıktı - yolun seçimi ve kodu iletme yöntemi. Şu anda üç şema uygulanıyor: a) USB modem yoluyla SMS b) e-posta c) kırmızı cep telefonu operatörünün kurumsal müşterileri için e-posta yoluyla SMS.

Evet, SMS programları maliyet getirir. Ama bakarsanız "güvenlik her zaman parayla ilgilidir" (c).
Şahsen e-posta planını sevmiyorum. Kimlik doğrulaması yapılan istemci için posta sunucusunun kullanılabilir olmasını gerektirdiğinden değil; trafiği bölmek sorun değildir. Ancak bir müşteri hem vpn hem de e-posta şifrelerini dikkatsizce bir tarayıcıya kaydettiyse ve daha sonra dizüstü bilgisayarını kaybettiyse, saldırgan buradan kurumsal ağa tam erişim elde edebilir.

Böylece karar verildi - SMS mesajlarını kullanarak tek seferlik bir kod gönderiyoruz.

Üçüncü sorun neredeydi MikroTik'te 2FA için sözde rastgele kod nasıl oluşturulur. RouterOS komut dosyası dilinde random() işlevinin bir benzeri yoktur ve daha önce birkaç koltuk değneği komut dosyası sözde rasgele sayı üreteci gördüm. Çeşitli nedenlerle hiçbirini beğenmedim.

Aslında MikroTik'te sözde rasgele bir dizi üreteci var! /certificates scep-server bağlamında yüzeysel bir bakıştan gizlenmiştir. ilk yöntem, komutuyla tek seferlik parola almak kolay ve basittir /sertifikalar scep-server otp üretimi. Basit bir değişken atama işlemi gerçekleştirirsek, daha sonra betiklerde kullanılabilecek bir dizi değeri elde ederiz.

ikinci yöntem, uygulaması da kolay olan tek seferlik bir parola elde etme - harici bir hizmet kullanarak random.org İstenilen sözde rasgele sayı dizisini oluşturmak için. İşte basitleştirilmiş konsol verileri bir değişkene alma örneği:

Kod
: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

Konsol için biçimlendirilmiş bir istek (kod gövdesinde özel karakterlerin kaçması gerekecektir) $rnd1 değişkenine altı basamaklı bir dize alır. Aşağıdaki "put" komutu, değişkeni MikroTik konsolunda görüntüler.

dördüncü sorun hızlı bir şekilde çözülmesi gerekiyordu - bu, bağlı istemcinin, kimlik doğrulamanın ikinci aşamasında tek seferlik kodunu nasıl ve nereye aktaracağıdır.

VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

MikroTik yönlendirici üzerinde, kodu kabul edebilen ve belirli bir istemciyle eşleştirebilen bir hizmet bulunmalıdır. Sağlanan kod beklenen kodla eşleşirse, müşterinin adresi, şirketin dahili ağına erişmesine izin verilen adresler olan belirli bir "beyaz" listeye dahil edilmelidir.

Kötü hizmet seçimi nedeniyle, Mikrotik'te yerleşik web proxy kullanılarak http üzerinden kodların kabul edilmesine karar verildi. Ve güvenlik duvarı, IP adreslerinin dinamik listeleriyle çalışabildiğinden, kod için arama yapan, onu istemci IP'si ile eşleştiren ve Layer7 regexp'i kullanarak "beyaz" listeye ekleyen güvenlik duvarıdır. Yönlendiricinin kendisine "gw.local" koşullu bir DNS adı atanmıştır, PPP istemcilerine verilmesi için üzerinde statik bir A kaydı oluşturulmuştur:

DNS
/ip dns statik ekleme adı=gw.yerel adres=172.31.1.1

Proxy'de doğrulanmamış istemcilerin trafiğini yakalama:
/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

Bu durumda, proxy'nin iki işlevi vardır.

1. İstemcilerle tcp bağlantılarını açın;

2. Başarılı yetkilendirme durumunda, istemci tarayıcısını başarılı kimlik doğrulamayı bildiren bir sayfaya veya resme yönlendirin:

proxy yapılandırması
/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

Önemli yapılandırma öğelerini listeleyeceğim:

  1. arayüz listesi "2fa" - trafiğin 2FA içinde işlenmesini gerektiren dinamik bir istemci arayüzleri listesi;
  2. adres listesi "2fa_jailed" - VPN istemcilerinin tünel IP adreslerinin "gri" listesi;
  3. address_list "2fa_approved" - iki faktörlü kimlik doğrulamayı başarıyla geçen VPN istemcilerinin tünel IP adreslerinin "beyaz" listesi.
  4. güvenlik duvarı zinciri "input_2fa" - tcp paketlerini bir yetkilendirme kodunun olup olmadığını kontrol eder ve kodu gönderenin IP adresini gerekli olanla eşleştirir. Zincirdeki kurallar dinamik olarak eklenir ve kaldırılır.

Paket işlemenin basitleştirilmiş bir akış şeması şöyle görünür:

VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Kimlik doğrulamanın ikinci aşamasını henüz geçmemiş "gri" listeden istemcilerden gelen trafiğin Layer7 kontrolüne girmek için, standart "giriş" zincirinde bir kural oluşturulmuştur:

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

Şimdi tüm bu zenginliği PPP hizmetine bağlamaya başlayalım. MikroTik, profillerdeki (ppp-profil) komut dosyalarını kullanmanıza ve bunları bir ppp bağlantısı kurma ve kesme olaylarına atamanıza olanak tanır. Ppp profili ayarları, PPP sunucusunun tamamına veya bireysel kullanıcılara uygulanabilir. Aynı zamanda, kullanıcıya atanan profil, bir bütün olarak sunucu için seçilen profilin parametrelerini, belirtilen parametrelerle geçersiz kılarak önceliğe sahiptir.

Bu yaklaşımın bir sonucu olarak, iki faktörlü kimlik doğrulama için özel bir profil oluşturabilir ve bunu tüm kullanıcılara değil, yalnızca bunu yapmayı gerekli görenlere atayabiliriz. Bu, PPP hizmetlerini yalnızca son kullanıcıları bağlamak için değil, aynı zamanda siteden siteye bağlantılar oluşturmak için kullanıyorsanız ilgili olabilir.

Yeni oluşturulan özel profilde, bağlı kullanıcının adresinin ve arayüzünün "gri" adres ve arayüz listelerine dinamik olarak eklenmesini kullanıyoruz:

kazanma kutusu
VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Kod
/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

Dstnat (ön yönlendirme) zincirindeki ikincil olmayan VPN istemcilerinden gelen trafiği tespit etmek ve yakalamak için hem "adres listesi" hem de "arayüz listesi" listelerinin kullanılması gereklidir.

Hazırlık tamamlandığında, ek güvenlik duvarı zincirleri ve bir profil oluşturulduğunda, 2FA kodunun ve bireysel güvenlik duvarı kurallarının otomatik oluşturulmasından sorumlu bir komut dosyası yazacağız.

Dokümantasyon wiki.mikrotik.com on PPP-Profile, bizi PPP istemcisi bağlantı kesme olaylarıyla ilişkili değişkenler hakkında bilgilerle zenginleştirir "Kullanıcı oturum açma olayında betiği yürüt. Bunlar, olay betiği için erişilebilen mevcut değişkenlerdir: kullanıcı, yerel adres, uzak adres, arayan kimliği, aranan kimlik, arayüz". Bazıları bizim için çok faydalıdır.

PPP bağlantı etkinliği için profilde kullanılan kod

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

Özellikle akılsızca kopyala-yapıştır yapmayı sevenler için sizi uyarıyorum - kod test sürümünden alınmıştır ve küçük yazım hataları içerebilir. Anlayışlı bir kişinin tam olarak nerede olduğunu anlaması zor olmayacaktır.

Bir kullanıcı bağlantıyı kestiğinde, bir "Açık-Aşağı" olayı oluşturulur ve ilgili parametreleri içeren komut dosyası çağrılır. Bu betiğin amacı bağlantısı kesilen kullanıcı için oluşturulan güvenlik duvarı kurallarını temizlemektir.

PPP on-down bağlantı olayı için profilde kullanılan kod

: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]
Daha sonra kullanıcılar oluşturabilir ve bunların tamamını veya bir kısmını iki faktörlü kimlik doğrulama profiline atayabilirsiniz.

kazanma kutusu
VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Kod
/ppp secrets set [find name=Petrov] profile=2FA

İstemci tarafında nasıl göründüğü.

Bir VPN bağlantısı kurulduğunda, SIM kartlı bir Android/iOS telefon/tablet şuna benzer bir SMS alır:

SMS
VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Bağlantı doğrudan telefondan / tabletten kurulursa, mesajdaki bağlantıya tıklayarak 2FA'yı geçebilirsiniz. O konforlu.

VPN bağlantısı bir PC'den kurulursa, kullanıcıdan minimum şifre formu girmesi istenecektir. VPN kurulumu yapılırken kullanıcıya HTML dosyası şeklinde küçük bir form verilir. Dosya, kullanıcının dosyayı kaydetmesi ve uygun bir yerde bir kısayol oluşturması için postayla bile gönderilebilir. Şuna benziyor:

Masanın üzerindeki etiket
VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Kullanıcı kısayola tıklar, kodu açılan URL'ye yapıştıracak basit bir kod giriş formu açılır:

Ekran formu
VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

En ilkel şekli örnek olarak verilmiştir. İsteyen kendisi değiştirebilir.

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>

Yetkilendirme başarılı olursa, kullanıcı tarayıcıda başarılı bir kimlik doğrulama sinyali vermesi gereken MikroTik logosunu görecektir:

VPN kullanıcılarının MikroTik ve SMS ile iki faktörlü kimlik doğrulaması

Görüntünün, WebProxy Reddetme Yönlendirmesi kullanılarak yerleşik MikroTik web sunucusundan döndürüldüğünü unutmayın.

Sanırım görüntü, "hotspot" aracı kullanılarak, kendi sürümünüzü oraya yükleyerek ve WebProxy ile Yeniden Yönlendirmeyi Reddet URL'sini ona ayarlayarak özelleştirilebilir.

En ucuz "oyuncak" Mikrotik'i 20$'a satın alıp 500$'lık yönlendiriciyi bununla değiştirmeye çalışanlara büyük bir ricam var - bunu yapmayın. "hAP Lite" / "hAP mini" (ev erişim noktası) gibi cihazlar çok zayıf bir CPU'ya (smips) sahiptir ve muhtemelen iş segmentindeki yükle baş edemeyeceklerdir.

Uyarı! Bu çözümün bir dezavantajı vardır: İstemciler bağlandığında veya bağlantısı kesildiğinde, yönlendiricinin geçici olmayan belleğine kaydetmeye çalıştığı yapılandırma değişiklikleri meydana gelir. Çok sayıda istemci ve sık bağlantı ve kopukluk olması, yönlendiricideki dahili depolamanın bozulmasına neden olabilir.

Not: İstemciye kod iletme yöntemleri, programlama yetenekleriniz yeterli olduğu sürece genişletilebilir ve tamamlanabilir. Örneğin, telegrama mesaj gönderebilir veya ... seçenekleri önerebilirsiniz!

Makalenin sizin için yararlı olacağını ve küçük ve orta ölçekli işletmelerin ağlarının biraz daha güvenli hale getirilmesine yardımcı olacağını umuyorum.

Kaynak: habr.com