Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Xin chào các đồng nghiệp! Ngày nay, khi cường độ đam mê xung quanh “làm việc từ xa” giảm đi một chút, phần lớn các quản trị viên đã giành được nhiệm vụ truy cập từ xa của nhân viên vào mạng công ty, đã đến lúc chia sẻ kinh nghiệm lâu năm của tôi trong việc cải thiện bảo mật VPN. Bài viết này sẽ không còn thời trang nữa IPSec IKEv2 và xAuth. Đó là về việc xây dựng một hệ thống. xác thực hai yếu tố (2FA) Người dùng VPN khi MikroTik hoạt động như một máy chủ VPN. Cụ thể, khi các giao thức "cổ điển" như PPP được sử dụng.

Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Hôm nay tôi sẽ cho bạn biết cách bảo vệ MikroTik PPP-VPN ngay cả khi tài khoản người dùng bị "cướp". Khi chương trình này được giới thiệu với một trong những khách hàng của tôi, anh ấy đã mô tả ngắn gọn về nó là “tốt, bây giờ nó giống như trong ngân hàng!”.

Phương pháp này không sử dụng các dịch vụ xác thực bên ngoài. Các tác vụ được thực hiện bên trong bởi chính bộ định tuyến. Không có chi phí cho khách hàng kết nối. Phương pháp này hoạt động cho cả máy khách PC và thiết bị di động.

Sơ đồ bảo vệ chung như sau:

  1. Địa chỉ IP nội bộ của người dùng đã kết nối thành công với máy chủ VPN sẽ tự động được đưa vào danh sách xám.
  2. Sự kiện kết nối sẽ tự động tạo mã một lần được gửi tới người dùng bằng một trong các phương pháp có sẵn.
  3. Các địa chỉ trong danh sách này có quyền truy cập hạn chế vào tài nguyên mạng cục bộ, ngoại trừ dịch vụ “trình xác thực” đang chờ nhận mật mã một lần.
  4. Sau khi trình bày mã, người dùng có quyền truy cập vào tài nguyên nội bộ của mạng.

Đầu tiên vấn đề nhỏ nhất mà tôi gặp phải là lưu trữ thông tin liên hệ về người dùng để gửi mã 2FA cho anh ta. Vì không thể tạo các trường dữ liệu tùy ý tương ứng với người dùng trong Mikrotik, nên trường “bình luận” hiện có đã được sử dụng:

/ppp bí mật add name=Petrov password=4M@ngr! bình luận="89876543210"

Thứ hai vấn đề trở nên nghiêm trọng hơn - việc lựa chọn đường dẫn và phương thức phân phối mã. Ba kế hoạch hiện đang được triển khai: a) SMS qua USB-modem b) e-mail c) SMS qua e-mail có sẵn cho các khách hàng doanh nghiệp của nhà khai thác di động đỏ.

Có, chương trình SMS mang lại chi phí. Nhưng nếu bạn nhìn, "bảo mật luôn là về tiền" (c).
Cá nhân tôi không thích chương trình với e-mail. Không phải vì nó yêu cầu máy chủ thư phải khả dụng cho ứng dụng khách đang được xác thực - việc phân chia lưu lượng không phải là vấn đề. Tuy nhiên, nếu khách hàng bất cẩn lưu cả mật khẩu vpn và email trong trình duyệt rồi làm mất máy tính xách tay của họ, kẻ tấn công sẽ có toàn quyền truy cập vào mạng công ty từ đó.

Vì vậy, nó đã được quyết định - chúng tôi gửi mã một lần bằng tin nhắn SMS.

Третья Vấn đề là ở đâu cách tạo mã giả ngẫu nhiên cho 2FA trong MikroTik. Không có sự tương tự của hàm random() trong ngôn ngữ kịch bản lệnh của RouterOS và tôi đã thấy một số trình tạo số giả ngẫu nhiên tập lệnh crutch trước đây. Tôi không thích bất kỳ ai trong số họ vì nhiều lý do.

Trên thực tế, có một trình tạo chuỗi giả ngẫu nhiên trong MikroTik! Nó bị ẩn khỏi một cái nhìn hời hợt trong ngữ cảnh của /certificates scep-server. Cách đầu tiên lấy mật khẩu một lần thật dễ dàng và đơn giản - với lệnh / chứng chỉ otp máy chủ scep tạo. Nếu chúng ta thực hiện một thao tác gán biến đơn giản, chúng ta sẽ nhận được một giá trị mảng có thể được sử dụng sau này trong các tập lệnh.

Cách thứ hai lấy mật khẩu một lần cũng dễ áp ​​dụng - sử dụng dịch vụ bên ngoài random.org để tạo ra loại dãy số giả ngẫu nhiên mong muốn. Đây là một đơn giản hóa cantilever ví dụ về việc lấy dữ liệu vào một biến:


: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

