Арганізацыя выдаленай працы 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

Дадаць каментар