Organisation av distansarbete för en SMB-organisation på OpenVPN

Problem uttalande

Artikeln beskriver organisationen av fjärråtkomst för anställda på produkter med öppen källkod och kan användas både för att bygga ett helt autonomt system, och kommer att vara användbar för expansion när det råder brist på licenser i det befintliga kommersiella systemet eller dess prestanda är otillräcklig.

Målet med artikeln är att implementera ett komplett system för att tillhandahålla fjärråtkomst till en organisation, vilket är lite mer än att "installera OpenVPN på 10 minuter."

Som ett resultat kommer vi att få ett system där certifikat och (valfritt) företagets Active Directory kommer att användas för att autentisera användare. Den där. vi kommer att få ett system med två verifieringsfaktorer - vad jag har (certifikat) och vad jag vet (lösenord).

Ett tecken på att en användare får ansluta är deras medlemskap i myVPNUsr-gruppen. Certifikatutfärdaren kommer att användas offline.

Kostnaden för att implementera lösningen är endast små hårdvaruresurser och 1 timmes arbete för systemadministratören.

Vi kommer att använda en virtuell maskin med OpenVPN och Easy-RSA version 3 på CetntOS 7, som är tilldelad 100 vCPU:er och 4 GiB RAM per 4 anslutningar.

I exemplet är vår organisations nätverk 172.16.0.0/16, där VPN-servern med adressen 172.16.19.123 finns i segmentet 172.16.19.0/24, DNS-servrarna 172.16.16.16 och 172.16.17.17 och subnet 172.16.20.0. .23/XNUMX är tilldelad för VPN-klienter.

För att ansluta utifrån används en anslutning via port 1194/udp, och ett A-record gw.abc.ru har skapats i DNS för vår server.

Det rekommenderas absolut inte att inaktivera SELinux! OpenVPN fungerar utan att inaktivera säkerhetspolicyer.

Innehåll

  1. Installation av OS och applikationsprogramvara
  2. Ställa in kryptografi
  3. Konfigurera OpenVPN
  4. AD-autentisering
  5. Uppstart och diagnostik
  6. Certifikatutfärdande och återkallelse
  7. Nätverkskonfiguration
  8. Vad är nästa

Installation av OS och applikationsprogramvara

Vi använder CentOS 7.8.2003-distributionen. Vi måste installera operativsystemet i en minimal konfiguration. Det är bekvämt att göra detta med hjälp av kickstart, kloning av en tidigare installerad OS-avbildning och andra sätt.

Efter installation, tilldelning av en adress till nätverksgränssnittet (enligt villkoren för uppgift 172.16.19.123), uppdaterar vi OS:

$ sudo yum update -y && reboot

Vi måste också se till att tidssynkronisering utförs på vår maskin.
För att installera applikationsprogramvara behöver du paketen openvpn, openvpn-auth-ldap, easy-rsa och vim som huvudredigerare (du behöver EPEL-förvaret).

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

Det är användbart att installera en gästagent för en virtuell maskin:

$ sudo yum install open-vm-tools

för VMware ESXi-värdar eller för oVirt

$ sudo yum install ovirt-guest-agent

Ställa in kryptografi

Gå till easy-rsa-katalogen:

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

Skapa en variabel fil:

$ sudo vim vars

följande innehåll:

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

Parametrarna för den villkorliga organisationen ABC LLC beskrivs här; du kan korrigera dem till de riktiga eller lämna dem från exemplet. Det viktigaste i parametrarna är den sista raden, som bestämmer certifikatets giltighetstid i dagar. Exemplet använder värdet 10 år (365*10+2 skottår). Detta värde måste justeras innan användarcertifikat utfärdas.

Därefter konfigurerar vi en autonom certifieringsmyndighet.

Installationen inkluderar export av variabler, initiering av CA, utfärdande av CA:s rotnyckel och certifikat, Diffie-Hellman-nyckel, TLS-nyckel och servernyckel och certifikat. CA-nyckeln måste skyddas noggrant och hållas hemlig! Alla frågeparametrar kan lämnas som standard.

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

Detta avslutar huvuddelen av inställningen av den kryptografiska mekanismen.

Konfigurera OpenVPN

Gå till OpenVPN-katalogen, skapa tjänstekataloger och lägg till en länk till 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/

Skapa den huvudsakliga OpenVPN-konfigurationsfilen:

$ sudo vim server.conf

följande innehåll

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

Några anmärkningar om parametrarna:

  • om ett annat namn angavs när certifikatet utfärdades, ange det;
  • specificera poolen av adresser som passar dina uppgifter*;
  • det kan finnas en eller flera rutter och DNS-servrar;
  • De sista 2 raderna behövs för att implementera autentisering i AD**.

*Omfånget av adresser som valts i exemplet kommer att tillåta upp till 127 klienter att ansluta samtidigt, eftersom /23-nätverket är valt och OpenVPN skapar ett subnät för varje klient med /30-masken.
Om det är särskilt nödvändigt kan porten och protokollet ändras, men man bör komma ihåg att ändring av portportnumret innebär att SELinux konfigureras, och att använda tcp-protokollet kommer att öka overhead, eftersom TCP-paketleveranskontroll utförs redan på nivån för paket som är inkapslade i tunneln.

