Organisasi kerja jauh organisasi SMB pada OpenVPN

Pernyataan masalah

Artikel itu menerangkan organisasi capaian jauh untuk pekerja pada produk sumber terbuka dan boleh digunakan kedua-duanya untuk membina sistem autonomi sepenuhnya, dan akan berguna untuk pengembangan apabila terdapat kekurangan lesen dalam sistem komersial sedia ada atau prestasinya tidak mencukupi.

Matlamat artikel adalah untuk melaksanakan sistem lengkap untuk menyediakan akses jauh kepada organisasi, yang lebih kecil daripada "memasang OpenVPN dalam 10 minit."

Akibatnya, kami akan mendapat sistem di mana sijil dan (sebagai pilihan) Direktori Aktif korporat akan digunakan untuk mengesahkan pengguna. Itu. kita akan mendapat sistem dengan dua faktor pengesahan - apa yang saya ada (sijil) dan apa yang saya tahu (kata laluan).

Tanda bahawa pengguna dibenarkan untuk menyambung ialah keahlian mereka dalam kumpulan myVPNUsr. Pihak berkuasa sijil akan digunakan di luar talian.

Kos untuk melaksanakan penyelesaian hanyalah sumber perkakasan kecil dan 1 jam kerja pentadbir sistem.

Kami akan menggunakan mesin maya dengan OpenVPN dan Easy-RSA versi 3 pada CetntOS 7, yang diperuntukkan 100 vCPU dan 4 GiB RAM bagi setiap 4 sambungan.

Dalam contoh, rangkaian organisasi kami ialah 172.16.0.0/16, di mana pelayan VPN dengan alamat 172.16.19.123 terletak dalam segmen 172.16.19.0/24, pelayan DNS 172.16.16.16 dan 172.16.17.17, dan subnet 172.16.20.0. .23/XNUMX diperuntukkan untuk klien VPN .

Untuk menyambung dari luar, sambungan melalui port 1194/udp digunakan, dan A-record gw.abc.ru telah dibuat dalam DNS untuk pelayan kami.

Ia sama sekali tidak disyorkan untuk melumpuhkan SELinux! OpenVPN berfungsi tanpa melumpuhkan dasar keselamatan.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Pemasangan OS dan perisian aplikasi
  2. Menyediakan kriptografi
  3. Menyediakan OpenVPN
  4. Pengesahan AD
  5. Permulaan dan diagnostik
  6. Pengeluaran sijil dan pembatalan
  7. Konfigurasi rangkaian
  8. Apa yang Seterusnya

Pemasangan OS dan perisian aplikasi

Kami menggunakan pengedaran CentOS 7.8.2003. Kita perlu memasang OS dalam konfigurasi minimum. Ia adalah mudah untuk melakukan ini menggunakan sepakan permulaan, mengklonkan imej OS yang dipasang sebelum ini dan cara lain.

Selepas pemasangan, memberikan alamat kepada antara muka rangkaian (mengikut syarat tugas 172.16.19.123), kami mengemas kini OS:

$ sudo yum update -y && reboot

Kami juga perlu memastikan bahawa penyegerakan masa dilakukan pada mesin kami.
Untuk memasang perisian aplikasi, anda memerlukan pakej openvpn, openvpn-auth-ldap, easy-rsa dan vim sebagai editor utama (anda memerlukan repositori EPEL).

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

Ia berguna untuk memasang ejen tetamu untuk mesin maya:

$ sudo yum install open-vm-tools

untuk hos VMware ESXi, atau untuk oVirt

$ sudo yum install ovirt-guest-agent

Menyediakan kriptografi

Pergi ke direktori easy-rsa:

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

Buat fail berubah-ubah:

$ sudo vim vars

kandungan berikut:

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 untuk organisasi bersyarat ABC LLC diterangkan di sini; anda boleh membetulkannya kepada yang sebenar atau meninggalkannya daripada contoh. Perkara yang paling penting dalam parameter ialah baris terakhir, yang menentukan tempoh sah sijil dalam beberapa hari. Contoh menggunakan nilai 10 tahun (365*10+2 tahun lompat). Nilai ini perlu dilaraskan sebelum sijil pengguna dikeluarkan.

Seterusnya, kami mengkonfigurasi pihak berkuasa pensijilan autonomi.

Persediaan termasuk mengeksport pembolehubah, memulakan CA, mengeluarkan kunci akar CA dan sijil, kunci Diffie-Hellman, kunci TLS dan kunci dan sijil pelayan. Kunci CA mesti dilindungi dengan teliti dan dirahsiakan! Semua parameter pertanyaan boleh dibiarkan sebagai lalai.

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

Ini melengkapkan bahagian utama penyediaan mekanisme kriptografi.

Menyediakan OpenVPN

Pergi ke direktori OpenVPN, buat direktori perkhidmatan dan tambahkan pautan ke 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/

Buat fail konfigurasi OpenVPN utama:

$ sudo vim server.conf

kandungan berikut

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

Beberapa nota mengenai parameter:

  • jika nama lain dinyatakan semasa mengeluarkan sijil, nyatakan;
  • tentukan kumpulan alamat yang sesuai dengan tugas anda*;
  • boleh ada satu atau lebih laluan dan pelayan DNS;
  • 2 baris terakhir diperlukan untuk melaksanakan pengesahan dalam AD**.

*Julat alamat yang dipilih dalam contoh akan membenarkan sehingga 127 pelanggan untuk menyambung secara serentak, kerana rangkaian /23 dipilih dan OpenVPN mencipta subnet untuk setiap pelanggan menggunakan topeng /30.
Jika perlu, port dan protokol boleh ditukar, bagaimanapun, perlu diingat bahawa menukar nombor port port akan memerlukan konfigurasi SELinux, dan menggunakan protokol tcp akan meningkatkan overhed, kerana Kawalan penghantaran paket TCP sudah dilakukan pada tahap paket yang terkandung dalam terowong.

**Jika pengesahan dalam AD tidak diperlukan, ulasnya, langkau bahagian seterusnya dan dalam templat alih keluar baris auth-user-pass.

Pengesahan AD

Untuk menyokong faktor kedua, kami akan menggunakan pengesahan akaun dalam AD.

Kami memerlukan akaun dalam domain dengan hak pengguna biasa dan kumpulan, keahlian yang akan menentukan keupayaan untuk menyambung.

Buat fail konfigurasi:

/etc/openvpn/ldap.conf

kandungan berikut

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

  • URL "ldap://ldap.abc.ru" - alamat pengawal domain;
  • BindDN β€œCN=bindUsr,CN=Users,DC=abc,DC=ru” - nama kanonik untuk mengikat LDAP (UZ - bindUsr dalam bekas abc.ru/Users);
  • Kata laluan b1ndP@SS β€” kata laluan pengguna untuk mengikat;
  • BaseDN β€œOU=allUsr,DC=abc,DC=ru” β€” laluan untuk mula mencari pengguna;
  • BaseDN β€œOU=myGrp,DC=abc,DC=ru” – bekas kumpulan yang membenarkan (kumpulan myVPNUsr dalam bekas abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" ialah nama kumpulan yang membenarkan.

Permulaan dan diagnostik

Kini kami boleh cuba mendayakan dan memulakan pelayan kami:

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

Semakan permulaan:

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

Pengeluaran sijil dan pembatalan

Kerana Sebagai tambahan kepada sijil itu sendiri, anda memerlukan kunci dan tetapan lain; sangat mudah untuk membungkus semua ini dalam satu fail profil. Fail ini kemudiannya dipindahkan kepada pengguna dan profil diimport pada klien OpenVPN. Untuk melakukan ini, kami akan mencipta templat tetapan dan skrip yang menjana profil.

Anda perlu menambah kandungan fail sijil akar (ca.crt) dan kunci TLS (ta.key) pada profil.

Sebelum mengeluarkan sijil pengguna jangan lupa tetapkan tempoh sah laku yang diperlukan untuk sijil dalam fail parameter. Anda tidak sepatutnya membuatnya terlalu lama; Saya mengesyorkan anda mengehadkan diri anda kepada maksimum 180 hari.

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>

Nota:

  • tali LETAKKAN ANDA PUNYA... tukar kepada kandungan mereka sijil;
  • dalam arahan jauh, nyatakan nama/alamat pintu masuk anda;
  • arahan pengesahan-pengguna-laluan digunakan untuk pengesahan luaran tambahan.

Dalam direktori rumah (atau tempat lain yang mudah) kami mencipta skrip untuk meminta sijil dan membuat 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 ~

Menjadikan fail boleh laku:

chmod a+x ~/make.profile.sh

Dan kami boleh mengeluarkan sijil pertama kami.

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

Kajian

Sekiranya berlaku kompromi terhadap sijil (kehilangan, kecurian), sijil ini perlu dibatalkan:

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

Lihat sijil yang dikeluarkan dan dibatalkan

Untuk melihat sijil yang dikeluarkan dan dibatalkan, cuma lihat fail indeks:

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

Penjelasan:

  • baris pertama ialah sijil pelayan;
  • watak pertama
    • V (Sah) - sah;
    • R (Dibatalkan) - dipanggil semula.

Konfigurasi rangkaian

Langkah terakhir adalah untuk mengkonfigurasi rangkaian penghantaran - penghalaan dan tembok api.

Membenarkan sambungan dalam tembok api tempatan:

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

Seterusnya, dayakan penghalaan trafik IP:

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

Dalam persekitaran korporat, kemungkinan terdapat subnetting dan kami perlu memberitahu penghala cara menghantar paket yang ditujukan untuk pelanggan VPN kami. Pada baris arahan kami melaksanakan arahan dengan cara (bergantung pada peralatan yang digunakan):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

dan simpan konfigurasi.

Di samping itu, pada antara muka penghala sempadan di mana alamat luaran gw.abc.ru dihidangkan, adalah perlu untuk membenarkan laluan paket udp/1194.

Sekiranya organisasi mempunyai peraturan keselamatan yang ketat, tembok api juga mesti dikonfigurasikan pada pelayan VPN kami. Pada pendapat saya, fleksibiliti terbesar disediakan dengan menyediakan rantaian FORWARD iptables, walaupun menetapkannya kurang mudah. Sedikit lagi tentang menyediakannya. Untuk melakukan ini, adalah paling mudah untuk menggunakan "peraturan langsung" - peraturan langsung, disimpan dalam fail /etc/firewalld/direct.xml. Konfigurasi semasa peraturan boleh didapati seperti berikut:

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

Sebelum menukar fail, buat salinan sandarannya:

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

Anggaran kandungan fail adalah:

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

Penjelasan

Ini pada dasarnya adalah peraturan iptables biasa, jika tidak dibungkus selepas kemunculan firewalld.

Antara muka destinasi dengan tetapan lalai ialah tun0, dan antara muka luaran untuk terowong mungkin berbeza, contohnya, ens192, bergantung pada platform yang digunakan.

Baris terakhir adalah untuk mengelog paket yang digugurkan. Untuk pengelogan berfungsi, anda perlu menukar tahap nyahpepijat dalam konfigurasi firewall:

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

Menggunakan tetapan ialah perintah firewalld biasa untuk membaca semula tetapan:

$ sudo firewall-cmd --reload

Anda boleh melihat paket yang dijatuhkan seperti ini:

grep forward_fw /var/log/messages

Apa yang Seterusnya

Ini melengkapkan persediaan!

Apa yang tinggal ialah memasang perisian klien pada bahagian klien, mengimport profil dan menyambung. Untuk sistem pengendalian Windows, kit pengedaran terletak pada laman web pembangun.

Akhir sekali, kami menyambungkan pelayan baharu kami kepada sistem pemantauan dan pengarkiban, dan jangan lupa memasang kemas kini secara kerap.

Sambungan yang stabil!

Sumber: www.habr.com

Tambah komen