Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Проблематика

Доскоро много хора не знаеха какво означава да работят от вкъщи. Пандемията рязко промени ситуацията в света, всички започнаха да се адаптират към новите обстоятелства, а именно към факта, че излизането от дома стана просто небезопасно. И много хора трябваше бързо да организират работа от вкъщи за своите служители.

Но липсата на разумен подход при избора на решения за дистанционна работа може да доведе до необратими загуби. Паролите на потребителите могат да бъдат откраднати, а това ще даде възможност на престъпника да се свързва неконтролируемо с мрежата и ИТ-ресурсите на предприятието.

Точно затова в момента нарасна нуждата от създаване на надеждни корпоративни VPN мрежи. Аз ще ви разкажа за надеждна, сигурна и лесна за използване VPN мрежа.

Тя работи по схемата IPsec/L2TP, използваща необратими ключове и сертификати за аутентикация на клиентите, съхранявани на токени, и предава данни по мрежата в криптиран вид.

Като демонстрационни стендове за настройка са използвани сървър с CentOS 7 (адрес: centos.vpn.server.ad) и клиент с Ubuntu 20.04, а също и клиент с Windows 10.

Описание на системата

VPN ще работи по схемата IPSec + L2TP + PPP. Протоколът Point-to-Point Protocol (PPP) работи на канално ниво на модела OSI и осигурява аутентикация на потребителя и криптиране на предаваните данни. Неговите данни се инкапсулират в данните на протокола L2TP, който собствено осигурява създаването на връзка в VPN мрежата, но не осигурява аутентикация и криптиране.

Данните на L2TP се инкапсулират в протокол IPSec, който също осигурява аутентикация и криптиране, но за разлика от протокола PPP, аутентикацията и криптирането се извършват на ниво устройства, а не на ниво потребители.

Тази особеност позволява аутентикация на потребителите само от определени устройства. Ние ще използваме протокол IPSec в този случай и ще позволим извършването на аутентикация на потребителите от всяко устройство.

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Аутентикацията на потребителя с помощта на смарт карти ще се извършва на ниво протокол PPP с помощта на протокол EAP-TLS.

По-подробна информация за работата на тази схема може да намерите в тази статия.

Защо тази схема отговаря на трите основни изисквания за добра VPN мрежа

  1. Надеждността на тази схема е доказана с времето. Тя се използва за разгръщане на VPN мрежи от 2000 година.
  2. Сигурната аутентикация на потребителя се осигурява от протокола PPP. Стандартната реализация на протокола PPP, разработена от Paul Mackerras, не осигурява достатъчно ниво на сигурност, тъй като за аутентификация в най-добрия случай се използва аутентификация с потребителско име и парола. Всички знаем, че паролите могат да бъдат подслушвани, подбирани или откраднати. Въпреки това, разработчикът Jan Just Keijser в в своята реализация на този протокол е поправил този момент и е добавил възможността за използване на протоколи, базирани на асиметрично криптиране, като EAP-TLS, за аутентификация. Освен това е добавил възможността за използване на смарт карти за аутентификация, което направи системата по-сигурна.
    В момента се водят активни преговори за сливане на тези два проекта и можем да сме сигурни, че рано или късно това ще се случи. Например, в хранилищата на Fedora отдавна вече съществува патчната версия на PPP, която използва сигурни протоколи за аутентификация.
  3. Още преди време тази мрежа можеше да се използва само от потребители на Windows, но нашите колеги от МГУ Василий Шоков и Александър Смирнов намериха стар проект на L2TP клиент за Linux и го доразвиха. Съвместните усилия ни помогнаха да поправим много бъгове и недостатъци в работата на клиента, улеснихме инсталацията и настройката на системата, дори при компилация от изходни кодове. Най-съществени от тях са:
    • Проблемите с съвместимостта на стария клиент с интерфейса на новите версии на openssl и qt са оправени.
    • Изтриването на предаване на PIN-кода на токена през временен файл.
    • Коригирано е неправилното стартиране на програмата за питане на парола през графичния интерфейс. Това беше направено чрез задаване на коректна среда за xl2tpd услугата.
    • Сборката на демона L2tpIpsecVpn сега се извършва съвместно със самата сборка на клиента, което улеснява процеса на сборка и настройка.
    • За удобство на разработката е интегрирана системата Azure Pipelines за тестване на коректността на сборката.
    • Добавена е възможността за принудително понижаване на security level в контекста на openssl. Това е полезно за коректна поддръжка на нови операционни системи, където стандартното ниво на сигурност е зададено на 2, с VPN мрежи, в които се използват сертификати, които не отговарят на изискванията за сигурност на това ниво. Тази опция ще бъде полезна за работа с вече съществуващи стари VPN мрежи.