**Om autentisering i AD inte behövs, kommentera dem, hoppa över nästa avsnitt och i mallen ta bort auth-user-pass-linjen.

AD-autentisering

För att stödja den andra faktorn kommer vi att använda kontoverifiering i AD.

Vi behöver ett konto på domänen med rättigheterna för en vanlig användare och en grupp, där medlemskap avgör möjligheten att ansluta.

Skapa en konfigurationsfil:

/etc/openvpn/ldap.conf

följande innehåll

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

Skötsel:

  • URL "ldap://ldap.abc.ru" - domänkontrollantadress;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - kanoniskt namn för bindning till LDAP (UZ - bindUsr i behållaren abc.ru/Users);
  • Lösenord b1ndP@SS — användarlösenord för bindning;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — sökvägen för att börja söka efter användaren;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – behållare för den tillåtande gruppen (grupp myVPNUsr i behållaren abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" är namnet på den tillåtande gruppen.

Uppstart och diagnostik

Nu kan vi försöka aktivera och starta vår server:

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

Startkontroll:

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

Certifikatutfärdande och återkallelse

Därför att Förutom själva certifikaten behöver du nycklar och andra inställningar, det är väldigt bekvämt att slå in allt detta i en profilfil. Denna fil överförs sedan till användaren och profilen importeras till OpenVPN-klienten. För att göra detta kommer vi att skapa en inställningsmall och ett skript som genererar profilen.

Du måste lägga till innehållet i rotcertifikatet (ca.crt) och TLS-nyckelfilerna (ta.key) i profilen.

Innan du utfärdar användarcertifikat glöm inte att ställa in den nödvändiga giltighetstiden för certifikat i parameterfilen. Du bör inte göra det för långt, jag rekommenderar att du begränsar dig till högst 180 dagar.

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>

Anmärkningar:

  • tidsfrister LÄGG DIN... ändra till innehåll deras certifikat;
  • i fjärrdirektivet, ange namn/adress för din gateway;
  • auth-user-pass-direktivet används för ytterligare extern autentisering.

I hemkatalogen (eller annan lämplig plats) skapar vi ett skript för att begära ett certifikat och skapa en profil:

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 ~

Gör filen körbar:

chmod a+x ~/make.profile.sh

Och vi kan utfärda vårt första certifikat.

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

återkallande

I händelse av att ett certifikat kompromitteras (förlust, stöld), är det nödvändigt att återkalla detta certifikat:

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

Se utfärdade och återkallade certifikat

För att se utfärdade och återkallade certifikat, se helt enkelt indexfilen:

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

Förklaring:

  • den första raden är servercertifikatet;
  • första karaktären
    • V (giltig) - giltig;
    • R (Återkallad) - återkallad.

Nätverkskonfiguration

De sista stegen är att konfigurera överföringsnätverket - routing och brandväggar.

Tillåter anslutningar i den lokala brandväggen:

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

Aktivera sedan IP-trafikdirigering:

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

I en företagsmiljö kommer det sannolikt att finnas subnät och vi måste berätta för routern/routrarna hur de ska skicka paket avsedda för våra VPN-klienter. På kommandoraden utför vi kommandot på sättet (beroende på vilken utrustning som används):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

och spara konfigurationen.

Dessutom, på gränsroutergränssnittet där den externa adressen gw.abc.ru serveras, är det nödvändigt att tillåta passage av udp/1194-paket.

Om organisationen har strikta säkerhetsregler måste en brandvägg också konfigureras på vår VPN-server. Enligt min mening ger den största flexibiliteten genom att sätta upp iptables FORWARD-kedjor, även om det är mindre bekvämt att sätta upp dem. Lite mer om att sätta upp dem. För att göra detta är det mest bekvämt att använda "direkta regler" - direkta regler, lagrade i en fil /etc/firewalld/direct.xml. Den nuvarande konfigurationen av reglerna kan hittas enligt följande:

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

Innan du ändrar en fil, gör en säkerhetskopia av den:

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

Det ungefärliga innehållet i filen är:

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

förklaringar

Dessa är i huvudsak vanliga iptables-regler, annars paketerade efter tillkomsten av brandvägg.

Destinationsgränssnittet med standardinställningar är tun0, och det externa gränssnittet för tunneln kan vara annorlunda, till exempel ens192, beroende på vilken plattform som används.

Den sista raden är för att logga tappade paket. För att loggning ska fungera måste du ändra felsökningsnivån i brandväggskonfigurationen:

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

Att tillämpa inställningar är det vanliga brandväggskommandot för att läsa inställningarna igen:

$ sudo firewall-cmd --reload

Du kan se tappade paket så här:

grep forward_fw /var/log/messages

Vad är nästa

Detta slutför installationen!

Allt som återstår är att installera klientprogramvaran på klientsidan, importera profilen och ansluta. För Windows-operativsystem finns distributionssatsen på utvecklarwebbplats.

Slutligen ansluter vi vår nya server till övervaknings- och arkiveringssystemen, och glöm inte att regelbundet installera uppdateringar.

Stabil uppkoppling!

Källa: will.com

Lägg en kommentar