Organisasyon ng malayong gawain ng isang organisasyon ng SMB sa OpenVPN

Pahayag ng problema

Inilalarawan ng artikulo ang organisasyon ng malayuang pag-access para sa mga empleyado sa mga open source na produkto at maaaring magamit pareho upang bumuo ng isang ganap na autonomous na sistema, at magiging kapaki-pakinabang para sa pagpapalawak kapag may kakulangan ng mga lisensya sa umiiral na komersyal na sistema o ang pagganap nito ay hindi sapat.

Ang layunin ng artikulo ay upang ipatupad ang isang kumpletong sistema para sa pagbibigay ng malayuang pag-access sa isang organisasyon, na higit pa sa "pag-install ng OpenVPN sa loob ng 10 minuto."

Bilang resulta, makakakuha kami ng system kung saan ang mga certificate at (opsyonal) ang corporate Active Directory ay gagamitin upang patotohanan ang mga user. yun. makakakuha tayo ng system na may dalawang verification factor - kung ano ang mayroon ako (certificate) at kung ano ang alam ko (password).

Isang senyales na pinapayagang kumonekta ang isang user ay ang kanilang membership sa myVPNUsr group. Gagamitin offline ang awtoridad ng certificate.

Ang halaga ng pagpapatupad ng solusyon ay maliit lamang na mapagkukunan ng hardware at 1 oras na trabaho ng system administrator.

Gagamit kami ng virtual machine na may OpenVPN at Easy-RSA na bersyon 3 sa CetntOS 7, na inilalaan ng 100 na vCPU at 4 na GiB RAM sa bawat 4 na koneksyon.

Sa halimbawa, ang network ng aming organisasyon ay 172.16.0.0/16, kung saan ang VPN server na may address na 172.16.19.123 ay matatagpuan sa segment na 172.16.19.0/24, mga DNS server na 172.16.16.16 at 172.16.17.17, at ang subnet 172.16.20.0. Ang .23/XNUMX ay inilalaan para sa mga kliyente ng VPN .

Upang kumonekta mula sa labas, isang koneksyon sa pamamagitan ng port 1194/udp ay ginagamit, at isang A-record gw.abc.ru ay ginawa sa DNS para sa aming server.

Mahigpit na hindi inirerekomenda na huwag paganahin ang SELinux! Gumagana ang OpenVPN nang hindi pinapagana ang mga patakaran sa seguridad.

nilalaman

  1. Pag-install ng OS at software ng application
  2. Pagse-set up ng cryptography
  3. Pag-configure ng OpenVPN
  4. AD Authentication
  5. Startup at diagnostics
  6. Isyu ng sertipiko at pagbawi
  7. Ang pagsasaayos ng network
  8. kung ano ang susunod

Pag-install ng OS at software ng application

Ginagamit namin ang pamamahagi ng CentOS 7.8.2003. Kailangan nating i-install ang OS sa isang minimal na configuration. Ito ay maginhawa upang gawin ito gamit sipa simula, pag-clone ng dati nang naka-install na imahe ng OS at iba pang paraan.

Pagkatapos ng pag-install, pagtatalaga ng isang address sa interface ng network (ayon sa mga tuntunin ng gawain 172.16.19.123), ina-update namin ang OS:

$ sudo yum update -y && reboot

Kailangan din nating tiyakin na ang pag-synchronize ng oras ay isinasagawa sa ating makina.
Upang mag-install ng software ng application, kailangan mo ang openvpn, openvpn-auth-ldap, easy-rsa at vim packages bilang pangunahing editor (kakailanganin mo ang EPEL repository).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Kapaki-pakinabang na mag-install ng guest agent para sa isang virtual machine:

$ sudo yum install open-vm-tools

para sa mga host ng VMware ESXi, o para sa oVirt

$ sudo yum install ovirt-guest-agent

Pagse-set up ng cryptography

Pumunta sa direktoryo ng easy-rsa:

$ cd /usr/share/easy-rsa/3/

Lumikha ng variable na file:

$ sudo vim vars

sumusunod na nilalaman:

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

Ang mga parameter para sa kondisyong organisasyon ABC LLC ay inilarawan dito; maaari mong iwasto ang mga ito sa mga tunay o iwanan ang mga ito mula sa halimbawa. Ang pinakamahalagang bagay sa mga parameter ay ang huling linya, na tumutukoy sa panahon ng bisa ng sertipiko sa mga araw. Ginagamit ng halimbawa ang value na 10 taon (365*10+2 leap years). Ang halagang ito ay kailangang isaayos bago maibigay ang mga certificate ng user.

Susunod, nag-configure kami ng autonomous na awtoridad sa sertipikasyon.

Kasama sa setup ang pag-export ng mga variable, pagsisimula ng CA, pag-isyu ng CA root key at certificate, Diffie-Hellman key, TLS key, at server key at certificate. Ang CA key ay dapat na maingat na protektado at panatilihing lihim! Ang lahat ng mga parameter ng query ay maaaring iwanang default.

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

Kinukumpleto nito ang pangunahing bahagi ng pag-set up ng mekanismo ng cryptographic.

Pag-configure ng OpenVPN

Pumunta sa direktoryo ng OpenVPN, lumikha ng mga direktoryo ng serbisyo at magdagdag ng link sa 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/

Lumikha ng pangunahing file ng pagsasaayos ng OpenVPN:

$ sudo vim server.conf

sumusunod na nilalaman

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

Ang ilang mga tala sa mga parameter:

  • kung ibang pangalan ang tinukoy noong nag-isyu ng sertipiko, ipahiwatig ito;
  • tukuyin ang pool ng mga address na angkop sa iyong mga gawain*;
  • maaaring mayroong isa o higit pang mga ruta at mga DNS server;
  • Ang huling 2 linya ay kailangan para ipatupad ang pagpapatunay sa AD**.

*Ang hanay ng mga address na pinili sa halimbawa ay magbibigay-daan sa hanggang 127 mga kliyente na kumonekta nang sabay-sabay, dahil ang /23 network ay pinili, at ang OpenVPN ay lumilikha ng isang subnet para sa bawat kliyente gamit ang /30 mask.
Kung kinakailangan, maaaring baguhin ang port at protocol, gayunpaman, dapat tandaan na ang pagpapalit ng numero ng port port ay mangangailangan ng pag-configure ng SELinux, at ang paggamit ng tcp protocol ay tataas ang overhead, dahil Ang TCP packet delivery control ay ginagawa na sa antas ng mga packet na naka-encapsulate sa tunnel.

**Kung hindi kailangan ang pagpapatunay sa AD, magkomento sa kanila, laktawan ang susunod na seksyon, at sa template alisin ang linya ng auth-user-pass.

AD Authentication

Para suportahan ang pangalawang salik, gagamitin namin ang pag-verify ng account sa AD.

Kailangan namin ng isang account sa domain na may mga karapatan ng isang ordinaryong user at isang grupo, ang membership kung saan tutukuyin ang kakayahang kumonekta.

Gumawa ng configuration file:

/etc/openvpn/ldap.conf

sumusunod na nilalaman

<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" - address ng domain controller;
  • BindDN β€œCN=bindUsr,CN=Users,DC=abc,DC=ru” - canonical na pangalan para sa pagbubuklod sa LDAP (UZ - bindUsr sa lalagyan ng abc.ru/Users);
  • Password b1ndP@SS β€” password ng user para sa pagbubuklod;
  • BaseDN β€œOU=allUsr,DC=abc,DC=ru” β€” ang landas kung saan magsisimulang maghanap para sa user;
  • BaseDN β€œOU=myGrp,DC=abc,DC=ru” – lalagyan ng pinapayagang grupo (grupo myVPNUsr sa lalagyan abc.rumyGrp);
  • Ang SearchFilter "(cn=myVPNUsr)" ay ang pangalan ng pinapayagang pangkat.

Startup at diagnostics

Ngayon ay maaari naming subukang paganahin at simulan ang aming server:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Pagsusuri sa pagsisimula:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Isyu ng sertipiko at pagbawi

kasi Bilang karagdagan sa mga sertipiko mismo, kailangan mo ng mga susi at iba pang mga setting; ito ay napaka-maginhawa upang ibalot ang lahat ng ito sa isang file ng profile. Ang file na ito ay ililipat sa user at ang profile ay ini-import sa OpenVPN client. Upang gawin ito, gagawa kami ng template ng mga setting at isang script na bumubuo sa profile.

Kailangan mong idagdag ang mga nilalaman ng root certificate (ca.crt) at TLS key (ta.key) na mga file sa profile.

Bago mag-isyu ng mga sertipiko ng gumagamit huwag kalimutang itakda ang kinakailangang panahon ng bisa para sa mga sertipiko sa file ng mga parameter. Hindi mo dapat gawin itong masyadong mahaba; Inirerekomenda kong limitahan ang iyong sarili sa maximum na 180 araw.

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>

