Organisasi organisasi SMB kerja jarak jauh pada OpenVPN

Perumusan masalah


Artikel ini menjelaskan organisasi akses jarak jauh bagi karyawan pada produk-produk open source dan dapat digunakan baik untuk membangun sistem yang sepenuhnya otonom dan akan berguna untuk ekspansi ketika ada kekurangan lisensi dalam sistem komersial yang ada atau kinerjanya tidak mencukupi.

Tujuan artikel ini adalah untuk memperkenalkan sistem lengkap untuk menyediakan akses jarak jauh ke suatu organisasi, yang sedikit lebih dari "menginstal OpenVPN dalam 10 menit".

Akibatnya, kami mendapatkan sistem di mana sertifikat dan (opsional) direktori perusahaan Direktori Aktif akan digunakan untuk otentikasi pengguna. UNTUK. kami mendapatkan sistem dengan dua faktor verifikasi - apa yang saya miliki (sertifikat) dan apa yang saya tahu (kata sandi).

Tanda bahwa pengguna diizinkan untuk terhubung adalah keanggotaannya di grup myVPNUsr. Otoritas Sertifikat akan digunakan secara mandiri.

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

Kami akan menggunakan mesin virtual dengan OpenVPN dan Easy-RSA versi ke-3 pada CetntOS 7, yang berdasarkan pada 100 koneksi yang dikeluarkan 4 vCPU, 4 GiB RAM.

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

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

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

Kandungan


  1. Instalasi OS dan perangkat lunak aplikasi
  2. Pengaturan Kriptografi
  3. Konfigurasikan OpenVPN
  4. Otentikasi dalam AD
  5. Peluncuran dan Diagnostik
  6. Masalah dan pencabutan sertifikat
  7. Konfigurasi jaringan
  8. Apa berikutnya


Instalasi OS dan perangkat lunak aplikasi


Kami menggunakan kit distribusi CentOS 7.8.2003. Kita perlu menginstal OS dalam konfigurasi minimal. Lebih mudah untuk melakukan ini menggunakan kickstart , kloning gambar OS yang diinstal sebelumnya, dan cara lain.

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

$ sudo yum update -y && reboot

Anda juga perlu memastikan bahwa mesin kami menyinkronkan waktu.
Untuk menginstal perangkat lunak aplikasi, Anda memerlukan paket openvpn, openvpn-auth-ldap, easy-rsa dan vim sebagai editor utama (Anda akan memerlukan repositori EPEL).

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

Untuk mesin virtual, ada baiknya memasang agen tamu:

$ sudo yum install open-vm-tools

untuk host VMware ESXi, atau untuk oVirt

$ sudo yum install ovirt-guest-agent


Pengaturan 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="admin@abc.ru"
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 nyata atau membiarkannya sebagai contoh. Hal terpenting dalam parameter adalah baris terakhir, yang menentukan masa berlaku sertifikat dalam beberapa hari. Dalam contoh ini, nilai 10 tahun digunakan (365 * 10 + 2 tahun kabisat). Nilai ini perlu disesuaikan sebelum mengeluarkan sertifikat pengguna.

Selanjutnya, buat otoritas sertifikasi mandiri.

Penyiapan mencakup variabel ekspor, inisialisasi CA, mengeluarkan kunci root dan sertifikat CA, kunci Diffie-Hellman, kunci TLS, serta kunci server dan sertifikat. Kunci otoritas sertifikat harus dijaga dan dirahasiakan! Semua parameter pada permintaan dapat dibiarkan secara 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

Pada ini, bagian utama dari pengaturan mekanisme kriptografi selesai.

Konfigurasikan OpenVPN


Pergi ke 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 pada parameter:

  • jika nama yang berbeda ditunjukkan saat mengeluarkan sertifikat, tunjukkan;
  • tentukan kumpulan alamat untuk tugas Anda *;
  • rute dan server DNS dapat berupa satu atau lebih;
  • 2 baris terakhir diperlukan untuk mengimplementasikan otentikasi dalam AD **.

* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .

** AD , , — , auth-user-pass.


AD


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

