Організація віддаленої роботи SMB організації на OpenVPN

Постановка завдання

Стаття описує організацію віддаленого доступу співробітників на продуктах з відкритим вихідним кодом і може бути використана як для побудови повністю автономної системи, так і виявиться корисною для розширення, коли в наявній комерційній системі виникає брак ліцензій або її продуктивність недостатня.

Мета статті – впровадити закінчену систему надання віддаленого доступу організації, що трохи більше, ніж «установка OpenVPN за 10 хвилин».

В результаті ми отримаємо систему, в якій для аутентифікації користувачів будуть використовуватись сертифікати та (опційно) корпоративний каталог Active Directory. Т.о. ми отримаємо систему з двома факторами перевірки – що маю (сертифікат) та що знаю (пароль).

Ознакою, що користувачеві дозволено підключення, є його членство групи myVPNUsr. Центр сертифікації буде використаний автономний.

Ціна впровадження рішення – лише невеликі апаратні ресурси та 1 година роботи системного адміністратора.

Ми будемо використовувати віртуальну машину з OpenVPN та Easy-RSA 3-ї версії на CetntOS 7, якій із розрахунку на 100 підключень видано 4 vCPU, 4 GiB RAM.

В примере сеть нашей организации 172.16.0.0/16, в которой VPN сервер с адресом 172.16.19.123 расположен в сегменте 172.16.19.0/24, DNS серверы 172.16.16.16 и 172.16.17.17, а для VPN клиентов выделена подсеть 172.16.20.0/23 .

Для підключення ззовні використовується підключення по порту 1194/udp, а DNS для нашого сервера створено A-запис gw.abc.ru.

Категорично не рекомендується вимикати SELinux! OpenVPN працює без вимкнення політик безпеки.

Зміст

  1. Установка ОС та прикладного ПЗ
  2. Налаштування криптографії
  3. Налаштування OpenVPN
  4. Аутентифікація в AD
  5. Запуск та діагностика
  6. Випуск та відгук сертифіката
  7. Налаштування мережі
  8. Що далі

Установка ОС та прикладного ПЗ

Використовуємо дистрибутив CentOS 7.8.2003. Нам потрібна установка ОС у мінімальній конфігурації. Зручно робити це з використанням різкий пуск, клонуванням раніше встановленого образу ОС та іншими засобами

Після встановлення, призначення адреси мережного інтерфейсу (за умовами задачі 172.16.19.123), виконуємо оновлення ОС:

$ sudo yum update -y && reboot

Також необхідно переконатись, що на нашій машині виконується синхронізація часу.
Для установки прикладного ПЗ потрібні пакети openvpn, openvpn-auth-ldap, easy-rsa та vim як основний редактор (потрібний репозиторій EPEL).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Для віртуальної машини корисно встановити гостьового агента:

$ sudo yum install open-vm-tools

для хостів VMware ESXi, або для oVirt

$ sudo yum install ovirt-guest-agent

Налаштування криптографії

Переходимо до каталогу easy-rsa:

$ cd /usr/share/easy-rsa/3/

Створюємо файл змінних:

$ sudo vim vars

такого змісту:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Тут описані параметри для умовної організації ТОВ ABC, можна виправити їх на справжні або залишити з прикладу. Найважливіше в параметрах останній рядок, що визначає термін дії сертифіката в днях. У прикладі використано значення 10 років (365*10+2 високосних років). Це значення необхідно буде скоригувати перед випуском сертифікатів користувачів.

Далі налаштовуємо автономний центр сертифікації.

Налаштування включає експорт змінних, ініціалізацію ЦС, випуск кореневих ключа та сертифіката ЦС, ключ Діффі-Хеллмана, ключ TLS, а також ключа та сертифіката сервера. Ключ центру сертифікації необхідно ретельно оберігати та зберігати в секреті! Усі параметри під час запитів можна залишити за замовчуванням.

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

На цьому основну частину налаштування криптографічного механізму закінчено.

Налаштування OpenVPN

Переходимо до каталогу OpenVPN, створюємо службові каталоги та додаємо посилання на easy-rsa:

cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/

Створюємо основний файл конфігурації OpenVPN:

$ sudo vim server.conf

наступного змісту

port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

Деякі зауваження щодо параметрів:

  • якщо під час випуску сертифіката було указне інше ім'я — вкажіть його;
  • пул адрес вказуйте під свої завдання*;
  • маршрутів та DNS серверів може бути один або декілька;
  • 2 останні рядки потрібні для реалізації аутентифікації AD**.

*Вибраний у прикладі діапазон адрес дозволить підключитися одночасно до 127 клієнтів, т.к. вибрана мережа /23, а OpenVPN створює кожного клієнта підсіть по масці /30.
При необхідності порт і протокол можуть бути змінені, проте слід мати на увазі, що зміна порту номера порту спричинить налаштування SELinux, а використання протоколу tcp підвищить накладні витрати, т.к. контроль доставки tcp-пакетів вже виконується лише на рівні інкапсульованих у тунель пакетів.

**Якщо аутентифікація в AD не потрібна, закоментуйте їх, наступний розділ — пропустіть, а у шаблоні видаліть рядок auth-user-pass.

Аутентифікація в AD

Для підтримки другого фактора будемо використовувати перевірку облікового запису AD.

Нам необхідний обліковий запис у домені з правами рядового користувача та група, членством якої буде визначатися можливість підключення.

Створюємо конфігураційний файл:

