Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

Операционная система сервера = Ubuntu 20.04

...

Операционная система клиента = Ubuntu 20.04

Имя VPN клиента = user

Настройка сервера

Установка пакетов для работы

За основу инструкции по настройки настройке сервера была взята следующая инструкция.

...

Code Block
languagebash
titleУстановка пакетов
sudo apt update
# пакеты для работы strongSwan VPN сервера
sudo apt-get install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins

# пакеты для работы со смарт-картами и токенами (чтобы создать ключевую пару и сертификаты на Рутокене)
sudo apt install opensc libengine-pkcs11-openssl1.1

Генерация ключевых пар и сертификатов УЦ и сервера:

Code Block
languagebash
titleСоздание ключевых пар и сертификатов УЦ и сервера
# инициализируем директорию для хранения ключей и сертификатов
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki

# создание ключевой пары УЦ
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
# создание корневого сертификата
pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
    --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

# создание ключевой пары сервера
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
# получение сертификата сервера
# обратите внимание, что аргументы --dn и --san нужно будет заменить на свои
pki --pub --in ~/pki/private/server-key.pem --type rsa \
    | pki --issue --lifetime 1825 \
        --cacert ~/pki/cacerts/ca-cert.pem \
        --cakey ~/pki/private/ca-key.pem \
        --dn "CN=server.astradomomain.ad" --san server.astradomain.ad  \
        --flag serverAuth --flag ikeIntermediate --outform pem \
    >  ~/pki/certs/server-cert.pem

# копируем полученные сертификаты в директорию strongSwan
sudo cp -r ~/pki/* /etc/ipsec.d/


Настройка strongSwan

Сохраним предыдущую конфигурацию:

...

Code Block
languagebash
title/etc/ipsec.secrets
: RSA "server-key.pem"


Настройка firewall

Code Block
languagebash
titleНастройка firewall
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw allow 500,4500/udp

...

Узнаем имя интерфейса, к которому подключен сервер. Данное имя нам потребуется в дальнейшей при настройке firewall. Это можно сделать с помощью команды:

Code Block
languagebash
titleУзнаем имя интерфейса
ip route show default
# вывод данноеданной команды будет примерно следующим:
# default via your_server_ip dev eth0 proto static
# Имя интерфейса -- eth0

...

Code Block
languagebash
titleПерезагрузка firewall
sudo ufw disable
sudo ufw enable

Запуск VPN сервера

Code Block
languagebash
titleЗапуск сервера
sudo systemctl restart strongswan-starter

Проверить, что сервер поднялся успешно, можно, например, с помощью команды:

Code Block
languagebash
titleПроверка запуска сервера
sudo systemctl status strongswan-starter

Image Modified

Добавление нового клиента со смарт-картой

Info
titleМодуль pkcs11 для работы со смарт-картами

В настоящий момент смарт-карта отформатированная для работы с librtpkcs11ecp.so модулем не подходит для аутентификации внутри VPN strongSwan тstrongSwan, т.к. не поддерживает необходимые PKCS#11-механизмы. 

К счастью, модуль opensc-pkcs11.so их поддерживает их.


Отформатируем смарт-карту, сгенерируем на ней ключи и  получим сертификат.

Code Block
languagebash
titleПодготовка смарт-карты
# форматирование и инициализация
pkcs15-init --erase-card -p rutoken_ecp
pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""
pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize

# генерация ключей
ID=45
pkcs15-init -G rsa/2048 --auth-id 02 --label "My Private Key" --public-key-label "My Public Key" --id $ID

# генерация заявки на сертификат
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:opensc-pkcs11.so
# не забудьте заменить идентификатор сертификата
> req -engine pkcs11 -new -key 45 -keyform engine -out req.csr -subj "/C=RU/CN=user"
> exit

# выдадим сертификат по заявке
pki --issue --lifetime 1825 \
        --cacert ~/pki/cacerts/ca-cert.pem \
        --cakey ~/pki/private/ca-key.pem \
        --in req.csr --type pkcs10 --outform pem \
    >  ~/pki/certs/client-cert.pem

# загрузим сертификат на токен
pkcs15-init --store-certificate ~/pki/certs/client-cert.pem --auth-id 02 --id $ID --format pem

...

Теперь Рутокен готов к работе и его можно отдать клиенту.

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

Проверка доступности сервера

Проверим, что сервер доступен доступен. 

Code Block
languagebash
titleпроверка доступности сервера
ping server.astradomain.ad


Установка пакетов

Установим необходимые пакеты для работы:

Code Block
languagebash
titleУстановка пакетов
sudo apt update
# пакеты для работы strongSwan VPN сервера
sudo apt-get install strongswan libstrongswan-extra-plugins  libcharon-extra-plugins

# пакеты для работы со смарт-картами (чтобы создать ключевую пару и сертификаты на токене)
sudo apt install opensc libengine-pkcs11-openssl1.1


Настройка strongSwan

Корневой сертификат сервера положим в дирректорию директорию /etc/ipsec.d/cacerts:

Code Block
languagebash
titleУстановка корневого сертификата
sudo cp /path/to/ca-cert.pem /etc/ipsec.d/cacerts

...

Настроим файл паролей аутентфикации strongSwan /etc/ipsec.secrets и укажем, какой ключ нужно использовать для аутентфикации аутентификации по смарт-карте:

Code Block
languagebash
title/etc/ipsec.secrets
# Формат следующий
#: PIN %smartcard:<keyid> <pin code>
: PIN %smartcard:45 "12345678"

Более подробно о способах задания паролей смарт-карт можно почитать тут здесь.

Настройка модуля pkcs11

Настроим использование pkcs11 модулей в strongSwan. Для этого откроем файл конфигурации /etc/strongswan.d/charon/pkcs11.conf и отредактируем настройки модулей pkcs11:

Code Block
languagebash
title/etc/strongswan.d/charon/pkcs11.conf
modules {

        opensc-pkcs11 {

            # Whether to automatically load certificates from tokens.
            # load_certs = yes

            # Whether OS locking should be enabled for this module.
            # os_locking = no

            # Full path to the shared object file of this PKCS#11 module.
            path = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so

        }

Подключение к сети

Подключите смарт-карту и инициализируйте подключение c помощью команды:

...

Среди них появится ваш виртуальный ip: