Organisatioun vun der Fernaarbecht vun enger SMB Organisatioun op OpenVPN

Problemerklärung

Den Artikel beschreift d'Organisatioun vum Fernzougang fir Mataarbechter op Open Source Produkter a ka benotzt ginn fir e komplett autonome System ze bauen, a wäert nëtzlech sinn fir Expansioun wann et e Mangel u Lizenzen am existente kommerziellen System ass oder seng Leeschtung net genuch ass.

D'Zil vum Artikel ass e komplette System ëmzesetzen fir Remote Zougang zu enger Organisatioun ze liwweren, wat wéineg méi ass wéi "OpenVPN an 10 Minutten installéieren."

Als Resultat kréie mir e System an deem Zertifikater an (optional) de Corporate Active Directory benotzt gi fir d'Benotzer ze authentifizéieren. Dat. mir kréien e System mat zwee Verifizéierungsfaktoren - wat ech hunn (Zertifikat) a wat ech weess (Passwuert).

En Zeechen datt e Benotzer erlaabt ass ze verbannen ass hir Memberschaft an der myVPNUsr Grupp. D'Zertifika Autoritéit gëtt offline benotzt.

D'Käschte fir d'Léisung ëmzesetzen sinn nëmme kleng Hardwareressourcen an 1 Stonn Aarbecht vum Systemadministrator.

Mir benotzen eng virtuell Maschinn mat OpenVPN an Easy-RSA Versioun 3 op CetntOS 7, déi 100 vCPUs a 4 GiB RAM pro 4 Verbindungen zougewisen gëtt.

Am Beispill ass d'Netz vun eiser Organisatioun 172.16.0.0/16, an deem de VPN-Server mat der Adress 172.16.19.123 am Segment 172.16.19.0/24, DNS-Server 172.16.16.16 an 172.16.17.17 an 172.16.20.0. .23/XNUMX gëtt fir VPN Clienten zougewisen.

Fir vu baussen ze verbannen, gëtt eng Verbindung iwwer den Hafen 1194/udp benotzt, an en A-Rekord gw.abc.ru gouf am DNS fir eise Server erstallt.

Et ass streng net recommandéiert SELinux auszeschalten! OpenVPN funktionnéiert ouni Sécherheetspolitik auszeschalten.

Inhalt

  1. Installatioun vun OS an Applikatioun Software
  2. Opstellung vun Kryptografie
  3. OpenVPN konfiguréieren
  4. AD Authentifikatioun
  5. Startup an Diagnostik
  6. Zertifikat erausginn an Réckzuch
  7. Netzkonfiguratioun
  8. Wat ass Next

Installatioun vun OS an Applikatioun Software

Mir benotzen d'CentOS 7.8.2003 Verdeelung. Mir mussen d'OS an enger minimaler Konfiguratioun installéieren. Et ass bequem dëst ze benotzen kickstart, Klonen e virdrun installéiert OS Bild an aner Mëttelen.

No der Installatioun, d'Adress un d'Netzwierk Interface zougewisen (no de Bedéngungen vun der Aufgab 172.16.19.123), aktualiséieren mir d'OS:

$ sudo yum update -y && reboot

Mir mussen och sécherstellen datt d'Zäitsynchroniséierung op eiser Maschinn gemaach gëtt.
Fir Applikatiounssoftware z'installéieren, braucht Dir den openvpn, openvpn-auth-ldap, easy-rsa a vim Packagen als Haapteditor (Dir braucht den EPEL Repository).

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

Et ass nëtzlech fir e Gaaschtagent fir eng virtuell Maschinn z'installéieren:

$ sudo yum install open-vm-tools

fir VMware ESXi Hosten, oder fir oVirt

$ sudo yum install ovirt-guest-agent

Opstellung vun Kryptografie

Gitt an den easy-rsa Verzeichnis:

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

Erstellt eng Variabel Datei:

$ sudo vim vars

folgenden Inhalt:

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

D'Parameteren fir d'bedingte Organisatioun ABC LLC ginn hei beschriwwen; Dir kënnt se op déi richteg korrigéieren oder se aus dem Beispill verloossen. Déi wichtegst Saach an de Parameteren ass déi lescht Zeil, déi d'Gëltegkeetsperiod vum Zertifika an Deeg bestëmmt. D'Beispill benotzt de Wäert 10 Joer (365*10+2 Schaltjoer). Dëse Wäert muss ugepasst ginn ier Benotzerzertifikater ausgestallt ginn.

Als nächst konfiguréiere mir eng autonom Zertifizéierungsautoritéit.

D'Setup enthält Variabelen exportéieren, d'CA initialiséieren, de CA Root Schlëssel an Zertifikat ausginn, Diffie-Hellman Schlëssel, TLS Schlëssel, a Serverschlëssel an Zertifikat. Den CA Schlëssel muss suergfälteg geschützt a geheim gehale ginn! All Ufroparameter kënnen als Standard gelooss ginn.

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

Dëst fäerdeg den Haaptdeel vun der Opstellung vum Kryptografesche Mechanismus.

OpenVPN konfiguréieren

Gitt an den OpenVPN Verzeichnis, erstellt Serviceverzeichnisser a füügt e Link op 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/

Erstellt d'Haapt OpenVPN Konfiguratiounsdatei:

$ sudo vim server.conf

folgenden Inhalt

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

E puer Notizen iwwer d'Parameteren:

  • wann en aneren Numm bei der Ausstellung vum Zertifika uginn ass, gitt et un;
  • spezifizéiert de Pool vun Adressen fir Är Aufgaben ze passen *;
  • et kann een oder méi routes an DNS Server ginn;
  • Déi lescht 2 Zeilen si gebraucht fir d'Authentifikatioun an der AD** ëmzesetzen.

*D'Palette vun Adressen, déi am Beispill ausgewielt ginn, erlaabt bis zu 127 Clienten gläichzäiteg ze verbannen, well der / 23 Reseau ass ausgewielt, an OpenVPN schaaft engem Subnet fir all Client mat der / 30 Mask.
Wann besonnesch néideg, kënnen den Hafen an de Protokoll geännert ginn, awer et sollt am Kapp gedriwwe ginn datt d'Ännerung vum Portportnummer d'Konfiguratioun vun SELinux mat sech bréngt, an den tcp Protokoll ze benotzen wäert d'Overhead eropgoen, well TCP Paket Liwwerung Kontroll gëtt schonn um Niveau vun de Pakete am Tunnel akapselt gemaach.

** Wann d'Authentifikatioun an der AD net néideg ass, kommentéiert se eraus, sprangen déi nächst Sektioun, an an der Schabloun ewechzehuelen der Auth-Benotzer-Pass Linn.

AD Authentifikatioun

Fir den zweete Faktor z'ënnerstëtzen, benotze mir d'Kontverifikatioun an der AD.

Mir brauchen e Kont am Domain mat de Rechter vun engem gewéinleche Benotzer an engem Grupp, Memberschaft an deem wäert d'Fähegkeet ze konnektéieren bestëmmen.

Erstellt eng Konfiguratiounsdatei:

/etc/openvpn/ldap.conf

folgenden Inhalt

