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

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

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

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

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

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

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

Ще използваме виртуална машина с OpenVPN и Easy-RSA версия 3 на CentOS 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. Необходима ни е инсталация на операционната система в минимална конфигурация. Удобно е да го направите с помощта на 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="BG"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.bg"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.bg"
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.bg"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=bg"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


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

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

  • URL „ldap://ldap.abc.bg“ — адрес на контролера на домейна;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=bg“ — канонично име за свързване с LDAP (УЗ — bindUsr в контейнера abc.bg/Users);
  • Password b1ndP@SS — паролата на потребителя за свързване;
  • BaseDN „OU=allUsr,DC=abc,DC=bg“ — път, откъдето започва търсенето на потребители;
  • BaseDN „OU=myGrp,DC=abc,DC=bg“ — контейнер на одобряващата група (група myVPNUsr в контейнера abc.bg/myGrp);
  • 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