Organisasi karya jauh hiji organisasi SMB on OpenVPN

Ngarumuskeun masalah

Tulisan éta ngajelaskeun organisasi aksés jauh pikeun karyawan dina produk open source sareng tiasa dianggo pikeun ngawangun sistem otonom lengkep, sareng bakal mangpaat pikeun ékspansi nalika aya kakurangan lisénsi dina sistem komérsial anu aya atanapi kinerjana henteu cekap.

Tujuan tina tulisan nyaéta pikeun nerapkeun sistem anu lengkep pikeun nyayogikeun aksés jauh ka organisasi, anu sakedik langkung ti "masang OpenVPN dina 10 menit."

Hasilna, urang bakal nampi sistem dimana sertipikat sareng (opsional) Active Directory perusahaan bakal dianggo pikeun nga-asténtikasi pangguna. Anu. kami bakal nampi sistem dua faktor verifikasi - naon anu kuring gaduh (sertipikat) sareng anu kuring terang (sandi).

Tanda yén pangguna diidinan nyambung nyaéta kaanggotaanna dina grup myVPNUsr. Otoritas sertipikat bakal dianggo offline.

Biaya ngalaksanakeun solusi ngan ukur sumber hardware leutik sareng 1 jam kerja administrator sistem.

Kami bakal ngagunakeun mesin virtual sareng OpenVPN sareng Easy-RSA versi 3 dina CetntOS 7, anu dialokasikeun 100 vCPU sareng 4 GiB RAM per 4 sambungan.

Dina conto, jaringan organisasi urang nyaéta 172.16.0.0/16, dimana server VPN sareng alamat 172.16.19.123 aya dina ruas 172.16.19.0/24, server DNS 172.16.16.16 sareng 172.16.17.17 sareng subnet 172.16.20.0. .23/XNUMX dialokasikeun pikeun klien VPN.

Pikeun nyambung ti luar, sambungan via port 1194/udp dipaké, sarta A-record gw.abc.ru geus dijieun dina DNS pikeun server urang.

Henteu disarankeun pikeun nganonaktipkeun SELinux! OpenVPN jalan tanpa nganonaktipkeun kawijakan kaamanan.

eusi

  1. Pamasangan OS sareng parangkat lunak aplikasi
  2. Nyetél kriptografi
  3. Nyetél OpenVPN
  4. Auténtikasi AD
  5. Mimitian sareng diagnostik
  6. Isu sertipikat sareng panyabutan
  7. Konfigurasi jaringan
  8. Naon salajengna

Pamasangan OS sareng parangkat lunak aplikasi

Kami nganggo distribusi CentOS 7.8.2003. Urang kedah masang OS dina konfigurasi minimal. Éta merenah pikeun ngalakukeun ieu ngagunakeun tajongan ngamimitian, kloning gambar OS anu dipasang sateuacana sareng cara anu sanés.

Saatos instalasi, assigning alamat ka panganteur jaringan (nurutkeun syarat tugas 172.16.19.123), urang ngamutahirkeun OS:

$ sudo yum update -y && reboot

Urang ogé kedah mastikeun yén sinkronisasi waktos dilaksanakeun dina mesin urang.
Pikeun masang parangkat lunak aplikasi, anjeun peryogi pakét openvpn, openvpn-auth-ldap, easy-rsa sareng vim salaku pangropéa utama (anjeun peryogi gudang EPEL).

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

Mangpaat pikeun masang agén tamu pikeun mesin virtual:

$ sudo yum install open-vm-tools

pikeun VMware ESXi sarwa, atawa pikeun oVirt

$ sudo yum install ovirt-guest-agent

Nyetél kriptografi

Pindah ka diréktori easy-rsa:

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

Jieun file variabel:

$ sudo vim vars

eusi handap:

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

Parameter pikeun organisasi kondisional ABC LLC dijelaskeun di dieu; anjeun tiasa ngabenerkeunana kana anu asli atanapi tinggalkeun tina conto. Hal pangpentingna dina parameter nyaéta garis panungtungan, nu nangtukeun periode validitas sertipikat dina poé. Contona ngagunakeun nilai 10 taun (365*10+2 taun kabisat). Nilai ieu kedah disaluyukeun sateuacan sertipikat pangguna dikaluarkeun.

