Organisering av fjernarbeid til en SMB-organisasjon på OpenVPN

Formulering av problemet

Artikkelen beskriver organiseringen av fjerntilgang for ansatte på åpen kildekode-produkter og kan brukes både til å bygge et helt autonomt system, og vil være nyttig for utvidelse når det er mangel på lisenser i det eksisterende kommersielle systemet eller dets ytelse er utilstrekkelig.

Målet med artikkelen er å implementere et komplett system for å gi ekstern tilgang til en organisasjon, som er lite mer enn å "installere OpenVPN på 10 minutter."

Som et resultat vil vi få et system der sertifikater og (valgfritt) bedriftens Active Directory vil bli brukt til å autentisere brukere. At. vi vil få et system med to verifikasjonsfaktorer - hva jeg har (sertifikat) og hva jeg vet (passord).

Et tegn på at en bruker har lov til å koble til er medlemskapet deres i myVPNUsr-gruppen. Sertifiseringsinstansen vil bli brukt offline.

Kostnaden for å implementere løsningen er kun små maskinvareressurser og 1 times arbeid for systemadministratoren.

Vi vil bruke en virtuell maskin med OpenVPN og Easy-RSA versjon 3 på CetntOS 7, som er tildelt 100 vCPUer og 4 GiB RAM per 4 tilkoblinger.

I eksemplet er organisasjonens nettverk 172.16.0.0/16, der VPN-serveren med adressen 172.16.19.123 er plassert i segmentet 172.16.19.0/24, DNS-serverne 172.16.16.16 og 172.16.17.17. .172.16.20.0/23 er tildelt for VPN-klienter.

For å koble til utenfra brukes en tilkobling via port 1194/udp, og det er opprettet en A-record gw.abc.ru i DNS for vår server.

Det er strengt tatt ikke anbefalt å deaktivere SELinux! OpenVPN fungerer uten å deaktivere sikkerhetspolicyer.

Innhold

  1. Installasjon av OS og applikasjonsprogramvare
  2. Sette opp kryptografi
  3. Sette opp OpenVPN
  4. AD-autentisering
  5. Oppstart og diagnostikk
  6. Sertifikatutstedelse og tilbakekall
  7. Nettverkskonfigurasjon
  8. Hva er neste

Installasjon av OS og applikasjonsprogramvare

Vi bruker CentOS 7.8.2003-distribusjonen. Vi må installere OS i en minimal konfigurasjon. Det er praktisk å gjøre dette ved hjelp av kickstart, kloning av et tidligere installert OS-bilde og andre måter.

Etter installasjon, tildeling av en adresse til nettverksgrensesnittet (i henhold til vilkårene for oppgave 172.16.19.123), oppdaterer vi OS:

$ sudo yum update -y && reboot

Vi må også sørge for at tidssynkronisering utføres på maskinen vår.
For å installere applikasjonsprogramvare trenger du pakkene openvpn, openvpn-auth-ldap, easy-rsa og vim som hovedredigering (du trenger EPEL-depotet).

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

Det er nyttig å installere en gjesteagent for en virtuell maskin:

$ sudo yum install open-vm-tools

for VMware ESXi-verter, eller for oVirt

$ sudo yum install ovirt-guest-agent

Sette opp kryptografi

Gå til easy-rsa-katalogen:

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

Lag en variabel fil:

$ sudo vim vars

følgende innhold:

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 organisasjonen ABC LLC er beskrevet her; du kan korrigere dem til de virkelige eller la dem være fra eksemplet. Det viktigste i parametrene er den siste linjen, som bestemmer sertifikatets gyldighetsperiode i dager. Eksemplet bruker verdien 10 år (365*10+2 skuddår). Denne verdien må justeres før brukersertifikater utstedes.

Deretter konfigurerer vi en autonom sertifiseringsinstans.

Oppsettet inkluderer eksport av variabler, initialisering av CA, utstedelse av CA-rotnøkkelen og sertifikatet, Diffie-Hellman-nøkkelen, TLS-nøkkelen og servernøkkelen og sertifikatet. CA-nøkkelen må beskyttes nøye og holdes hemmelig! Alle spørringsparametere kan stå 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 fullfører hoveddelen av å sette opp den kryptografiske mekanismen.

Sette opp OpenVPN

Gå til OpenVPN-katalogen, lag tjenestekataloger og legg til en lenke 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/

Opprett hovedkonfigurasjonsfilen for OpenVPN:

$ sudo vim server.conf

følgende innhold

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

Noen merknader om parametrene:

  • hvis et annet navn ble spesifisert ved utstedelse av sertifikatet, angi det;
  • spesifiser utvalget av adresser som passer dine oppgaver*;
  • det kan være én eller flere ruter og DNS-servere;
  • De siste 2 linjene er nødvendige for å implementere autentisering i AD**.

*Utvalget av adresser valgt i eksempelet vil tillate opptil 127 klienter å koble til samtidig, fordi /23-nettverket er valgt, og OpenVPN oppretter et subnett for hver klient ved å bruke /30-masken.
Hvis det er spesielt nødvendig, kan porten og protokollen endres, men det bør huskes at endring av portportnummeret vil innebære konfigurering av SELinux, og bruk av tcp-protokollen vil øke overhead, fordi TCP-pakkeleveringskontroll utføres allerede på nivået av pakker som er innkapslet i tunnelen.