Коригирана версия може да бъде намерена в този репозиторий.

Този клиент поддържа използването на смарт-карти за идентификация, а също така максимално прикрива всички трудности и неразположения при настройката на тази схема под Linux, правейки конфигурацията на клиента максимално проста и бърза.

Разбира се, за удобна свързване на PPP и GUI клиента не се е минало без допълнителни корекции на всеки от проектите, но въпреки това успяхме да ги минимизираме:

Сега можем да преминем към конфигурацията.

Конфигуриране на сървъра

Нека инсталираме всички необходими пакети.

Инсталиране на strongswan (IPsec)

Първо, ще конфигурираме防火墙 за работа с ipsec

sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reload

След това продължаваме с инсталацията

sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswan

След инсталацията е необходимо да зададете конфигурация за strongswan (една от реализациите на IPSec). За това ще редактираме файла /etc/strongswan/ipsec.conf :

config setup
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey 

conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=%any
    leftprotoport=udp/1701
    right=%any
    rightprotoport=udp/%any
    ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
    esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024

Нека зададем общо парол за вход. Общият парол трябва да е известен на всички участници в мрежата за удостоверяване. Този метод е явното ненадежден, тъй като този парол лесно може да стане известен на лица, на които не искаме да предоставяме достъп до мрежата.
Все пак, дори и този факт няма да повлияе на сигурността на организацията на мрежата, тъй като основното криптиране на данните и удостоверяването на потребителите се извършва от протокола PPP. Но, за справедливост, трябва да се отбележи, че strongswan поддържа по-сигурни технологии за удостоверяване, например, с помощта на частни ключове. В strongswan също така има възможност за удостоверяване с помощта на смарт карти, но в момента се поддържа ограничен набор от устройства и поради това удостоверяването с помощта на токени и смарт карти Рутокен е все още затруднително. Нека зададем общия парол чрез файла. /etc/strongswan/ipsec.secrets:

# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"

Нека рестартираме strongswan:

sudo systemctl enable strongswan
sudo systemctl restart strongswan

Инсталиране на xl2tp

sudo dnf install xl2tpd

Нека го конфигурираме чрез файла /etc/xl2tpd/xl2tpd.conf:

