
Проблематика
Доскоро много хора не знаеха какво означава да работят от вкъщи. Пандемията рязко промени ситуацията в света, всички започнаха да се адаптират към новите обстоятелства, а именно към факта, че излизането от дома стана просто небезопасно. И много хора трябваше бързо да организират работа от вкъщи за своите служители.
Но липсата на разумен подход при избора на решения за дистанционна работа може да доведе до необратими загуби. Паролите на потребителите могат да бъдат откраднати, а това ще даде възможност на престъпника да се свързва неконтролируемо с мрежата и ИТ-ресурсите на предприятието.
Точно затова в момента нарасна нуждата от създаване на надеждни корпоративни 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 в този случай и ще позволим извършването на аутентикация на потребителите от всяко устройство.

Аутентикацията на потребителя с помощта на смарт карти ще се извършва на ниво протокол PPP с помощта на протокол EAP-TLS.
По-подробна информация за работата на тази схема може да намерите в .
Защо тази схема отговаря на трите основни изисквания за добра VPN мрежа
- Надеждността на тази схема е доказана с времето. Тя се използва за разгръщане на VPN мрежи от 2000 година.
- Сигурната аутентикация на потребителя се осигурява от протокола PPP. не осигурява достатъчно ниво на сигурност, тъй като за аутентификация в най-добрия случай се използва аутентификация с потребителско име и парола. Всички знаем, че паролите могат да бъдат подслушвани, подбирани или откраднати. Въпреки това, разработчикът в на този протокол е поправил този момент и е добавил възможността за използване на протоколи, базирани на асиметрично криптиране, като EAP-TLS, за аутентификация. Освен това е добавил възможността за използване на смарт карти за аутентификация, което направи системата по-сигурна.
В момента се водят активни преговори за сливане на тези два проекта и можем да сме сигурни, че рано или късно това ще се случи. Например, в хранилищата на Fedora отдавна вече съществува патчната версия на PPP, която използва сигурни протоколи за аутентификация. - Още преди време тази мрежа можеше да се използва само от потребители на Windows, но нашите колеги от МГУ Василий Шоков и Александър Смирнов намериха и го доразвиха. Съвместните усилия ни помогнаха да поправим много бъгове и недостатъци в работата на клиента, улеснихме инсталацията и настройката на системата, дори при компилация от изходни кодове. Най-съществени от тях са:
- Проблемите с съвместимостта на стария клиент с интерфейса на новите версии на openssl и qt са оправени.
- Изтриването на предаване на PIN-кода на токена през временен файл.
- Коригирано е неправилното стартиране на програмата за питане на парола през графичния интерфейс. Това беше направено чрез задаване на коректна среда за xl2tpd услугата.
- Сборката на демона L2tpIpsecVpn сега се извършва съвместно със самата сборка на клиента, което улеснява процеса на сборка и настройка.
- За удобство на разработката е интегрирана системата Azure Pipelines за тестване на коректността на сборката.
- Добавена е възможността за принудително понижаване на в контекста на openssl. Това е полезно за коректна поддръжка на нови операционни системи, където стандартното ниво на сигурност е зададено на 2, с VPN мрежи, в които се използват сертификати, които не отговарят на изискванията за сигурност на това ниво. Тази опция ще бъде полезна за работа с вече съществуващи стари VPN мрежи.
Коригирана версия може да бъде намерена в .
Този клиент поддържа използването на смарт-карти за идентификация, а също така максимално прикрива всички трудности и неразположения при настройката на тази схема под Linux, правейки конфигурацията на клиента максимално проста и бърза.
Разбира се, за удобна свързване на PPP и GUI клиента не се е минало без допълнителни корекции на всеки от проектите, но въпреки това успяхме да ги минимизираме:
- Отстранена е
- Отстранена е . Тази грешка не позволяваше зареждането от локалния /etc/ppp/openssl.cnf файл с конфигурация на нищо, освен информация за движещите се компоненти на openssl за работа със смарт-карти, което съставяше сериозно неудобство, ако например, освен информация за двигателите, искахме да зададем нещо друго. Например, да фиксираме нивото на сигурност при установяване на връзката.
Сега можем да преминем към конфигурацията.
Конфигуриране на сървъра
Нека инсталираме всички необходими пакети.
Инсталиране на 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 *ЗАБЕЛЕЖКА
За да не се объркате, по-добре е: Общото име, името на файла със сертификата и името на потребителя да бъдат уникални.
Също така е важно да се провери, че в други файлове за автентикация никъде не фигурира името на потребителя, когото добавяме, в противен случай ще възникнат проблеми с метода на автентикация на потребителя.
Този сертификат трябва да бъде изпратен обратно на потребителя.
Генерация на ключова двойка и сертификат
За успешна автентикация клиентът трябва:
- да генерира ключова двойка;
- да разполага с коренен сертификат на ЦС;
- да има сертификат за своята ключова двойка, подписан от коренния ЦС.
за клиенти на 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 мрежата в списъка с доверени. За целта го отворете и в отвореното прозорче изберете опцията "Инсталирай сертификат":

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

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

След всички тези действия, се съгласяваме с всички последващи точки. Сега системата е настроена.
Създайте файл 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
Стартираме инсталирания клиент:

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

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

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

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

След това ще отворим раздела Properties и ще посочим пътя до ключа, сертификата на клиента и УЦ:

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

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

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

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

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

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

Настройка на клиента за Windows
Настройката на клиента в Windows е много по-лесна, отколкото в Linux, тъй като софтуерът, който е необходим, вече е вграден в системата.
Настройка на системата
Ще инсталираме всички необходими драйвери за работа с Рутокените, изтегляйки ги от .
Импорт на кореновия сертификат за аутентификация
Ще изтеглим кореновия сертификат на сървъра и ще го инсталираме в системата. За това ще го отворим и в появилото се прозорец изберем опцията "Инсталиране на сертификат":

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

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

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

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

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

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

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

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

В отворилото се прозорче задайте общия ключ IPsec:

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

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

Настроихме сигурна VPN мрежа и се уверихме, че това не е трудно.
Благодарности
Искам отново да благодаря на нашите колеги Василий Шоков и Александър Смирнов за съвместно извършената работа за опростяване на създаването на VPN връзки за клиенти на Linux.
Източник: habr.com
