Арганізацыя выдаленай працы 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 працуе без адключэння палітык бяспекі.
Выкарыстоўваны дыстрыбутыў CentOS 7.8.2003. Нам патрэбна ўстаноўка АС у мінімальнай канфігурацыі. Зручна рабіць гэта з выкарыстаннем рэзкі пуск, кланаваннем раней усталяванай выявы АС і іншымі сродкамі.
Пасля ўсталёўкі, прызначэнні адрасу сеткаваму інтэрфейсу (па ўмовах задачы 172.16.19.123), выконваем абнаўленне АС:
$ sudo yum update -y && reboot
Таксама неабходна пераканацца, што на нашай машыне выконваецца сінхранізацыя часу.
Для ўсталёўкі прыкладнога ПЗ патрэбныя пакеты openvpn, openvpn-auth-ldap, easy-rsa і vim як асноўны рэдактар (спатрэбіцца рэпазітар EPEL).
Тут апісаны параметры для ўмоўнай арганізацыі ТАА "ABC", можна выправіць іх на сапраўдныя або пакінуць з прыкладу. Самае важнае ў параметрах - апошні радок, якая вызначае тэрмін дзеяння сертыфіката ў днях. У прыкладзе выкарыстана значэнне 10 гадоў (365*10+2 высакосных гады). Гэта значэнне неабходна будзе адкарэкціраваць перад выпускам сертыфікатаў карыстальнікаў.
Далей наладжваем аўтаномны цэнтр сертыфікацыі.
Настройка ўключае экспарт зменных, ініцыялізацыю ЦС, выпуск каранёвых ключа і сертыфіката ЦС, ключ Дыфі-Хеллмана, ключ TLS, а таксама ключа і сертыфіката сервера. Ключ цэнтра сертыфікацыі неабходна старанна аберагаць і захоўваць у сакрэце! Усе параметры пры запытах можна пакінуць па змаўчанні.
На гэтым асноўная частка налады крыптаграфічнага механізму скончана.
Настройка 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.
Нам неабходны ўліковы запіс у дамене з правамі радавога карыстальніка і група, сяброўствам у якой будзе вызначацца магчымасць падключэння.
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) - адкліканы.
Настройка сеткі
Апошнія крокі – настройка сеткі перадачы – маршрутызацыі і міжсеткавых экранаў.
У карпаратыўным асяроддзі напэўна існуе дзяленне на падсеткі і нам неабходна паведаміць маршрутызатару (-ам), якім чынам адпраўляць пакеты, адрасаваныя нашым 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. Дзейную канфігурацыю правілаў можна даведацца так:
Па істоце гэта звычайныя правілы 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 дыстрыбутыў размешчаны на сайце распрацоўніка.
У завяршэнне падлучаем наш новы сервер да сістэм маніторынгу і архівацыі, і не забываем рэгулярна ўсталёўваць абнаўленні.