OpenVPN дээр SMB байгууллагын алсын зайн ажлыг зохион байгуулах

Асуудлын тодорхойлолт

Нийтлэлд нээлттэй эхийн бүтээгдэхүүн дээр ажилчдад алсын зайнаас хандах зохион байгуулалтыг тайлбарласан бөгөөд бүрэн бие даасан системийг бий болгоход ашиглах боломжтой бөгөөд одоо байгаа арилжааны системд лицензийн хомсдол эсвэл түүний гүйцэтгэл хангалтгүй байгаа тохиолдолд өргөтгөхөд хэрэгтэй болно.

Өгүүллийн зорилго нь "OpenVPN-ийг 10 минутын дотор суулгах" -аас арай илүү зүйл болох байгууллагад алсаас нэвтрэх бүрэн системийг хэрэгжүүлэх явдал юм.

Үүний үр дүнд бид хэрэглэгчдийг баталгаажуулахад гэрчилгээ болон (заавал биш) корпорацийн Active Directory ашиглах системийг авах болно. Тэр. Бид баталгаажуулах хоёр хүчин зүйл бүхий системийг авах болно - надад байгаа зүйл (сертификат) болон миний мэддэг зүйл (нууц үг).

Хэрэглэгч холбогдохыг зөвшөөрсөн шинж тэмдэг нь myVPNUsr бүлгийн гишүүнчлэл юм. Сертификатыг офлайнаар ашиглах болно.

Шийдлийг хэрэгжүүлэх зардал нь зөвхөн жижиг техник хангамжийн нөөц, системийн администраторын 1 цагийн ажил юм.

Бид CetntOS 3 дээр OpenVPN болон Easy-RSA хувилбар 7-тай виртуал машин ашиглах бөгөөд 100 холболтод 4 vCPU, 4 GiB RAM хуваарилдаг.

Жишээлбэл, манай байгууллагын сүлжээ нь 172.16.0.0/16 бөгөөд 172.16.19.123 хаягтай VPN сервер 172.16.19.0/24 сегмент, DNS серверүүд 172.16.16.16, 172.16.17.17, 172.16.20.0, 23. нет. .XNUMX/XNUMX нь VPN үйлчлүүлэгчдэд зориулагдсан.

Гаднаас холбогдохын тулд 1194/udp портоор холбогдсон холболтыг ашигладаг бөгөөд манай серверийн DNS дээр gw.abc.ru A-record үүсгэсэн.

SELinux-ийг идэвхгүй болгохыг хатуу зөвлөдөггүй! OpenVPN нь аюулгүй байдлын бодлогыг идэвхгүй болгохгүйгээр ажилладаг.

Агуулга

  1. OS болон хэрэглээний програм хангамжийг суурилуулах
  2. Криптографийг тохируулж байна
  3. OpenVPN-г тохируулж байна
  4. AD баталгаажуулалт
  5. Эхлүүлэх, оношлох
  6. Сертификат олгох, хүчингүй болгох
  7. Сүлжээний тохиргоо
  8. Дараа нь юу юм

OS болон хэрэглээний програм хангамжийг суурилуулах

Бид 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="[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 өндөр жил) утгыг ашигласан. Хэрэглэгчийн гэрчилгээ олгохоос өмнө энэ утгыг тохируулах шаардлагатай.

Дараа нь бид бие даасан баталгаажуулалтын байгууллагыг тохируулна.

Тохируулга нь хувьсагчийг экспортлох, 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 сервер байж болно;
  • AD**-д баталгаажуулалтыг хэрэгжүүлэхийн тулд сүүлийн 2 мөр шаардлагатай.

*Жишээнд сонгосон хаягуудын хүрээ нь 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 - abc.ru/Users контейнерт bindUsr);
  • Нууц үг b1ndP@SS - холбох хэрэглэгчийн нууц үг;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — хэрэглэгчийг хайж эхлэх зам;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – зөвшөөрөгдсөн бүлгийн контейнер (abc.rumyGrp саванд myVPNUsr бүлэг);
  • 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 (Хүчин төгөлдөр) - хүчинтэй;
    • R (Хүчингүй болсон) - эргүүлэн татав.

Сүлжээний тохиргоо

Сүүлийн алхамууд нь дамжуулах сүлжээг тохируулах явдал юм - чиглүүлэлт ба галт хана.

Орон нутгийн галт хананд холболт хийхийг зөвшөөрөх:

$ 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-ийн ердийн дүрэм юм.

Анхдагч тохиргоотой очих интерфейс нь tun0 бөгөөд туннелийн гадаад интерфейс нь ашигласан платформоос хамааран өөр байж болно, жишээлбэл ens192.

Сүүлийн мөр нь хаягдсан пакетуудыг бүртгэх зориулалттай. Ажиллахын тулд та галт ханын тохиргоонд дибаг хийх түвшинг өөрчлөх шаардлагатай.

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

Тохиргоог ашиглах нь тохиргоог дахин унших ердийн галт ханын тушаал юм:

$ sudo firewall-cmd --reload

Та хаягдсан пакетуудыг дараах байдлаар харж болно:

grep forward_fw /var/log/messages

Дараа нь юу юм

Энэ нь тохиргоог дуусгаж байна!

Үлдсэн зүйл бол үйлчлүүлэгчийн програм хангамжийг клиент тал дээр суулгаж, профайлыг импортлох, холбох явдал юм. Windows үйлдлийн системүүдийн хувьд түгээлтийн хэрэгсэл нь дээр байрладаг хөгжүүлэгчийн вэбсайт.

Эцэст нь бид шинэ серверээ хяналт, архивын системд холбож, шинэчлэлтүүдийг тогтмол суулгахаа бүү мартаарай.

Тогтвортой холболт!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх