Organisering af fjernarbejde for en SMB-organisation på OpenVPN

Formulering af problemet

Artiklen beskriver tilrettelæggelsen af ​​fjernadgang for medarbejdere på open source-produkter og kan både bruges til at bygge et helt autonomt system, og vil være nyttig til udvidelse, når der er mangel på licenser i det eksisterende kommercielle system eller dets ydeevne er utilstrækkelig.

Målet med artiklen er at implementere et komplet system til at give fjernadgang til en organisation, hvilket er lidt mere end at "installere OpenVPN på 10 minutter."

Som et resultat vil vi få et system, hvor certifikater og (valgfrit) virksomhedens Active Directory vil blive brugt til at autentificere brugere. At. vi får et system med to verifikationsfaktorer - hvad jeg har (certifikat) og hvad jeg ved (adgangskode).

Et tegn på, at en bruger har tilladelse til at oprette forbindelse, er deres medlemskab i myVPNUsr-gruppen. Certifikatmyndigheden vil blive brugt offline.

Omkostningerne ved at implementere løsningen er kun små hardwareressourcer og 1 times arbejde for systemadministratoren.

Vi vil bruge en virtuel maskine med OpenVPN og Easy-RSA version 3 på CetntOS 7, som er tildelt 100 vCPU'er og 4 GiB RAM pr. 4 forbindelser.

I eksemplet er vores organisations netværk 172.16.0.0/16, hvor VPN-serveren med adressen 172.16.19.123 er placeret i segmentet 172.16.19.0/24, DNS-servere 172.16.16.16 og 172.16.17.17. .172.16.20.0/23 er allokeret til VPN-klienter.

For at forbinde udefra bruges en forbindelse via port 1194/udp, og der er oprettet en A-record gw.abc.ru i DNS til vores server.

Det anbefales strengt ikke at deaktivere SELinux! OpenVPN fungerer uden at deaktivere sikkerhedspolitikker.

Indhold

  1. Installation af OS og applikationssoftware
  2. Opsætning af kryptografi
  3. Opsætning af OpenVPN
  4. AD-godkendelse
  5. Opstart og diagnostik
  6. Certifikatudstedelse og tilbagekaldelse
  7. Netværkskonfiguration
  8. Hvad er næste

Installation af OS og applikationssoftware

Vi bruger CentOS 7.8.2003 distributionen. Vi skal installere OS i en minimal konfiguration. Det er praktisk at gøre dette ved hjælp af kickstart, kloning af et tidligere installeret OS-image og andre midler.

Efter installation, tildeling af en adresse til netværksgrænsefladen (i henhold til vilkårene for opgave 172.16.19.123), opdaterer vi OS:

$ sudo yum update -y && reboot

Vi skal også sørge for, at tidssynkronisering udføres på vores maskine.
For at installere applikationssoftware skal du bruge pakkerne openvpn, openvpn-auth-ldap, easy-rsa og vim som hovededitor (du skal bruge EPEL-lageret).

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

Det er nyttigt at installere en gæsteagent til en virtuel maskine:

$ sudo yum install open-vm-tools

til VMware ESXi-værter eller til oVirt

$ sudo yum install ovirt-guest-agent

Opsætning af kryptografi

Gå til easy-rsa biblioteket:

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

Opret en variabel fil:

$ sudo vim vars

følgende indhold:

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

Parametrene for den betingede organisation ABC LLC er beskrevet her; du kan rette dem til de rigtige eller forlade dem fra eksemplet. Det vigtigste i parametrene er den sidste linje, som bestemmer certifikatets gyldighedsperiode i dage. Eksemplet bruger værdien 10 år (365*10+2 skudår). Denne værdi skal justeres, før brugercertifikater udstedes.

Dernæst konfigurerer vi en selvstændig certificeringsmyndighed.

Opsætningen omfatter eksport af variabler, initialisering af CA, udstedelse af CA-rodnøgle og certifikat, Diffie-Hellman-nøgle, TLS-nøgle og servernøgle og certifikat. CA-nøglen skal omhyggeligt beskyttes og holdes hemmelig! Alle forespørgselsparametre kan efterlades 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

Dette fuldender hoveddelen af ​​opsætningen af ​​den kryptografiske mekanisme.

Opsætning af OpenVPN

Gå til OpenVPN-biblioteket, opret servicemapper og tilføj et link til 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/

Opret den primære OpenVPN-konfigurationsfil:

$ sudo vim server.conf

følgende indhold

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

Nogle bemærkninger om parametrene:

  • hvis et andet navn blev angivet ved udstedelsen af ​​certifikatet, angiv det;
  • specificer puljen af ​​adresser, der passer til dine opgaver*;
  • der kan være en eller flere ruter og DNS-servere;
  • De sidste 2 linjer er nødvendige for at implementere godkendelse i AD**.

*Rækken af ​​adresser valgt i eksemplet vil tillade op til 127 klienter at oprette forbindelse samtidigt, fordi /23-netværket er valgt, og OpenVPN opretter et undernet for hver klient ved hjælp af /30-masken.
Hvis det er særligt nødvendigt, kan porten og protokollen ændres, dog skal man huske på, at ændring af portportnummeret vil medføre konfiguration af SELinux, og brug af tcp-protokollen vil øge overhead, fordi TCP-pakkeleveringskontrol udføres allerede på niveauet for pakker indkapslet i tunnelen.