Một yêu cầu được định dạng cho bảng điều khiển (các ký tự thoát đặc biệt sẽ được yêu cầu trong phần thân tập lệnh) nhận một chuỗi gồm sáu chữ số vào biến $rnd1. Lệnh "đặt" sau đây chỉ hiển thị biến trong bảng điều khiển MikroTik.

Vấn đề thứ tư cần phải giải quyết nhanh chóng - đây là cách thức và vị trí khách hàng được kết nối sẽ chuyển mã một lần của mình ở giai đoạn xác thực thứ hai.

Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Phải có một dịch vụ trên bộ định tuyến MikroTik có thể chấp nhận mã và khớp với một máy khách cụ thể. Nếu mã được cung cấp khớp với mã dự kiến, thì địa chỉ của khách hàng phải được đưa vào danh sách "trắng" nhất định, các địa chỉ được phép truy cập vào mạng nội bộ của công ty.

Do sự lựa chọn dịch vụ kém, chúng tôi đã quyết định chấp nhận mã qua http bằng cách sử dụng webproxy được tích hợp trong Mikrotik. Và vì tường lửa có thể hoạt động với danh sách địa chỉ IP động, nên tường lửa sẽ thực hiện tìm kiếm mã, khớp mã đó với IP của máy khách và thêm mã đó vào danh sách "trắng" bằng biểu thức chính quy Layer7. Bản thân bộ định tuyến đã được gán một tên DNS có điều kiện là "gw.local", một bản ghi A tĩnh đã được tạo trên đó để cấp phát cho các máy khách PPP:

DNS
/ip dns tĩnh thêm tên=gw.local address=172.31.1.1

Nắm bắt lưu lượng của các máy khách chưa được xác minh trên proxy:
/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

Trong trường hợp này, proxy có hai chức năng.

1. Mở kết nối tcp với khách hàng;

2. Trong trường hợp xác thực thành công, chuyển hướng trình duyệt máy khách tới trang hoặc hình ảnh thông báo xác thực thành công:

cấu hình proxy
/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

Tôi sẽ liệt kê các yếu tố cấu hình quan trọng:

  1. danh sách giao diện "2fa" - danh sách động các giao diện máy khách, lưu lượng truy cập từ đó yêu cầu xử lý trong 2FA;
  2. danh sách địa chỉ "2fa_jailed" - danh sách địa chỉ IP đường hầm "xám" của máy khách VPN;
  3. address_list "2fa_approved" - danh sách "trắng" gồm các địa chỉ IP đường hầm của máy khách VPN đã vượt qua xác thực hai yếu tố thành công.
  4. chuỗi tường lửa "input_2fa" - nó kiểm tra các gói tcp để tìm mã ủy quyền và khớp địa chỉ IP của người gửi mã với địa chỉ được yêu cầu. Các quy tắc trong chuỗi được thêm và xóa một cách linh hoạt.

Một lưu đồ đơn giản hóa quá trình xử lý gói trông giống như sau:

Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Để tham gia kiểm tra lưu lượng Layer7 từ các máy khách từ danh sách "xám" chưa vượt qua giai đoạn xác thực thứ hai, một quy tắc đã được tạo trong chuỗi "đầu vào" tiêu chuẩn:


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

Bây giờ, hãy bắt đầu gắn tất cả sự giàu có này vào dịch vụ PPP. MikroTik cho phép bạn sử dụng các tập lệnh trong cấu hình (ppp-profile) và gán chúng cho các sự kiện thiết lập và phá vỡ kết nối ppp. Cài đặt cấu hình ppp có thể được áp dụng cho toàn bộ máy chủ PPP hoặc cho từng người dùng. Đồng thời, cấu hình được gán cho người dùng được ưu tiên, ghi đè các tham số của cấu hình được chọn cho toàn bộ máy chủ bằng các tham số được chỉ định của nó.

Kết quả của phương pháp này là chúng tôi có thể tạo một hồ sơ đặc biệt để xác thực hai yếu tố và chỉ định hồ sơ đó không phải cho tất cả người dùng mà chỉ cho những người cho rằng cần thiết phải làm như vậy. Điều này có thể phù hợp nếu bạn sử dụng các dịch vụ PPP không chỉ để kết nối người dùng cuối mà còn để xây dựng các kết nối giữa các trang.

Trong cấu hình đặc biệt mới được tạo, chúng tôi sử dụng bổ sung động địa chỉ và giao diện của người dùng được kết nối vào danh sách địa chỉ và giao diện "xám":

winbox
Xác thực hai yếu tố của người dùng VPN qua MikroTik và 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

Cần sử dụng cả danh sách "danh sách địa chỉ" và "danh sách giao diện" để phát hiện và nắm bắt lưu lượng truy cập từ các máy khách VPN không phụ trong chuỗi dstnat (định tuyến trước).

Khi quá trình chuẩn bị hoàn tất, các chuỗi tường lửa bổ sung và một hồ sơ được tạo, chúng tôi sẽ viết một tập lệnh chịu trách nhiệm tự động tạo mã 2FA và các quy tắc tường lửa riêng lẻ.