**Hvis autentisering i AD ikke er nødvendig, kommenter dem, hopp over neste avsnitt og i malen fjern linjen for autorisasjonsbrukerpass.

AD-autentisering

For å støtte den andre faktoren, vil vi bruke kontoverifisering i AD.

Vi trenger en konto på domenet med rettighetene til en vanlig bruker og en gruppe, medlemskap i som vil avgjøre muligheten til å koble til.

Opprett en konfigurasjonsfil:

/etc/openvpn/ldap.conf

følgende innhold

<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" - domenekontrolleradresse;
  • BindDN “CN=bindUsr,CN=Brukere,DC=abc,DC=ru” - kanonisk navn for binding til LDAP (UZ - bindUsr i abc.ru/Users-beholderen);
  • Passord b1ndP@SS — brukerpassord for binding;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — banen for å begynne å søke etter brukeren;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – container for tillatelsesgruppen (grupper myVPNUsr i containeren abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" er navnet på den tillate gruppen.

Oppstart og diagnostikk

Nå kan vi prøve å aktivere og starte serveren vår:

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

Oppstartssjekk:

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

Sertifikatutstedelse og tilbakekall

Fordi I tillegg til selve sertifikatene trenger du nøkler og andre innstillinger; det er veldig praktisk å pakke alt dette inn i én profilfil. Denne filen blir deretter overført til brukeren og profilen importeres til OpenVPN-klienten. For å gjøre dette vil vi lage en innstillingsmal og et skript som genererer profilen.

Du må legge til innholdet i rotsertifikatet (ca.crt) og TLS-nøkkel (ta.key)-filene til profilen.

Før du utsteder brukersertifikater ikke glem å angi nødvendig gyldighetsperiode for sertifikater i parameterfilen. Du bør ikke gjøre den for lang, jeg anbefaler å begrense deg til maksimalt 180 dager.

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>

Merknader:

  • linjer PUTT DIN... endre til innhold egen sertifikater;
  • i fjerndirektivet, spesifiser navnet/adressen til gatewayen din;
  • auth-user-pass-direktivet brukes for ytterligere ekstern autentisering.

I hjemmekatalogen (eller et annet praktisk sted) lager vi et skript for å be om et sertifikat og opprette 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 ~

Gjøre filen kjørbar:

chmod a+x ~/make.profile.sh

Og vi kan utstede vårt første sertifikat.

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

tilbakekalling

I tilfelle kompromittering av et sertifikat (tap, tyveri), er det nødvendig å tilbakekalle dette sertifikatet:

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

Se utstedte og tilbakekalte sertifikater

For å se utstedte og tilbakekalte sertifikater, se ganske enkelt indeksfilen:

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

Forklaring:

  • den første linjen er serversertifikatet;
  • første tegn
    • V (gyldig) - gyldig;
    • R (Tilbakekallet) - tilbakekalt.

Nettverkskonfigurasjon

De siste trinnene er å konfigurere overføringsnettverket - ruting og brannmurer.

Tillater tilkoblinger i den lokale brannmuren:

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

Deretter aktiverer du IP-trafikkruting:

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

I et bedriftsmiljø er det sannsynligvis subnetting, og vi må fortelle ruteren(e) hvordan de skal sende pakker destinert for våre VPN-klienter. På kommandolinjen utfører vi kommandoen på denne måten (avhengig av utstyret som brukes):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

og lagre konfigurasjonen.

I tillegg, på grenserutergrensesnittet der den eksterne adressen gw.abc.ru serveres, er det nødvendig å tillate passering av udp/1194-pakker.

I tilfelle organisasjonen har strenge sikkerhetsregler, må en brannmur også konfigureres på vår VPN-server. Etter min mening er den største fleksibiliteten gitt ved å sette opp iptables FORWARD-kjeder, selv om det er mindre praktisk å sette dem opp. Litt mer om å sette dem opp. For å gjøre dette er det mest praktisk å bruke "direkte regler" - direkte regler, lagret i en fil /etc/firewalld/direct.xml. Den nåværende konfigurasjonen av reglene kan bli funnet som følger:

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

Før du endrer en fil, ta en sikkerhetskopi av den:

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

Det omtrentlige innholdet i 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

Dette er i hovedsak vanlige iptables-regler, ellers pakket etter bruk av brannmur.

Destinasjonsgrensesnittet med standardinnstillinger er tun0, og det eksterne grensesnittet for tunnelen kan være forskjellig, for eksempel ens192, avhengig av plattformen som brukes.

Den siste linjen er for logging av droppede pakker. For at logging skal fungere, må du endre feilsøkingsnivået i brannmurkonfigurasjonen:

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

Å bruke innstillinger er den vanlige brannmurkommandoen for å lese innstillingene på nytt:

$ sudo firewall-cmd --reload

Du kan se droppede pakker slik:

grep forward_fw /var/log/messages

Hva er neste

Dette fullfører oppsettet!

Alt som gjenstår er å installere klientprogramvaren på klientsiden, importere profilen og koble til. For Windows-operativsystemer er distribusjonssettet plassert på utviklernettsted.

Til slutt kobler vi vår nye server til overvåkings- og arkiveringssystemene, og glem ikke å jevnlig installere oppdateringer.

Stabil forbindelse!

Kilde: www.habr.com

Legg til en kommentar