/etc/openvpn/ldap.conf

наступного змісту

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Основні параметри:

  • URL "ldap://ldap.abc.ru" - адреса контролера домену;
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" - канонічне ім'я для прив'язки до LDAP (УЗ - bindUsr в контейнері abc.ru/Users);
  • Password b1ndP@SS - пароль користувача для прив'язки;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - шлях, з якого починати пошук користувача;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - контейнер роздільної здатності групи (група myVPNUsr в контейнері abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" - ім'я роздільної здатності групи.

Запуск та діагностика

Тепер ми можемо спробувати увімкнути і запустити наш сервер:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Перевірка запуску:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Випуск та відгук сертифіката

Т.к. Крім самих сертифікатів необхідні ключі та інші налаштування, дуже зручно обернути все це в один файл профілю. Цей файл потім передається користувачеві і профіль вже імпортується на клієнті OpenVPN. Для цього створимо шаблон налаштувань та скрипт, який формує профіль.

У профіль потрібно додати вміст файлів кореневого сертифіката (ca.crt) та ключ TLS (ta.key).

Перед випуском сертифікатів користувачів не забудьте встановити потрібний термін дії сертифікатів у файлі параметрів. Не слід робити його надто великим, рекомендую обмежитися максимум 180 днями.

vim /usr/share/easy-rsa/3/vars

...
export EASYRSA_CERT_EXPIRE=180

vim /usr/share/easy-rsa/3/client/template.ovpn

client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass

<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

Примітки:

  • строки PUT YOUR… міняємо на вміст на своїх сертифікатів;
  • у директиві remote вкажіть ім'я/адресу свого шлюзу;
  • директива auth-user-pass використовується для додаткової зовнішньої автентифікації.

У домашньому каталозі (або іншому зручному місці) створюємо скрипт запиту сертифіката та створення профілю:

vim ~/make.profile.sh

#!/bin/bash

if [ -z "$1" ] ; then
 echo Missing mandatory client name. Usage: $0 vpn-username
 exit 1
fi

#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn

#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client

cd $basepath

if [  -f client/$client* ]; then
    echo "*** ERROR! ***"
    echo "Certificate $client already issued!"
    echo "*** ERROR! ***"
    exit 1
fi

. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client

#Make profile
cp $clntpath/template.ovpn $profile

echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile

echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt

echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile

#remove tmp file
rm -f $basepath/$1.crt

echo Complete. See $profile file.

cd ~

Робимо файл виконуваним:

chmod a+x ~/make.profile.sh

І можна випустити наш перший сертифікат.

~/make.profile.sh my-first-user

Відгук

У разі компрометації сертифіката (втрата, крадіжка) необхідно відкликати цей сертифікат:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Перегляд виданих та відкликаних сертифікатів

Для перегляду виданих та відкликаних сертифікатів достатньо переглянути індексний файл:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

пояснення:

  • першим рядком іде сертифікат сервера;
  • перший символ
    • V (Valid) - дійсний;
    • R (Revoked) - відкликаний.

Налаштування мережі

Останні кроки – налаштування мережі передачі – маршрутизації та міжмережевих екранів.

Дозвіл підключень до локального брандмауера:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Далі, включаємо маршрутизацію IP трафіку:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

У корпоративному середовищі, напевно, існує розподіл на підмережі і нам необхідно повідомити маршрутизатору (-ам), яким чином відправляти пакети, адресовані нашим VPN клієнтам. У командному рядку виконуємо команду на зразок (залежить від обладнання, що використовується):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

та зберігаємо конфігурацію.

Крім цього, на інтерфейсі прикордонного маршрутизатора, де обслуговується зовнішня адреса gw.abc.ru, необхідно дозволити проходження пакетів udp/1194.

У випадку, якщо в організації діють суворі правила безпеки, на нашому сервері VPN необхідно також налаштувати міжмережевий екран. На мою думку, найбільшу гнучкість дає налаштування iptables ланцюжків FORWARD, хоча налаштовувати їх менш зручно. Трохи докладніше про їхнє налаштування. Для цього найзручніше використовувати «прямі правила» — direct rules, що зберігаються у файлі /etc/firewalld/direct.xml. Чинну конфігурацію правил можна дізнатися так:

$ sudo firewall-cmd --direct --get-all-rule

Перед зміненням файлу зробіть його резервну копію:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Зразковий вміст файлу такий:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Пояснення

Фактично це звичайні правила iptables, інакше упаковані після появи firewalld.

Інтерфейс призначення за замовчуванням tun0, а зовнішній для тунелю може бути іншим, напр., ens192, залежно від платформи.

Останній рядок призначений для журналування відкинутих пакетів. Щоб журналювання запрацювало, у конфігурації firewalld потрібно змінити рівень налагодження:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Застосування налаштувань – звичайна команда firewalld для перечитування налаштувань:

$ sudo firewall-cmd --reload

Відкинуті пакети можна переглянути так:

grep forward_fw /var/log/messages

Що далі

На цьому налаштування закінчено!

Залишилося на стороні клієнта встановити клієнтське програмне забезпечення, імпортувати профіль та підключитися. Для ОС типу Windows дистрибутив розміщено на сайті розробника.

На завершення підключаємо наш новий сервер до систем моніторингу та архівації і не забуваємо регулярно встановлювати оновлення.

Стабільного конекту!

Джерело: habr.com

Додати коментар або відгук