Tài liệu wiki.mikrotik.com trên Hồ sơ PPP làm phong phú thêm cho chúng tôi thông tin về các biến được liên kết với các sự kiện kết nối-ngắt kết nối máy khách PPP "Thực thi tập lệnh trên sự kiện đăng nhập của người dùng. Đây là các biến có sẵn có thể truy cập được đối với tập lệnh sự kiện: người dùng, địa chỉ cục bộ, địa chỉ từ xa, id người gọi, id được gọi, giao diện". Một số trong số họ rất hữu ích cho chúng tôi.

Mã được sử dụng trong hồ sơ cho sự kiện kết nối bật lên 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

Đặc biệt đối với những người thích sao chép-dán một cách thiếu suy nghĩ, tôi cảnh báo bạn - mã này được lấy từ phiên bản thử nghiệm và có thể chứa các lỗi chính tả nhỏ. Sẽ không khó để một người hiểu biết tìm ra chính xác vị trí.

Khi người dùng ngắt kết nối, một sự kiện “Đang tắt” được tạo và tập lệnh tương ứng với các tham số được gọi. Mục đích của tập lệnh này là dọn sạch các quy tắc tường lửa được tạo cho người dùng bị ngắt kết nối.

Mã được sử dụng trong hồ sơ cho sự kiện kết nối từ trên xuống của 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]
Sau đó, bạn có thể tạo người dùng và gán tất cả hoặc một số người trong số họ cho cấu hình xác thực hai yếu tố.

winbox
Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS


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

Nó trông như thế nào ở phía khách hàng.

Khi kết nối VPN được thiết lập, điện thoại/máy tính bảng Android/iOS có thẻ SIM sẽ nhận được một tin nhắn SMS như sau:

tin nhắn
Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Nếu kết nối được thiết lập trực tiếp từ điện thoại / máy tính bảng, thì bạn có thể thực hiện 2FA chỉ bằng cách nhấp vào liên kết từ tin nhắn. Thật thoải mái.

Nếu kết nối VPN được thiết lập từ PC, thì người dùng sẽ được yêu cầu nhập một mẫu mật khẩu tối thiểu. Một biểu mẫu nhỏ ở dạng tệp HTML được cung cấp cho người dùng khi thiết lập VPN. Tệp thậm chí có thể được gửi qua thư để người dùng lưu tệp và tạo lối tắt ở một nơi thuận tiện. Nó trông như thế này:

Dán nhãn trên bàn
Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Người dùng nhấp vào phím tắt, một biểu mẫu nhập mã đơn giản sẽ mở ra, biểu mẫu này sẽ dán mã vào URL đã mở:

hình thức màn hình
Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Hình thức nguyên thủy nhất được đưa ra làm ví dụ. Những người muốn có thể sửa đổi cho chính mình.

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>

Nếu ủy quyền thành công, người dùng sẽ thấy biểu tượng MikroTik trong trình duyệt, biểu tượng này báo hiệu xác thực thành công:

Xác thực hai yếu tố của người dùng VPN qua MikroTik và SMS

Lưu ý rằng hình ảnh được trả về từ máy chủ web MikroTik tích hợp sử dụng Chuyển hướng từ chối WebProxy.

Tôi cho rằng hình ảnh có thể được tùy chỉnh bằng công cụ "điểm phát sóng", tải lên phiên bản của riêng bạn ở đó và đặt URL chuyển hướng từ chối cho nó bằng WebProxy.

Một yêu cầu lớn đối với những người đang cố gắng mua Mikrotik "đồ chơi" rẻ nhất với giá 20 đô la và thay thế bộ định tuyến 500 đô la bằng nó - đừng làm vậy. Các thiết bị như "hAP Lite" / "hAP mini" (điểm truy cập gia đình) có CPU rất yếu (smips) và có khả năng chúng sẽ không chịu được tải trong phân khúc doanh nghiệp.

Cảnh báo! Giải pháp này có một nhược điểm: khi các máy khách kết nối hoặc ngắt kết nối, các thay đổi về cấu hình sẽ xảy ra mà bộ định tuyến cố gắng lưu trong bộ nhớ cố định của nó. Với số lượng lớn máy khách và kết nối và ngắt kết nối thường xuyên, điều này có thể dẫn đến sự xuống cấp của bộ nhớ trong trong bộ định tuyến.

Tái bút: Các phương thức gửi mã cho máy khách có thể được mở rộng và bổ sung tùy theo khả năng lập trình của bạn là đủ. Ví dụ: bạn có thể gửi tin nhắn đến telegram hoặc ... đề xuất tùy chọn!

Tôi hy vọng bài viết sẽ hữu ích cho bạn và sẽ giúp làm cho mạng của các doanh nghiệp vừa và nhỏ an toàn hơn một chút.

Nguồn: www.habr.com