Organisaasje fan wurk op ôfstân fan in SMB-organisaasje op OpenVPN

Probleemintwurding

It artikel beskriuwt de organisaasje fan tagong op ôfstân foar meiwurkers op iepen boarne produkten en kin sawol brûkt wurde om in folslein autonoom systeem te bouwen, en sil nuttich wêze foar útwreiding as d'r in tekoart is oan lisinsjes yn it besteande kommersjele systeem of syn prestaasjes is net genôch.

It doel fan it artikel is om in folslein systeem te ymplementearjen foar it jaan fan tagong op ôfstân oan in organisaasje, wat net folle mear is dan "ynstallearje fan OpenVPN yn 10 minuten."

As gefolch krije wy in systeem wêryn sertifikaten en (opsjoneel) de Corporate Active Directory sille wurde brûkt om brûkers te autentisearjen. Dat. wy sille in systeem krije mei twa ferifikaasjefaktoaren - wat ik haw (sertifikaat) en wat ik wit (wachtwurd).

In teken dat in brûker tastien is om te ferbinen is har lidmaatskip yn 'e myVPNUsr-groep. De sertifikaatautoriteit sil offline wurde brûkt.

De kosten foar it útfieren fan de oplossing binne mar lytse hardware-boarnen en 1 oere wurk fan de systeembehearder.

Wy sille in firtuele masine brûke mei OpenVPN en Easy-RSA ferzje 3 op CetntOS 7, dy't 100 vCPU's en 4 GiB RAM per 4 ferbiningen wurdt tawiisd.

Yn it foarbyld is it netwurk fan ús organisaasje 172.16.0.0/16, wêryn de VPN-tsjinner mei it adres 172.16.19.123 leit yn it segmint 172.16.19.0/24, DNS-tsjinners 172.16.16.16 en 172.16.17.17. .172.16.20.0/23 wurdt tawiisd foar VPN-kliïnten.

Om fan bûten te ferbinen, wurdt in ferbining fia poarte 1194/udp brûkt, en in A-record gw.abc.ru is makke yn 'e DNS foar ús tsjinner.

It is strikt net oan te rieden om SELinux út te skeakeljen! OpenVPN wurket sûnder befeiligingsbelied út te skeakeljen.

Ynhâld

  1. Ynstallaasje fan OS en applikaasje software
  2. It opsetten fan kryptografy
  3. OpenVPN ynstelle
  4. AD Autentikaasje
  5. Opstarten en diagnostyk
  6. Sertifikaat útjefte en ynlûken
  7. Netwurk konfiguraasje
  8. Wat is hjirnei

Ynstallaasje fan OS en applikaasje software

Wy brûke de CentOS 7.8.2003-distribúsje. Wy moatte it OS yn in minimale konfiguraasje ynstallearje. It is handich om dit te brûken kick start, it klonearjen fan in earder ynstallearre OS-ôfbylding en oare middels.

Nei ynstallaasje, it tawizen fan in adres oan 'e netwurkynterface (neffens de betingsten fan taak 172.16.19.123), aktualisearje wy it OS:

$ sudo yum update -y && reboot

Wy moatte ek soargje dat tiidsyngronisaasje wurdt útfierd op ús masine.
Om applikaasjesoftware te ynstallearjen, hawwe jo de pakketten openvpn, openvpn-auth-ldap, easy-rsa en vim nedich as de haadbewurker (jo sille it EPEL-repository nedich hawwe).

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

It is handich om in gastagint te ynstallearjen foar in firtuele masine:

$ sudo yum install open-vm-tools

foar VMware ESXi hosts, of foar oVirt

$ sudo yum install ovirt-guest-agent

It opsetten fan kryptografy

Gean nei de easy-rsa map:

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

Meitsje in fariabele triem:

$ sudo vim vars

de folgjende ynhâld:

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

De parameters foar de betingstorganisaasje ABC LLC wurde hjir beskreaun; jo kinne se korrigearje nei de echte of ferlitte se út it foarbyld. It wichtichste ding yn 'e parameters is de lêste rigel, dy't de jildigensperioade fan it sertifikaat yn dagen bepaalt. It foarbyld brûkt de wearde 10 jier (365*10+2 skrikkeljierren). Dizze wearde sil oanpast wurde moatte foardat brûkerssertifikaten wurde útjûn.

