Organisasi kerja jarak jauh dari organisasi SMB di OpenVPN

Pernyataan masalah

Artikel ini menjelaskan pengorganisasian akses jarak jauh bagi karyawan pada produk sumber terbuka dan dapat digunakan untuk membangun sistem yang sepenuhnya otonom, dan akan berguna untuk perluasan ketika ada kekurangan lisensi dalam sistem komersial yang ada atau kinerjanya tidak mencukupi.

Tujuan dari artikel ini adalah untuk menerapkan sistem lengkap untuk menyediakan akses jarak jauh ke suatu organisasi, yang tidak lebih dari sekedar “menginstal OpenVPN dalam 10 menit.”

Hasilnya, kita akan mendapatkan sistem di mana sertifikat dan (opsional) Direktori Aktif perusahaan akan digunakan untuk mengautentikasi pengguna. Itu. kita akan mendapatkan sistem dengan dua faktor verifikasi - apa yang saya miliki (sertifikat) dan apa yang saya ketahui (kata sandi).

Tanda bahwa pengguna diperbolehkan terhubung adalah keanggotaannya di grup myVPNUsr. Otoritas sertifikat akan digunakan secara offline.

Biaya penerapan solusi hanya sumber daya perangkat keras yang kecil dan 1 jam kerja administrator sistem.

Kami akan menggunakan mesin virtual dengan OpenVPN dan Easy-RSA versi 3 di CetntOS 7, yang dialokasikan 100 vCPU dan 4 GiB RAM per 4 koneksi.

Pada contoh, jaringan organisasi kita adalah 172.16.0.0/16, dimana server VPN dengan alamat 172.16.19.123 terletak di segmen 172.16.19.0/24, server DNS 172.16.16.16 dan 172.16.17.17, dan subnet 172.16.20.0 .23/XNUMX dialokasikan untuk klien VPN.

Untuk terhubung dari luar, koneksi melalui port 1194/udp digunakan, dan A-record gw.abc.ru telah dibuat di DNS untuk server kami.

Sangat tidak disarankan untuk menonaktifkan SELinux! OpenVPN berfungsi tanpa menonaktifkan kebijakan keamanan.

kadar

  1. Instalasi OS dan perangkat lunak aplikasi
  2. Menyiapkan kriptografi
  3. Konfigurasi OpenVPN
  4. Otentikasi IKLAN
  5. Startup dan diagnostik
  6. Penerbitan dan pencabutan sertifikat
  7. Pengaturan jaringan
  8. Apa Selanjutnya

Instalasi OS dan perangkat lunak aplikasi

Kami menggunakan distribusi CentOS 7.8.2003. Kita perlu menginstal OS dalam konfigurasi minimal. Lebih mudah untuk melakukan ini dengan menggunakan mulai, mengkloning image OS yang diinstal sebelumnya dan cara lainnya.

Setelah instalasi, menetapkan alamat ke antarmuka jaringan (sesuai dengan ketentuan tugas 172.16.19.123), kami memperbarui OS:

$ sudo yum update -y && reboot

Kami juga perlu memastikan bahwa sinkronisasi waktu dilakukan pada mesin kami.
Untuk menginstal perangkat lunak aplikasi, Anda memerlukan paket 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

Hal ini berguna untuk menginstal agen tamu untuk mesin virtual:

$ sudo yum install open-vm-tools

untuk host VMware ESXi, atau untuk oVirt

$ sudo yum install ovirt-guest-agent

Menyiapkan kriptografi

Buka direktori easy-rsa:

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

Buat file variabel:

$ sudo vim vars

konten 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 dijelaskan di sini, Anda dapat memperbaikinya menjadi yang asli atau mengabaikannya dari contoh. Hal terpenting dalam parameter adalah baris terakhir, yang menentukan masa berlaku sertifikat dalam hari. Contohnya menggunakan nilai 10 tahun (365*10+2 tahun kabisat). Nilai ini perlu disesuaikan sebelum sertifikat pengguna diterbitkan.

Selanjutnya, kami mengonfigurasi otoritas sertifikasi otonom.

Penyiapan mencakup mengekspor variabel, menginisialisasi CA, menerbitkan kunci dan sertifikat akar CA, kunci Diffie-Hellman, kunci TLS, serta kunci server dan sertifikat. Kunci CA harus dilindungi dan dirahasiakan dengan hati-hati! Semua parameter kueri dapat dibiarkan sebagai default.

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 menyelesaikan bagian utama pengaturan mekanisme kriptografi.

Konfigurasi OpenVPN

Buka direktori OpenVPN, buat direktori layanan dan tambahkan tautan 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 file konfigurasi OpenVPN utama:

$ sudo vim server.conf

konten 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 catatan tentang parameter:

  • jika nama yang berbeda ditentukan saat menerbitkan sertifikat, sebutkan;
  • tentukan kumpulan alamat yang sesuai dengan tugas Anda*;
  • mungkin ada satu atau lebih rute dan server DNS;
  • 2 baris terakhir diperlukan untuk mengimplementasikan otentikasi di AD**.

*Rentang alamat yang dipilih dalam contoh akan memungkinkan hingga 127 klien untuk terhubung secara bersamaan, karena jaringan /23 dipilih, dan OpenVPN membuat subnet untuk setiap klien menggunakan topeng /30.
Jika diperlukan, port dan protokol dapat diubah, namun perlu diingat bahwa mengubah nomor port akan memerlukan konfigurasi SELinux, dan penggunaan protokol tcp akan meningkatkan overhead, karena Kontrol pengiriman paket TCP sudah dilakukan pada tingkat paket yang dienkapsulasi di terowongan.