[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes

[lns default]
exclusive = no
; определя статичен адрес на сървъра във виртуалната мрежа
local ip = 100.10.10.1
; задава диапазон от виртуални адреси
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; тази опция може да бъде деактивирана след успешната настройка на мрежата
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; указва адреса на сървъра в мрежата
name = centos.vpn.server.ad

Нека рестартираме службата:

sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpd

Настройка на PPP

Препоръчително е да инсталирате последната версия на pppd. За целта изпълнете следната последователност от команди:

sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make install

Въведете в файла /etc/ppp/options.xl2tpd следното (ако там има някакви стойности, те могат да бъдат изтрити):

ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1

noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000

Изписваме кореновия сертификат и сертификата на сървъра:

#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/

#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"

#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserial

Така завършихме с основната настройка на сървъра. Останалата част от конфигурацията на сървъра е свързана с добавянето на нови клиенти.

Добавяне на нов клиент

За да добавите нов клиент в мрежата, е необходимо да запишете неговия сертификат в списъка с одобрени за този клиент.

Ако потребителят иска да стане член на мрежата VPN, той създава ключова двойка и заявление за сертификат за този клиент. Ако потребителят е доверен, заявлението може да бъде подписано, а получените сертификати да бъдат записани в директорията за сертификати:

sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserial

Добавяме ред в файла /etc/ppp/eaptls-server за свързване на името на клиента с неговия сертификат:

"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *

ЗАБЕЛЕЖКА
За да не се объркате, по-добре е: Общото име, името на файла със сертификата и името на потребителя да бъдат уникални.

Също така е важно да се провери, че в други файлове за автентикация никъде не фигурира името на потребителя, когото добавяме, в противен случай ще възникнат проблеми с метода на автентикация на потребителя.

Този сертификат трябва да бъде изпратен обратно на потребителя.

Генерация на ключова двойка и сертификат

За успешна автентикация клиентът трябва:

  1. да генерира ключова двойка;
  2. да разполага с коренен сертификат на ЦС;
  3. да има сертификат за своята ключова двойка, подписан от коренния ЦС.

за клиенти на Linux

Първо ще генерираме ключова двойка на токена и ще създадем заявление за сертификат:

#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45

openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"

Изпратете полученото заявление client.req към ЦС. След като получите сертификата за своята ключова двойка, запишете го на токена със същия id, какъвто е на ключа:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45

за клиенти Windows и Linux (по-универсален метод)

Този метод е по-универсален, тъй като позволява да се генерира ключ и сертификат, който ще бъде успешно разпознат от потребители на Windows и Linux, но изисква машина с Windows за провеждане на процеса на генериране на ключове.

Преди да генерирате заявки и да импортирате сертификати, е необходимо да добавите коренния сертификат на VPN мрежата в списъка с доверени. За целта го отворете и в отвореното прозорче изберете опцията "Инсталирай сертификат":

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В отвореното прозорче изберете инсталация на сертификат за локален потребител:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Инсталирайте сертификата в хранилището на доверени коренни сертификати на ЦС:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След всички тези действия, се съгласяваме с всички последващи точки. Сега системата е настроена.

Създайте файл cert.tmp със следното съдържание:

[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSE

След това ще генерираме ключова двойка и ще създадем заявление за сертификат. За целта ще отворим PowerShell и ще въведем следната команда:

certreq.exe -new -pin $PIN .cert.tmp .client.req

Изпратете създаденото заявление client.req до вашия УЦ и изчакайте да получите сертификата client.pem. Можете да го запишете на токена и да го добавите в хранилището на сертификати Windows с помощта на следната команда:

certreq.exe -accept .client.pem

Струва си да отбележим, че подобни действия могат да се извършат и с графичния интерфейс на програмата mmc, но този метод е по-времезадържащ и по-малко програмиран.

Настройка на клиента Ubuntu

ЗАБЕЛЕЖКА
Настройката на клиента на Linux в момента е доста времезадържаща, тъй като изисква компилиране на отделни програми от изходния код. Ще се постараем в кратък срок всички промени да бъдат включени в официалните репозитории.

За осигуряване на свързването на нивото IPSec към сървера — се използват пакета strongswan и демона xl2tp. За опростяване на свързването в мрежата с помощта на смарт карти – ще използваме пакета l2tp-ipsec-vpn, който предоставя графичен интерфейс за опростена настройка на свързването.

Нека започнем с поетапна компилация на елементите, но преди това да инсталираме всички необходими пакети за непосредствена работа с VPN:

sudo apt-get install xl2tpd strongswan libp11-3

Инсталиране на софтуер за работа с токени

Инсталирайте последната версия на библиотеката librtpkcs11ecp.so с сайта, както и библиотеки за работа със смарт карти:

sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-openssl

Свържете Рутокен и проверете дали системата го разпознава:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l

Инсталиране на патчнат ppp

sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make install

Инсталиране на клиента L2tpIpsecVpn

В момента и клиентът трябва да се компилира от изходния код. Това става с помощта на следната последователност от команди:

sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make install

Настройка на клиента L2tpIpsecVpn

Стартираме инсталирания клиент:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След стартиране трябва да ви се отвори аплетът L2tpIpsecVPN. Щракнете с десния бутон върху него и конфигурирайте връзката:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

За работа с токени, на първо място, ще посочим пътя на движка opensc OpenSSL и библиотеката PKCS#11. За това отворете раздела "Настройки" за конфигуриране на параметрите на openssl:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI.

Ще затворим прозореца с настройките на OpenSSL и ще преминем към конфигуриране на мрежата. Добавете нова мрежа, като натиснете бутона Add… в панела с настройки и въведете името на мрежата:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След това тази мрежа ще стане достъпна в панела с настройки. Ще кликнем два пъти с десен бутон върху новата мрежа, за да я конфигурираме. В първия раздел трябва да направим настройките на IPsec. Ще зададем адреса на сървъра и общия ключ:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След това преминаваме на раздела за настройка на PPP и там ще посочим името на потребителя, с който искаме да влезем в мрежата:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След това ще отворим раздела Properties и ще посочим пътя до ключа, сертификата на клиента и УЦ:
Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Ще затворим този раздел и ще извършим финалната настройка, за което ще отворим раздела "IP настройки" и ще поставим отметка до опцията "Автоматично получаване на адрес на DNS сървър":

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI
Тази опция ще позволи на клиента да получава личен IP адрес от сървъра в мрежата.

След всички настройки, ще затворим всички раздели и ще рестартираме клиента:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Свързване с мрежа

След настройките можем да осъществим връзка с мрежата. За това ще отворим раздела на аплета и ще изберем мрежата, с която искаме да се свържем:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В процеса на установяване на връзката клиентът ще поиска да въведем PIN-код на Рутокен:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Ако в статус бара се появи известие, че връзката е успешно установена, значи настройката е извършена успешно:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В противен случай, трябва да разберем защо връзката не е била установена. За това е добре да прегледате лог файла на програмата, избирайки в аплета командата "Информация за връзката":

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Настройка на клиента за Windows

Настройката на клиента в Windows е много по-лесна, отколкото в Linux, тъй като софтуерът, който е необходим, вече е вграден в системата.

Настройка на системата

Ще инсталираме всички необходими драйвери за работа с Рутокените, изтегляйки ги от официалния сайт.

Импорт на кореновия сертификат за аутентификация

Ще изтеглим кореновия сертификат на сървъра и ще го инсталираме в системата. За това ще го отворим и в появилото се прозорец изберем опцията "Инсталиране на сертификат":

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В появилото се прозорец ще изберем инсталация на сертификата за локален потребител. Ако искате сертификатът да бъде достъпен за всички потребители на компютъра, тогава трябва да изберете инсталация на сертификата на локалния компютър:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Инсталирайте сертификата в хранилището на доверени коренни сертификати на ЦС:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

След всички тези действия, се съгласяваме с всички последващи точки. Сега системата е настроена.

Настройка на VPN връзка

За да настроите VPN свързване, отидете в контролния панел и изберете опцията за създаване на ново свързване.

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В изскачащото прозорче изберете опцията за създаване на свързване за свързване с работното място:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В следващото прозорче изберете свързване по VPN:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

и въведете данните за VPN свързването, както и посочете опцията за използване на смарт карти:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Настройката не приключва тук. Остава да посочите общия ключ за протокола IPsec, за което преминете на таба “Настройки на мрежовите връзки” и след това отидете на таба “Свойства за това свързване”:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В отворилото се прозорче отидете на таба "Сигурност", задайте типа на мрежата "Мрежа L2TP/IPsec" и изберете "Допълнителни параметри":

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В отворилото се прозорче задайте общия ключ IPsec:
Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Свързване

След завършване на настройката можете да опитате да се свържете с мрежата:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

В процеса на свързване от нас ще се изисква да въведем PIN кода на токена:

Настройка на удостоверяване в мрежата L2TP с помощта на Рутокен ЕЦП 2.0 и Рутокен PKI

Настроихме сигурна VPN мрежа и се уверихме, че това не е трудно.

Благодарности

Искам отново да благодаря на нашите колеги Василий Шоков и Александър Смирнов за съвместно извършената работа за опростяване на създаването на VPN връзки за клиенти на Linux.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster