Организация на дистанционна работа в SMB организация с OpenVPN

Формулиране на задачата

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

Целта на статията е да внедри завършена система за предоставяне на отдалечен достъп до организацията, която е малко повече от „инсталиране на OpenVPN за 10 минути“.

В резултат на това получаваме система, в която за удостоверяване на потребителите ще се използват сертификати и (по избор) корпоративен каталог Active Directory. По този начин ще получим система с двуфакторна проверка — какво имам (сертификат) и какво знам (парола).

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

Цената за внедряване на решението е само малки хардуерни ресурси и 1 час работа на системен администратор.

Ще използваме виртуална машина с OpenVPN и Easy-RSA версия 3 на CentOS 7, с 4 vCPU и 4 GiB RAM, което е проектирано за 100 връзки.

В примера мрежата на нашата организация е 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. Необходима ни е инсталация на ОС в минимална конфигурация. Удобно е да направим това с използване на kickstart, клониране на предварително инсталиран образ на ОС и други средства.

След инсталацията, назначаване на адрес на мрежовия интерфейс (по условията на задачата 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="admin@abc.ru"
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

съдържание следното

URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"

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

  • 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 openvpn@server.service
$ sudo systemctl start openvpn@server.service

Проверка на старта:

systemctl status openvpn@server.service
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


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


key-direction 1

-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----

Бележки:

  • редове 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

Приблизителното съдържание на файла е следното:


  
    -i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
  
    -i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    -i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '

Обяснения

По същество това са обичайни правила 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

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