Folgjende konfigurearje wy in autonome sertifikaasjeautoriteit.

Opset omfettet it eksportearjen fan fariabelen, inisjalisearjen fan de CA, it útjaan fan de CA-rootkaai en sertifikaat, Diffie-Hellman-kaai, TLS-kaai, en serverkaai en sertifikaat. De CA-kaai moat soarchfâldich beskerme wurde en geheim hâlden wurde! Alle query parameters kinne wurde oerlitten as standert.

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

Dit foltôget it haaddiel fan it ynstellen fan it kryptografyske meganisme.

OpenVPN ynstelle

Gean nei de OpenVPN-map, meitsje tsjinstmappen en foegje in keppeling ta nei 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/

Meitsje it haad OpenVPN-konfiguraasjetriem:

$ sudo vim server.conf

folgjende ynhâld

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

Guon notysjes oer de parameters:

  • as in oare namme oantsjutte is by it útjaan fan it sertifikaat, oanjaan dat;
  • spesifisearje de pool fan adressen foar jo taken *;
  • der kinne ien of mear rûtes en DNS-tsjinners wêze;
  • De lêste 2 rigels binne nedich om autentikaasje yn AD** út te fieren.

*It berik fan adressen selekteare yn it foarbyld lit maksimaal 127 kliïnten tagelyk ferbine, om't it / 23 netwurk wurdt selektearre, en OpenVPN makket in subnet foar eltse klant mei help fan de / 30 masker.
As it foaral nedich is, kinne de poarte en it protokol wizige wurde, it moat lykwols yn 't sin hâlden wurde dat it feroarjen fan it poartepoartenûmer it konfigurearjen fan SELinux meibringt, en it brûken fan it tcp-protokol sil de overhead ferheegje, om't TCP-pakketleveringskontrôle wurdt al útfierd op it nivo fan pakketten ynkapsele yn 'e tunnel.

** As autentikaasje yn AD net nedich is, kommintaar se dan út, sla de folgjende seksje oer, en yn it sjabloan fuortsmite de auth-user-pass line.

AD Autentikaasje

Om de twadde faktor te stypjen, sille wy akkountferifikaasje brûke yn AD.

Wy moatte in akkount yn it domein mei de rjochten fan in gewoane brûker en in groep, lidmaatskip wêryn sil bepale de mooglikheid om te ferbinen.

Meitsje in konfiguraasjetriem:

/etc/openvpn/ldap.conf

folgjende ynhâld

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