Salajengna, urang ngonpigurasikeun otoritas sertifikasi otonom.

Setup ngawengku exporting variabel, initializing CA, ngaluarkeun CA root konci na sertipikat, konci Diffie-Hellman, konci TLS, sarta konci server na sertipikat. Konci CA kedah dijagi sacara saksama sareng dijaga rahasia! Kabéh parameter query bisa ditinggalkeun salaku standar.

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

Ieu ngalengkepan bagian utama pikeun nyetél mékanisme kriptografi.

Nyetél OpenVPN

Buka diréktori OpenVPN, jieun diréktori jasa sareng tambahkeun tautan ka 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/

Jieun file konfigurasi OpenVPN utama:

$ sudo vim server.conf

eusi handap

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

Sababaraha catetan ngeunaan parameter:

  • lamun ngaran béda ieu dieusian nalika ngaluarkeun sertipikat, nunjukkeun eta;
  • tangtukeun kumpulan alamat pikeun nyocogkeun tugas anjeun*;
  • tiasa aya hiji atanapi langkung rute sareng server DNS;
  • 2 garis panungtungan diperlukeun pikeun nerapkeun auténtikasi dina AD **.

*Kisaran alamat anu dipilih dina conto bakal ngamungkinkeun nepi ka 127 klien pikeun nyambung sakaligus, sabab éta / 23 jaringan dipilih, sarta OpenVPN nyiptakeun subnet pikeun tiap klien ngagunakeun / 30 topeng.
Upami diperyogikeun, palabuhan sareng protokol tiasa dirobih, kumaha ogé, éta kedah émut yén ngarobih nomer port port bakal nyababkeun konfigurasi SELinux, sareng nganggo protokol tcp bakal ningkatkeun overhead, sabab Kontrol pangiriman pakét TCP parantos dilaksanakeun dina tingkat pakét anu dibungkus dina torowongan.

** Lamun auténtikasi dina AD henteu diperlukeun, mairan aranjeunna kaluar, skip bagian salajengna, sarta dina citakan miceun garis auth-user-pass.

Auténtikasi AD

Pikeun ngarojong faktor kadua, urang bakal ngagunakeun verifikasi akun di AD.

Urang kudu akun dina domain kalawan hak pamaké biasa jeung grup, kaanggotaan nu bakal nangtukeun kamampuhan pikeun nyambungkeun.

Jieun file konfigurasi:

/etc/openvpn/ldap.conf

eusi handap

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

Parameter utama:

  • URL "ldap://ldap.abc.ru" - alamat controller domain;
  • BindDN "CN = bindUsr, CN = Pamaké, DC = abc, DC = ru" - ngaran canonical pikeun ngariung ka LDAP (UZ - bindUsr dina wadahna abc.ru/Users);
  • Sandi b1ndP@SS - sandi pamaké pikeun ngariung;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — jalur ti mana pikeun ngamimitian néangan pamaké;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - wadahna grup ngamungkinkeun (grup myVPNUsr dina wadahna abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" nyaéta nami grup anu ngamungkinkeun.

Mimitian sareng diagnostik

Ayeuna urang tiasa nyobian ngaktipkeun sareng ngamimitian server kami:

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

Pariksa ngamimitian:

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

Isu sertipikat sareng panyabutan

Sabab Salian sertipikat sorangan, anjeun peryogi konci sareng setélan anu sanés, saé pisan pikeun mungkus sadayana ieu dina hiji file profil. Berkas ieu teras dialihkeun ka pangguna sareng profilna diimpor dina klien OpenVPN. Jang ngalampahkeun ieu, urang bakal nyieun témplat setelan sareng skrip anu ngahasilkeun profil.

Anjeun kedah nambihan eusi sertipikat akar (ca.crt) sareng file TLS (ta.key) kana profil.

Sateuacan ngaluarkeun sertipikat pangguna ulah poho pikeun ngeset periode validitas diperlukeun pikeun sertipikat dina file parameter. Anjeun teu kedah panjang teuing; Abdi nyarankeun ngawatesan diri ka maksimal 180 dinten.

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>

Katerangan:

  • senar PUNANGKEUN... ngarobah kana eusi tina aranjeunna sertipikat;
  • dina diréktif jauh, tangtukeun ngaran / alamat gateway anjeun;
  • diréktif auth-user-pass dipaké pikeun auténtikasi éksternal tambahan.

Dina diréktori bumi (atanapi tempat anu sanés) urang nyiptakeun skrip pikeun nyuhunkeun sertipikat sareng nyiptakeun 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 ~

Ngadamel file tiasa dieksekusi:

chmod a+x ~/make.profile.sh

Sareng urang tiasa ngaluarkeun sertipikat munggaran urang.

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

Eupan Balik

Dina hal kompromi sertipikat (leungitna, maling), anjeun kedah nyabut sertipikat ieu:

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

Ningali sertipikat anu dikaluarkeun sareng dicabut

Pikeun ningali sertipikat anu dikaluarkeun sareng dicabut, kantun tingali file indéks:

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

Katerangan:

  • baris kahiji nyaéta sertipikat server;
  • karakter kahiji
    • V (Sah) - sah;
    • Urang Sunda (Dicabut) - recalled.

Konfigurasi jaringan

Léngkah terakhir nyaéta ngonpigurasikeun jaringan transmisi - routing sareng firewall.

Ngidinan sambungan dina firewall lokal:

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

Salajengna, aktipkeun routing lalu lintas IP:

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

Di lingkungan perusahaan, kamungkinan aya subnetting sareng urang kedah nyarioskeun ka router kumaha cara ngirim pakét anu ditujukeun pikeun klien VPN urang. Dina garis paréntah urang ngaéksekusi paréntah ku cara (gumantung kana alat anu dianggo):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

tur nyimpen konfigurasi.

Sajaba ti éta, dina panganteur router wates dimana alamat éksternal gw.abc.ru dilayanan, perlu pikeun ngidinan petikan udp/1194 pakét.

Upami organisasi gaduh aturan kaamanan anu ketat, firewall ogé kedah dikonpigurasi dina server VPN urang. Dina pamanggih kuring, kalenturan greatest disadiakeun ku nyetel iptables ranté FORWARD, najan nyetel aranjeunna kirang merenah. Sakedik langkung seueur ngeunaan netepkeunana. Jang ngalampahkeun ieu, paling merenah ngagunakeun "aturan langsung" - aturan langsung, disimpen dina file /etc/firewalld/direct.xml. Konfigurasi aturan ayeuna tiasa dipendakan sapertos kieu:

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

Sateuacan ngarobih file, jieun salinan cadanganna:

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

Eusi perkiraan file nyaéta:

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

guaran

Ieu dasarna aturan iptables biasa, disebutkeun rangkep sanggeus mecenghulna firewalld.

Antarbeungeut tujuan sareng setélan standar nyaéta tun0, sareng antarbeungeut éksternal pikeun torowongan tiasa béda, contona, ens192, gumantung kana platform anu dianggo.

Baris panungtungan nyaéta pikeun logging pakét turun. Pikeun logging tiasa dianggo, anjeun kedah ngarobih tingkat debug dina konfigurasi firewalld:

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

Nerapkeun setélan nyaéta paréntah firewalld biasa pikeun maca deui setélan:

$ sudo firewall-cmd --reload

Anjeun tiasa ningali pakét anu turun sapertos kieu:

grep forward_fw /var/log/messages

Naon salajengna

Ieu ngalengkepan setelan!

Sadaya anu tetep nyaéta masang parangkat lunak klien di sisi klien, ngimpor profil sareng sambungkeun. Pikeun sistem operasi Windows, kit distribusi aya dina ramatloka pamekar.

Tungtungna, urang sambungkeun server anyar urang ka sistem monitoring sarta arsip, sarta ulah poho pikeun rutin install apdet.

sambungan stabil!

sumber: www.habr.com

Tambahkeun komentar