<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" - Domain Controller Adress;
  • BindDN "CN = bindUsr, CN = Benotzer, DC = abc, DC = ru" - kanonesche Numm fir Bindung un LDAP (UZ - bindUsr am abc.ru/Users Container);
  • Passwuert b1ndP@SS - Benotzerpasswuert fir Bindung;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - de Wee aus deem fir de Benotzer ze sichen;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - Container vun der erlaabt Grupp (Grupp myVPNUsr am Container abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" ass den Numm vun der erlaabt Grupp.

Startup an Diagnostik

Elo kënne mir probéieren eise Server z'aktivéieren an ze starten:

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

Startup Check:

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

Zertifikat erausginn an Réckzuch

Well Zousätzlech zu den Zertifikater selwer braucht Dir Schlësselen an aner Astellungen; et ass ganz bequem dëst alles an enger Profildatei ze packen. Dës Datei gëtt dann un de Benotzer transferéiert an de Profil gëtt op den OpenVPN Client importéiert. Fir dëst ze maachen, erstellen mir eng Astellungsschabloun an e Skript deen de Profil generéiert.

Dir musst den Inhalt vum Rootzertifika (ca.crt) an TLS Schlëssel (ta.key) Dateien an de Profil addéieren.

Ier Dir Benotzer Zertifikater ausginn vergiesst net déi néideg Validitéit Period fir Certificaten ze setzen an der Parameterdatei. Dir sollt et net ze laang maachen; Ech recommandéieren Iech op maximal 180 Deeg ze limitéieren.

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>

Notizen:

  • Linnen SETZT ÄR... änneren op Inhalt hir Certificaten;
  • an der Remote Direktiv, gitt den Numm / Adress vun Ärem Paart;
  • d'Auth-User-Pass Direktiv gëtt fir zousätzlech extern Authentifikatioun benotzt.

Am Heemverzeichnis (oder aner praktesch Plaz) erstellen mir e Skript fir en Zertifika ze froen an e Profil ze kreéieren:

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 ~

D'Datei ausféierbar maachen:

chmod a+x ~/make.profile.sh

A mir kënnen eisen éischten Zertifikat ausginn.

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

Feedback

Am Fall vun Kompromëss vun engem Certificat (Verloscht, Déifstall), ass et néideg dësem Zertifikat zréckzéien:

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

View erausginn an zréckgezunn Certificaten

Fir erausginn an zréckgezunn Certificaten ze gesinn, kuckt einfach d'Indexdatei:

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

Erklärungen:

  • déi éischt Zeil ass de Server Zertifikat;
  • éischte Charakter
    • V (gëlteg) - valabel;
    • R (Revokéiert) - erënnert.

Netzkonfiguratioun

Déi lescht Schrëtt sinn d'Transmissiounsnetz ze konfiguréieren - Routing a Firewalls.

Erlaabt Verbindungen an der lokaler Firewall:

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

Als nächst, aktivéiert IP Traffic Routing:

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

An engem Firmenëmfeld gëtt et méiglecherweis Subnetting a mir mussen de Router (en) soen wéi Pakete fir eis VPN Cliente geschéckt ginn. Op der Kommandozeil féiere mir de Kommando op déi Manéier aus (je no der Ausrüstung déi benotzt gëtt):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

a späichert d'Konfiguratioun.

Zousätzlech, op der Grenz Router Interface wou d'extern Adress gw.abc.ru zerwéiert ass, ass et néideg de Passage vun udp/1194 Pakete ze erlaben.

Am Fall wou d'Organisatioun strikt Sécherheetsregelen huet, muss eng Firewall och op eisem VPN Server konfiguréiert sinn. Menger Meenung no gëtt déi gréisste Flexibilitéit ugebueden andeems Dir iptables FORWARD Ketten opstellt, obwuel se opbauen manner bequem ass. E bësse méi iwwer se opzemaachen. Fir dëst ze maachen, ass et am meeschte praktesch "direkt Regelen" ze benotzen - direkt Regelen, an enger Datei gespäichert /etc/firewalld/direct.xml. Déi aktuell Konfiguratioun vun de Regele kann wéi follegt fonnt ginn:

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

Ier Dir eng Datei ännert, maacht eng Backupkopie dovun:

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

Déi geschätzte Inhalter vun der Datei sinn:

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

Erklärungen

Dëst si wesentlech reegelméisseg iptables Reegelen, soss verpackt nom Advent vu Firewalld.

D'Destinatioun Interface mat Default Astellunge ass tun0, an der externen Interface fir den Tunnel kann anescht ginn, Zum Beispill, ens192, je der Plattform benotzt.

Déi lescht Zeil ass fir erofgeluede Pakete ze protokolléieren. Fir de Logbicher ze schaffen, musst Dir den Debugniveau an der Firewalld Konfiguratioun änneren:

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

Astellunge uwenden ass den übleche Firewalld Kommando fir d'Astellungen nei ze liesen:

$ sudo firewall-cmd --reload

Dir kënnt erofgefall Pakete sou gesinn:

grep forward_fw /var/log/messages

Wat ass Next

Dëst fäerdeg de Setup!

Alles wat bleift ass d'Client Software op der Client Säit z'installéieren, de Profil z'importéieren an ze verbannen. Fir Windows Betribssystemer ass de Verdeelungskit op Entwéckler Websäit.

Schlussendlech verbannen mir eisen neie Server un d'Iwwerwaachungs- an Archivsystemer, a vergiesst net regelméisseg Updates z'installéieren.

Stabil Verbindung!

Source: will.com

Setzt e Commentaire