Key parameters:

  • URL "ldap://ldap.abc.ru" - domein controller adres;
  • BindDN "CN = bindUsr, CN = Brûkers, DC = abc, DC = ru" - kanonike namme foar bining oan LDAP (UZ - bindUsr yn 'e kontener abc.ru/Users);
  • Wachtwurd b1ndP@SS - brûkerswachtwurd foar bining;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - it paad wêrfan te begjinnen mei sykjen nei de brûker;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - kontener fan de tastimming groep (groep myVPNUsr yn de container abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" is de namme fan de tastimmende groep.

Opstarten en diagnostyk

No kinne wy ​​besykje ús tsjinner yn te skeakeljen en te starten:

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

Opstartkontrôle:

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

Sertifikaat útjefte en ynlûken

Omdat Neist de sertifikaten sels hawwe jo kaaien en oare ynstellingen nedich; it is heul handich om dit alles yn ien profylbestân te ferpakken. Dit bestân wurdt dan oerdroegen oan de brûker en it profyl wurdt ymportearre op de OpenVPN-kliïnt. Om dit te dwaan, meitsje wy in ynstellingssjabloan en in skript dat it profyl genereart.

Jo moatte de ynhâld fan it root-sertifikaat (ca.crt) en TLS-kaai (ta.key)-bestannen tafoegje oan it profyl.

Foardat jo brûkerssertifikaten útjaan ferjit net de fereaske jildigensperioade foar sertifikaten yn te stellen yn de parameter triem. Jo moatte it net te lang meitsje; ik advisearje josels te beheinen ta maksimaal 180 dagen.

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>

Notes:

  • linen DOCH DYN... feroarje nei ynhâld eigen sertifikaten;
  • spesifisearje yn 'e rjochtline op ôfstân de namme / adres fan jo gateway;
  • de rjochtline foar auth-user-pass wurdt brûkt foar ekstra eksterne autentikaasje.

Yn 'e thúsmap (of in oar handich plak) meitsje wy in skript foar it oanfreegjen fan in sertifikaat en it meitsjen fan in profyl:

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 ~

It bestân útfierber meitsje:

chmod a+x ~/make.profile.sh

En wy kinne ús earste sertifikaat útjaan.

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

Tebekwurd

Yn gefal fan kompromis fan in sertifikaat (ferlies, stellerij), is it nedich om dit sertifikaat yn te lûken:

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

Besjoch útjûn en ynlutsen sertifikaten

Om útjûne en ynlutsen sertifikaten te besjen, besjoch gewoan it yndeksbestân:

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

Explanations:

  • de earste rigel is it tsjinner sertifikaat;
  • earste karakter
    • V (jildich) - jildich;
    • R (ynlutsen) - weromroppen.

Netwurk konfiguraasje

De lêste stappen binne om it oerdrachtnetwurk te konfigurearjen - routing en firewalls.

Ferbinings tastean yn 'e lokale firewall:

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

Skeakelje dan IP-ferkearrouting yn:

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

Yn in bedriuwsomjouwing is d'r wierskynlik subnetting en wy moatte de router(s) fertelle hoe't pakketten kinne ferstjoere foar ús VPN-kliïnten. Op 'e kommandorigel útfiere wy it kommando op' e manier (ôfhinklik fan 'e brûkte apparatuer):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

en bewarje de konfiguraasje.

Dêrneist, op de grins router ynterface dêr't it eksterne adres gw.abc.ru wurdt betsjinne, is it nedich om te tastean de passaazje fan udp/1194 pakketten.

As de organisaasje strikte feiligensregels hat, moat in firewall ek konfigureare wurde op ús VPN-tsjinner. Yn myn miening wurdt de grutste fleksibiliteit levere troch it opsetten fan iptables FORWARD keatlingen, hoewol it opsetten is minder handich. In bytsje mear oer it opsetten fan se. Om dit te dwaan is it meast handich om "direkte regels" te brûken - direkte regels, opslein yn in bestân /etc/firewalld/direct.xml. De hjoeddeistige konfiguraasje fan 'e regels kin as folget fûn wurde:

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

Foardat jo in bestân wizigje, meitsje in reservekopy fan it:

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

De likernôch ynhâld fan it bestân is:

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

Taljochtingen

Dit binne yn wêzen reguliere iptables-regels, oars ferpakt nei de komst fan firewalld.

De bestimming ynterface mei standert ynstellings is tun0, en de eksterne ynterface foar de tunnel kin wêze oars, Bygelyks, ens192, ôfhinklik fan it platfoarm brûkt.

De lêste rigel is foar it loggen fan sakke pakketten. Foar it loggen om te wurkjen, moatte jo it debugnivo feroarje yn 'e firewalld-konfiguraasje:

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

It tapassen fan ynstellings is it gewoane firewalld kommando om de ynstellings opnij te lêzen:

$ sudo firewall-cmd --reload

Jo kinne sakke pakketten sa sjen:

grep forward_fw /var/log/messages

Wat is hjirnei

Dit foltôget de opset!

Alles wat oerbliuwt is de kliïntsoftware oan 'e kliïntkant te ynstallearjen, it profyl ymportearje en ferbine. Foar Windows bestjoeringssystemen, de distribúsje kit leit op developer site.

Uteinlik ferbine wy ​​ús nije server oan 'e monitoaring- en argyfsystemen, en ferjit net om regelmjittich updates te ynstallearjen.

Stabiele ferbining!

Boarne: www.habr.com

Add a comment