**Hvis godkendelse i AD ikke er nødvendig, skal du kommentere dem, springe næste afsnit over og i skabelonen fjerne auth-user-pass-linjen.

AD-godkendelse

For at understøtte den anden faktor vil vi bruge kontobekræftelse i AD.

Vi har brug for en konto på domænet med rettighederne for en almindelig bruger og en gruppe, hvor medlemskab vil bestemme muligheden for at oprette forbindelse.

Opret en konfigurationsfil:

/etc/openvpn/ldap.conf

følgende indhold

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

De vigtigste parametre:

  • URL "ldap://ldap.abc.ru" - domænecontrolleradresse;
  • BindDN “CN=bindUsr,CN=Brugere,DC=abc,DC=ru” - kanonisk navn for binding til LDAP (UZ - bindUsr i containeren abc.ru/Users);
  • Adgangskode b1ndP@SS — brugeradgangskode til binding;
  • BaseDN "OU=allUsr,DC=abc,DC=ru" — stien, hvorfra man skal begynde at søge efter brugeren;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – beholder for den tillade gruppe (gruppe myVPNUsr i beholderen abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" er navnet på den tillade gruppe.

Opstart og diagnostik

Nu kan vi prøve at aktivere og starte vores server:

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

Opstartstjek:

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

Certifikatudstedelse og tilbagekaldelse

Fordi Ud over selve certifikaterne har du brug for nøgler og andre indstillinger; det er meget praktisk at pakke alt dette ind i en profilfil. Denne fil overføres derefter til brugeren, og profilen importeres til OpenVPN-klienten. For at gøre dette opretter vi en indstillingsskabelon og et script, der genererer profilen.

Du skal tilføje indholdet af rodcertifikatet (ca.crt) og TLS key (ta.key) filer til profilen.

Før du udsteder brugercertifikater glem ikke at indstille den nødvendige gyldighedsperiode for certifikater i parameterfilen. Du bør ikke gøre det for langt, jeg anbefaler, at du begrænser dig til maksimalt 180 dage.

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>

Bemærkninger:

  • deadlines PUT DIN... skifte til indhold deres certifikater;
  • i fjerndirektivet skal du angive navnet/adressen på din gateway;
  • auth-user-pass-direktivet bruges til yderligere ekstern godkendelse.

I hjemmebiblioteket (eller et andet praktisk sted) opretter vi et script til at anmode om et certifikat og oprette 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 eksekverbar:

chmod a+x ~/make.profile.sh

Og vi kan udstede vores første certifikat.

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

tilbagekaldelse

I tilfælde af kompromittering af et certifikat (tab, tyveri), er det nødvendigt at tilbagekalde dette certifikat:

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

Se udstedte og tilbagekaldte certifikater

For at se udstedte og tilbagekaldte certifikater skal du blot se indeksfilen:

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

Forklaring:

  • den første linje er servercertifikatet;
  • første tegn
    • V (gyldig) - gyldig;
    • R (Tilbagekaldt) - tilbagekaldt.

Netværkskonfiguration

De sidste trin er at konfigurere transmissionsnetværket - routing og firewalls.

Tilladelse af forbindelser i den lokale firewall:

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

Aktivér derefter IP-trafikrouting:

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

I et virksomhedsmiljø er der sandsynligvis undernet, og vi er nødt til at fortælle routeren/routerne, hvordan de sender pakker, der er bestemt til vores VPN-klienter. På kommandolinjen udfører vi kommandoen på den måde (afhængigt af det anvendte udstyr):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

og gem konfigurationen.

Derudover er det på grænseroutergrænsefladen, hvor den eksterne adresse gw.abc.ru serveres, nødvendigt at tillade passage af udp/1194-pakker.

I tilfælde af at organisationen har strenge sikkerhedsregler, skal der også konfigureres en firewall på vores VPN-server. Efter min mening opnås den største fleksibilitet ved at opsætte iptables FORWARD-kæder, selvom det er mindre bekvemt at sætte dem op. Lidt mere om at sætte dem op. For at gøre dette er det mest bekvemt at bruge "direkte regler" - direkte regler, gemt i en fil /etc/firewalld/direct.xml. Den aktuelle konfiguration af reglerne kan findes som følger:

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

Før du ændrer en fil, skal du lave en sikkerhedskopi af den:

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

Det omtrentlige indhold af filen er:

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

Forklaringer

Disse er grundlæggende almindelige iptables-regler, ellers pakket efter fremkomsten af ​​firewalld.

Destinationsgrænsefladen med standardindstillinger er tun0, og den eksterne grænseflade for tunnelen kan være anderledes, for eksempel ens192, afhængigt af den anvendte platform.

Den sidste linje er til logning af tabte pakker. For at logge skal fungere, skal du ændre fejlfindingsniveauet i firewalld-konfigurationen:

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

Anvendelse af indstillinger er den sædvanlige firewalld-kommando til at genlæse indstillingerne:

$ sudo firewall-cmd --reload

Du kan se tabte pakker som dette:

grep forward_fw /var/log/messages

Hvad er næste

Dette fuldender opsætningen!

Tilbage er blot at installere klientsoftwaren på klientsiden, importere profilen og oprette forbindelse. For Windows-operativsystemer er distributionssættet placeret på udvikler site.

Endelig forbinder vi vores nye server til overvågnings- og arkiveringssystemerne, og glem ikke regelmæssigt at installere opdateringer.

Stabil forbindelse!

Kilde: www.habr.com

Tilføj en kommentar