Kami membutuhkan akun di domain dengan hak pengguna biasa dan grup, yang keanggotaannya 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 utama:

  • URL "ldap: //ldap.abc.ru" - alamat pengontrol domain;
  • BindDN "CN = bindUsr, CN = Pengguna, DC = abc, DC = ru" - nama kanonik untuk mengikat LDAP (UZ - bindUsr dalam wadah abc.ru/Users);
  • Kata sandi b1ndP @ SS - kata sandi pengguna untuk pengikatan;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - jalur untuk memulai pencarian pengguna;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - wadah grup yang memungkinkan (grup myVPNUsr dalam wadah abc.ru \ myGrp);
  • SearchFilter "(cn = myVPNUsr)" adalah nama grup penyelesai.


Peluncuran dan Diagnostik


Sekarang kita dapat mencoba untuk menghidupkan dan memulai server kami:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Peluncuran Periksa:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Masalah dan pencabutan sertifikat


Karena selain sertifikat itu sendiri, Anda memerlukan kunci dan pengaturan lain, sangat nyaman untuk membungkus semua ini dalam satu file profil. File ini kemudian ditransfer ke pengguna dan profil sudah diimpor pada klien OpenVPN. Untuk melakukan ini, buat templat konfigurasi dan skrip yang membentuk profil.

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

Sebelum mengeluarkan sertifikat pengguna, pastikan untuk menetapkan periode validitas sertifikat yang diperlukan dalam file parameter. Anda tidak boleh membuatnya terlalu besar, saya sarankan membatasi hingga 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>

Catatan:

  • PUT Your ... string diubah ke konten sertifikat mereka ;
  • di remote direktif 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 ~

Kami membuat file dapat dieksekusi:

chmod a+x ~/make.profile.sh

Dan Anda dapat menerbitkan sertifikat pertama kami.

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


Umpan balik


Jika sertifikat dikompromikan (hilang, dicuri), sertifikat ini harus dicabut:

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


Lihat sertifikat yang dikeluarkan dan dicabut


Untuk melihat sertifikat yang dikeluarkan 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 (Valid) - valid;
    • R (Dicabut) - dipanggil kembali.


Konfigurasi jaringan


Langkah terakhir adalah menyiapkan jaringan transmisi - perutean dan firewall.

Izin untuk 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, mungkin ada divisi dalam subnet dan kami perlu memberi tahu router bagaimana mengirim paket yang ditujukan ke klien VPN kami. Di baris perintah, jalankan perintah dengan cara (tergantung pada 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, di mana alamat eksternal gw.abc.ru disajikan, perlu untuk mengizinkan berlalunya paket udp / 1194.

Jika organisasi Anda memiliki aturan keamanan yang ketat, Anda juga harus mengonfigurasi firewall di server VPN kami. Menurut pendapat saya, pengaturan rantai iptables FORWARD memberikan fleksibilitas paling besar, meskipun pengaturannya kurang nyaman. Sedikit lagi tentang pengaturannya. Untuk ini, akan lebih mudah menggunakan "aturan langsung" - aturan langsung yang 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 file adalah sebagai berikut:

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


Pada dasarnya, ini adalah aturan iptables yang biasa, jika tidak dikemas setelah munculnya firewalld.

Antarmuka tujuan pada pengaturan default adalah tun0, dan yang eksternal untuk terowongan mungkin berbeda, misalnya, EN192, tergantung pada platform yang digunakan.

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

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

Terapkan pengaturan - perintah firewalld biasa untuk membaca kembali pengaturan:

$ sudo firewall-cmd --reload

Paket yang dibuang dapat dilihat sebagai berikut:

grep forward_fw /var/log/messages


Apa berikutnya


Pengaturan selesai!

Tetap di sisi klien untuk menginstal perangkat lunak klien, mengimpor profil dan terhubung. Untuk OS seperti Windows, distribusi tersedia di situs pengembang .

Sebagai kesimpulan, kami menghubungkan server baru kami ke sistem pemantauan dan pengarsipan, dan jangan lupa untuk menginstal pembaruan secara teratur.

Koneksi stabil!

All Articles