**Jika autentikasi di AD tidak diperlukan, beri komentar, lewati bagian berikutnya, dan di templat hapus baris auth-user-pass.

Otentikasi IKLAN

Untuk mendukung faktor kedua, kami akan menggunakan verifikasi akun di AD.

Kami memerlukan akun di domain dengan hak pengguna biasa dan grup, keanggotaan yang akan menentukan kemampuan untuk terhubung.

Buat file konfigurasi:

/etc/openvpn/ldap.conf

konten 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 kunci:

  • URL “ldap://ldap.abc.ru” - alamat pengontrol domain;
  • BindDN “CN=bindUsr,CN=Users,DC=abc,DC=ru” - nama kanonik untuk mengikat ke LDAP (UZ - bindUsr dalam wadah abc.ru/Users);
  • Kata sandi b1ndP@SS — kata sandi pengguna untuk mengikat;
  • BaseDN “OU=allUsr,DC=abc,DC=ru” — jalur untuk mulai mencari pengguna;
  • BaseDN “OU=myGrp,DC=abc,DC=ru” – wadah dari grup yang mengizinkan (grup myVPNUsr dalam wadah abc.rumyGrp);
  • SearchFilter "(cn=myVPNUsr)" adalah nama grup yang mengizinkan.

Startup dan diagnostik

Sekarang kita dapat mencoba mengaktifkan dan memulai server kami:

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

Pemeriksaan permulaan:

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

Penerbitan dan pencabutan sertifikat

Karena Selain sertifikat itu sendiri, Anda memerlukan kunci dan pengaturan lainnya, sangat mudah untuk menggabungkan semua ini dalam satu file profil. File ini kemudian ditransfer ke pengguna dan profil diimpor pada klien OpenVPN. Untuk melakukan ini, kita akan membuat template pengaturan dan skrip yang menghasilkan profil.

Anda perlu menambahkan konten file sertifikat root (ca.crt) dan kunci TLS (ta.key) ke profil.

Sebelum menerbitkan sertifikat pengguna jangan lupa untuk mengatur masa berlaku sertifikat yang diperlukan dalam file parameter. Anda tidak boleh membuatnya terlalu lama, saya sarankan membatasi diri Anda maksimal 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>

Catatan:

  • string LETAKKAN... berubah menjadi konten sendiri sertifikat;
  • dalam arahan jarak jauh, tentukan nama/alamat gateway Anda;
  • arahan auth-user-pass digunakan untuk otentikasi eksternal tambahan.

Di direktori home (atau tempat lain yang nyaman) kami membuat skrip untuk meminta sertifikat 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 ~

Membuat file dapat dieksekusi:

chmod a+x ~/make.profile.sh

Dan kami dapat menerbitkan sertifikat pertama kami.

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

Tinjau

Jika sertifikat dikompromikan (kehilangan, pencurian), sertifikat ini perlu dicabut:

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

Lihat sertifikat yang diterbitkan dan dicabut

Untuk melihat sertifikat yang diterbitkan dan dicabut, cukup lihat file indeks:

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

Penjelasan:

  • baris pertama adalah sertifikat server;
  • karakter pertama
    • V (Sah) - sah;
    • R (Dicabut) - ditarik kembali.

Pengaturan jaringan

Langkah terakhir adalah mengkonfigurasi jaringan transmisi - routing dan firewall.

Mengizinkan koneksi di firewall lokal:

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

Selanjutnya, aktifkan perutean lalu lintas IP:

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

Dalam lingkungan perusahaan, kemungkinan terdapat subnetting dan kita perlu memberi tahu router cara mengirim paket yang ditujukan untuk klien VPN kita. Pada baris perintah kita menjalankan perintah dengan cara (tergantung peralatan yang digunakan):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

dan simpan konfigurasinya.

Selain itu, pada antarmuka router perbatasan tempat alamat eksternal gw.abc.ru disajikan, paket udp/1194 harus diizinkan lewat.

Jika organisasi memiliki aturan keamanan yang ketat, firewall juga harus dikonfigurasi di server VPN kami. Menurut pendapat saya, fleksibilitas terbesar diberikan dengan menyiapkan rantai iptables FORWARD, meskipun pengaturannya kurang nyaman. Sedikit lagi tentang pengaturannya. Untuk melakukan ini, paling mudah menggunakan "aturan langsung" - aturan langsung, disimpan dalam file /etc/firewalld/direct.xml. Konfigurasi aturan saat ini dapat ditemukan sebagai berikut:

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

Sebelum mengubah file, buat salinan cadangannya:

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

Perkiraan isi filenya 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 aturan iptables biasa, jika tidak dikemas setelah munculnya firewalld.

Antarmuka tujuan dengan pengaturan default adalah tun0, dan antarmuka eksternal untuk terowongan mungkin berbeda, misalnya ens192, bergantung pada platform yang digunakan.

Baris terakhir adalah untuk mencatat paket yang dijatuhkan. Agar logging berfungsi, Anda perlu mengubah tingkat debug di konfigurasi firewalld:

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

Menerapkan pengaturan adalah perintah firewalld yang biasa untuk membaca ulang pengaturan:

$ sudo firewall-cmd --reload

Anda dapat melihat paket yang dijatuhkan seperti ini:

grep forward_fw /var/log/messages

Apa Selanjutnya

Ini menyelesaikan penyiapan!

Yang tersisa hanyalah menginstal perangkat lunak klien di sisi klien, mengimpor profil dan menghubungkan. Untuk sistem operasi Windows, kit distribusi terletak di situs pengembang.

Terakhir, kami menghubungkan server baru kami ke sistem pemantauan dan pengarsipan, dan jangan lupa untuk menginstal pembaruan secara berkala.

Koneksi stabil!

Sumber: www.habr.com

Tambah komentar