remarks:

  • mga kuwerdas Ilagay ang iyong... baguhin sa nilalaman ng kanilang mga sertipiko;
  • sa remote na direktiba, tukuyin ang pangalan/address ng iyong gateway;
  • ang auth-user-pass directive ay ginagamit para sa karagdagang panlabas na pagpapatotoo.

Sa direktoryo ng bahay (o iba pang maginhawang lugar) lumikha kami ng isang script para sa paghiling ng isang sertipiko at paglikha ng isang profile:

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 ~

Ginagawang executable ang file:

chmod a+x ~/make.profile.sh

At maaari kaming mag-isyu ng aming unang sertipiko.

~/make.profile.sh my-first-user

Feedback

Sa kaso ng kompromiso ng isang sertipiko (pagkawala, pagnanakaw), kinakailangan na bawiin ang sertipiko na ito:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Tingnan ang ibinigay at binawi na mga sertipiko

Upang tingnan ang mga inisyu at binawi na mga sertipiko, tingnan lamang ang index file:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Paliwanag:

  • ang unang linya ay ang sertipiko ng server;
  • unang karakter
    • V (Valid) - wasto;
    • R (Bawi) - naalala.

Ang pagsasaayos ng network

Ang mga huling hakbang ay upang i-configure ang transmission network - pagruruta at mga firewall.

Pinapayagan ang mga koneksyon sa lokal na firewall:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Susunod, paganahin ang pagruruta ng trapiko ng IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

Sa isang corporate environment, malamang na mayroong subnetting at kailangan naming sabihin sa (mga) router kung paano magpadala ng mga packet na nakalaan para sa aming mga VPN client. Sa command line, isinasagawa namin ang utos sa paraang (depende sa kagamitan na ginamit):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

at i-save ang configuration.

Bilang karagdagan, sa interface ng border ng router kung saan inihahatid ang panlabas na address gw.abc.ru, kinakailangan upang payagan ang pagpasa ng mga udp/1194 packet.

Kung sakaling ang organisasyon ay may mahigpit na mga panuntunan sa seguridad, dapat ding i-configure ang isang firewall sa aming VPN server. Sa palagay ko, ang pinakamalaking kakayahang umangkop ay ibinibigay sa pamamagitan ng pagse-set up ng mga iptables na FORWARD chain, kahit na ang pagse-set up ng mga ito ay hindi gaanong maginhawa. Kaunti pa tungkol sa pagse-set up sa kanila. Upang gawin ito, ito ay pinaka-maginhawang gumamit ng "mga direktang panuntunan" - mga direktang panuntunan, na nakaimbak sa isang file /etc/firewalld/direct.xml. Ang kasalukuyang pagsasaayos ng mga patakaran ay matatagpuan tulad ng sumusunod:

$ sudo firewall-cmd --direct --get-all-rule

Bago magpalit ng file, gumawa ng backup na kopya nito:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Ang tinatayang nilalaman ng file ay:

<?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>

Mga Paliwanag

Ang mga ito ay mahalagang mga regular na panuntunan ng iptables, kung hindi man ay nakabalot pagkatapos ng pagdating ng firewalld.

Ang patutunguhang interface na may mga default na setting ay tun0, at ang panlabas na interface para sa tunnel ay maaaring iba, halimbawa, ens192, depende sa ginamit na platform.

Ang huling linya ay para sa pag-log ng mga nahulog na packet. Para gumana ang pag-log, kailangan mong baguhin ang antas ng debug sa configuration ng firewalld:

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

Ang paglalapat ng mga setting ay ang karaniwang firewalld na utos upang muling basahin ang mga setting:

$ sudo firewall-cmd --reload

Maaari mong tingnan ang mga nahulog na packet tulad nito:

grep forward_fw /var/log/messages

kung ano ang susunod

Nakumpleto nito ang pag-setup!

Ang natitira na lang ay i-install ang client software sa client side, i-import ang profile at kumonekta. Para sa mga operating system ng Windows, matatagpuan ang distribution kit sa website ng developer.

Panghuli, ikinonekta namin ang aming bagong server sa mga sistema ng pagsubaybay at pag-archive, at huwag kalimutang regular na mag-install ng mga update.

Matatag na koneksyon!

Pinagmulan: www.habr.com

Magdagdag ng komento