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

Проблем изявление

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

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

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

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

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

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

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

За връзка отвън се използва връзка през порт 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 LLC са описани тук, можете да ги коригирате към реалните или да ги оставите от примера. Най-важното в параметрите е последният ред, който определя срока на валидност на сертификата в дни. Примерът използва стойността 10 години (365*10+2 високосни години). Тази стойност ще трябва да се коригира преди издаването на потребителски сертификати.

След това конфигурираме автономен сертифициращ орган.

Настройката включва експортиране на променливи, инициализиране на CA, издаване на главния ключ и сертификат на CA, ключ Diffie-Hellman, TLS ключ и сървърен ключ и сертификат. CA ключът трябва да бъде внимателно защитен и пазен в тайна! Всички параметри на заявката могат да бъдат оставени по подразбиране.

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 (UZ - bindUsr в контейнера abc.ru/Users);
  • Парола 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>

Забележки:

  • линии ПОСТАВЕТЕ ВАШИЯ... промяна на съдържанието техен сертификати;
  • в отдалечената директива посочете името/адреса на вашия шлюз;
  • директивата 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 вериги, въпреки че настройването им е по-малко удобно. Малко повече за настройката им. За да направите това, най-удобно е да използвате „директни правила“ - директни правила, съхранени във файл /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, в зависимост от използваната платформа.

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

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

Прилагането на настройки е обичайната команда на защитната стена за повторно четене на настройките:

$ sudo firewall-cmd --reload

Можете да видите изпуснатите пакети по следния начин:

grep forward_fw /var/log/messages

Какво следва?

Това завършва настройката!

Остава само да инсталирате клиентския софтуер от страната на клиента, да импортирате профила и да се свържете. За операционни системи Windows комплектът за разпространение се намира на сайт за разработчици.

Накрая свързваме нашия нов сървър със системите за мониторинг и архивиране и не забравяйте редовно да инсталирате актуализации.

Стабилна връзка!

Източник: www.habr.com

Добавяне на нов коментар