OpenVPN dengan hierarki CA dua tingkat

Baru-baru ini saya kebetulan mengalami tugas membuat hierarki dua tingkat Otoritas Sertifikat untuk OpenVPN di debian. Seringkali saya memiliki kesempatan untuk meningkatkan OpenVPN dengan satu otoritas sertifikasi dan sangat memahami bagaimana seharusnya secara teori dengan dua CA, tetapi dalam praktiknya saya menghadapi kenyataan bahwa saya tidak mengerti apa dan di mana harus menandatangani. Google tidak memberi saya jawaban yang cocok untuk linux (atau saya tidak google) dan saya mulai mencari tahu. Di bawah ini saya telah menyediakan manual yang saya susun dalam proses pembuatan dan konfigurasi.



Saya ingin segera mencatat bahwa di sini saya lebih menekankan pada pengaturan CA daripada pada OpenVPN.



Sebelum kita mulai, saya akan memberi tahu seseorang yang dapat menggunakannya dengan contoh saya.



Saya mendapat tugas untuk membuat sistem untuk perusahaan besar sedemikian rupa sehingga hanya satu orang yang menandatangani sertifikat server OpenVPN, ada banyak server VPN, beberapa server VPN dipasang untuk setiap departemen. Bahkan ada lebih banyak karyawan (klien) dan penguasaan (mengeluarkan / mencabut) sertifikat setiap ada karyawan yang datang / meninggalkan beban yang sangat berat (belum lagi karyawan tidak tetap). Pegawai masing-masing departemen diawasi oleh ketua jurusan, yang mengeluarkan atau mencabut sertifikat untuk pegawai baru / lama.



Untuk sertifikat dan kunci digital apa yang dibutuhkan, banyak yang telah dikatakan dan saya tidak akan mengulangi penulis lain, tetapi singkatnya, maka:



  • untuk memverifikasi keandalan (terjadi "jabat tangan ganda"), klien dan server memastikan siapa mereka, apakah mereka dapat mempercayai satu sama lain dan membuat sambungan;
  • enkripsi / dekripsi;
  • pengecualian "Man in the middle (MITM)" untuk memastikan bahwa seseorang tidak menyadap pesan / lalu lintas;
  • untuk membuat sandi terenkripsi, yang meningkatkan keamanan dan mempersulit penyerang untuk mengakses host.


Prinsip operasi hierarki CA multi-level adalah bahwa CA level teratas (RootCA) menandatangani sertifikatnya sendiri untuk jangka waktu yang cukup lama (tetapi ini murni masalah individu), masing-masing lebih rendah berikutnya dalam hierarki CA atau layanan menandatangani sertifikatnya dengan CA yang lebih tinggi (biasanya birokrasi) dengan ketentuan bahwa sertifikat tingkat yang lebih rendah harus memiliki masa berlaku tidak lebih dari setengah masa berlaku sertifikat tingkat yang lebih tinggi.







Saat membuat CA, dua file dibuat: ca.crt - kunci publik dan ca.key - kunci pribadi.

Kunci pribadi harus dilindungi dan tidak boleh dibagikan dengan pihak ketiga.



Saat kita perlu membuat CA bawahan / penandatanganan, kita membuat kunci pribadi di atasnya dan permintaan untuk penandatanganan dari RootCA.



Bagaimana komputer dan pengguna di seluruh dunia tahu bahwa mereka dapat mempercayai layanan atau situs, Anda bertanya? Sederhana saja (yah, dalam teori), CA Public Key (RootCA) ditempatkan di komputer pengguna dan komputer ini mempercayai semua sertifikat yang dikeluarkan oleh CA ini. Dalam prakteknya, hal ini tentunya lebih sulit dan tidak murah. Tetapi di dalam perusahaan Anda sendiri hal itu cukup mudah dilakukan.



Untuk implementasinya, kami membutuhkan tiga server. Dalam tutorial ini kami akan menggunakan debian 9. Kami akan memberi nama server sesuai dengan aplikasinya: OpenVPN, SubCA, RootCA.



Semua tindakan dilakukan di bawah pengguna bukan root.



Untuk melakukan ini, pengguna Anda harus berada di grup sudo.



Jika sudo tidak diinstal di server, masuklah sebagai root:



# su - root
# apt-get install sudo -y
# usermod -aG sudo username
# exit


Kami menginstal utilitas yang diperlukan di semua server (utilitas mungkin berbeda tergantung pada keyakinan dan keyakinan, wget, ufw, vim adalah wajib, karena di sini saya telah memberikan perintah dengan utilitas ini):



# sudo apt-get update
# sudo apt-get upgrade
# sudo apt-get install wget curl net-tools ufw vim -y
# cd ~
# wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
# tar xvf EasyRSA-3.0.4.tgz


Instal openvpn di server OpenVPN:



# sudo apt-get install openvpn -y


Pergi ke server RootCA. Di sini kita perlu membuat file dari mana easyrsa akan mengambil nilai variabel:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


Temukan blok, hapus # dan gantikan nilai-nilai kami. Agar tidak memasukkan data kami saat menandatangani sertifikat, kami akan menuliskannya di sini:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


Selanjutnya, temukan pengaturan berikut, hapus # dan edit nilainya. Arahan ini bertanggung jawab atas masa pakai sertifikat (yang pertama adalah seumur hidup sertifikat CA, yang kedua adalah seumur hidup sertifikat yang sedang ditandatangani):



#set_var EASYRSA_CA_EXPIRE	3650         #-->  3650
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  1825


Lebih lanjut:



# ./easyrsa init-pki


Menjalankan perintah selanjutnya akan meminta CN. Anda dapat membiarkan default, tetapi lebih baik memasukkan nama pengenal nama host (RootCA). Nilai "nopass" berarti Anda tidak perlu membuat sandi:



# ./easyrsa build-ca nopass


Pergi ke server SubCA dan ikuti langkah serupa dengan perubahan kecil:



# mv ~/EasyRSA-3.0.4 ~/easyrsa/
# cd ~/easyrsa/
# cp vars.example vars
# vim vars


Temukan blok, hapus # dan gantikan nilai kami:



#set_var EASYRSA_REQ_COUNTRY	"US"
#set_var EASYRSA_REQ_PROVINCE	"California"
#set_var EASYRSA_REQ_CITY	"San Francisco"
#set_var EASYRSA_REQ_ORG	"Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL	"me@example.net"
#set_var EASYRSA_REQ_OU		"My Organizational Unit"


Selanjutnya, kami menemukan pengaturan berikut, hapus # dan edit nilainya:



#set_var EASYRSA_CA_EXPIRE	3650         #-->  1825
#set_var EASYRSA_CERT_EXPIRE	3650         #-->  365


Lebih lanjut:



# ./easyrsa init-pki


Menjalankan perintah selanjutnya akan meminta CN. Anda dapat membiarkan defaultnya, tetapi lebih baik memasukkan nama pengenal host (SubCA). Nilai "subca" menunjukkan bahwa kami membuat CA bawahan dan kami perlu membuat permintaan penandatanganan sertifikat:



# ./easyrsa build-ca subca nopass


Selanjutnya, kami menemukan file ~ / easyrsa / pki / reqs / ca.req (ini yang paling diminta) dan mentransfernya ke server RootCA (Anda dapat menggunakan dua metode: WinSCP dan scp):



# scp ~/easyrsa/pki/reqs/ca.req user@ip_RootCA:/tmp


Pergi ke server RootCA dan tanda tangani permintaan tersebut. Sebelum menandatangani permintaan, kita harus mengimpornya ke direktori kerja. untuk menandatangani sertifikat untuk bawahan CA, kami menggunakan atribut "ca" dan nama sertifikat (Anda dapat menyebutnya ca, tetapi agar tidak bingung, kami akan menyebutnya nama server yang kami tandatangani, dan saat kami mentransfernya ke server, kami akan mengganti namanya):



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/ca.req SubCA
# ./easyrsa sign-req ca SubCA


Konfirmasi akan diminta, Anda harus memasukkan "ya".

Kami mengembalikan sertifikat yang ditandatangani SubCA.



# scp ~/easyrsa/pki/issued/SubCA.crt user@ip_SubCA:/tmp


Pergi ke server SubCA dan pindahkan sertifikat ke direktori kerja easyrsa:



# mv /tmp/SubCA.crt ~/easyrsa/pki/ca.crt


Pada titik ini, kita sudah memiliki CA root dan CA sekunder root bertanda tangan.

Sekarang mari masuk ke server OpenVPN. Saat menyiapkannya, beberapa langkah sebelumnya diulangi. Buka server OpenVPN.



# cd ~/easyrsa/
# ./easyrsa init-pki


Sekarang mari kita mulai membuat sertifikat untuk penandatanganan. Kami akan membuat kunci Diffie-Hellman (dh.pem / dh2048.pem / dh1024.pem) untuk digunakan dalam pertukaran kunci, dan kami akan membuat tanda tangan HMAC (ta.key) untuk meningkatkan fungsi pemeriksaan integritas TLS.



Kami akan menandatangani sertifikat untuk server OpenVPN di RootCA, dan kami akan menandatangani sertifikat untuk pengguna di SubCA. Segera buat direktori tempat kami akan menambahkan kunci, sertifikat, dan konfigurasi klien.



# mkdir -p ~/client-configs/files/
# mkdir ~/client-configs/keys/
# chmod 700 ~/client-configs/
# sudo mkdir /etc/openvpn/vpnsrv1/

# ./easyrsa gen-req vpnsrv1 nopass
# ./easyrsa gen-req dumasti nopass
# ./easyrsa gen-dh
# sudo openvpn --genkey --secret ta.key
# cp /home/dumasti/easyrsa/pki/private/dumasti.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/dh.pem /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key /etc/openvpn/vpnsrv1/
# sudo cp /home/dumasti/easyrsa/ta.key ~/client-configs/keys/
# sudo cp /home/dumasti/easyrsa/pki/private/vpnsrv1.key /etc/openvpn/vpnsrv1/
# scp ~/easyrsa/pki/reqs/vpnsrv1.req user@ip_RootCA:/tmp
# scp ~/easyrsa/pki/reqs/dumasti.req user@ip_SubCA:/tmp


Pergi ke server RootCA dan tanda tangani sertifikat. Untuk menandatangani sertifikat untuk server, gunakan atribut "server", untuk klien "klien":



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/vpnsrv1.req vpnsrv1
# ./easyrsa sign-req server vpnsrv1


Konfirmasi akan diminta, Anda harus memasukkan "ya".



# scp ~/easyrsa/pki/issued/vpnsrv1.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/RootCA.crt


Pergi ke server SubCA dan tanda tangani sertifikat:



# cd ~/easyrsa/
# ./easyrsa import-req /tmp/dumasti.req dumasti
# ./easyrsa sign-req client dumasti


Konfirmasi akan diminta, Anda harus memasukkan "ya".



# scp ~/easyrsa/pki/issued/dumasti.crt user@ip_OpenVPN:/tmp
# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/SubCA.crt


Kami kembali ke server OpenVPN dan mentransfer sertifikat yang ditandatangani ke direktori yang diperlukan:



# cd /tmp


Agar server OpenVPN menerima kunci klien, kita harus menggabungkan kunci publik dari klien dan CA subordinat / penandatanganan ke dalam satu file:



# cat dumasti.crt SubCA.crt > ~/client-configs/keys/dumasti.crt
# cp /tmp/RootCA.crt ~/client-configs/keys/ca.crt
# sudo mv /tmp/RootCA.crt /etc/openvpn/vpnsrv1/
# sudo mv /tmp/vpnsrv1.crt /etc/openvpn/vpnsrv1/


Kami sekarang memiliki semua sertifikasi yang diperlukan di tempat yang tepat. Tetap membuat konfigurasi server dan klien OpenVPN (masing-masing mungkin memiliki keyakinan dan pandangan mereka sendiri dalam hal ini, tetapi sebagai contoh akan ada konfigurasi berikut).



Anda dapat menggunakan template konfigurasi server dan klien dan mengeditnya sendiri:



# sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# sudo gzip -d /etc/openvpn/server.conf.gz
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf


Tetapi di bawah ini saya akan memberikan konten file konfigurasi yang sudah jadi (simbol; dan # komentari baris):



# sudo cat /etc/openvpn/vpnsrv1.conf

port 1194
proto udp
dev tun
ca vpnsrv1/RootCA.crt
cert vpnsrv1/vpnsrv1.crt
key vpnsrv1/vpnsrv1.key
dh vpnsrv1/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;client-config-dir ccd
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth vpnsrv1/ta.key 0
key-direction 0
cipher AES-256-CBC
auth SHA256
max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
;mute 20
explicit-exit-notify 1

# cat ~/client-configs/base.conf

client
dev tun
proto udp
remote your_server_ip 1194
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
;tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
key-direction 1
verb 3
;mute 20
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf


Kita juga perlu mengkonfigurasi firewall dan penerusan paket. Memungkinkan untuk mengkonfigurasi iptables, tetapi di sini kita akan melihat ufw.



Pertama, mari cari tahu nama antarmuka kita:



# ip addr 


Mari kita buka port berikut (saya memiliki ssh di port 22, dan openvpn di 1194, jika Anda memiliki yang lain, maka bertindak sesuai):



# sudo ufw allow 1194
# sudo ufw allow 22


Selanjutnya, buka file konfigurasi ufw dan tempel yang berikut ini sebelum memulai rantai filter (ganti nilai saya dengan milik Anda):



# sudo vim /etc/ufw/before.rules

# START OPENVPN RULES

# NAT table rules

*nat

:POSTROUTING ACCEPT [0:0]

# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)

-A POSTROUTING -s 10.8.0.0/8 -o ens192 -j MASQUERADE

COMMIT

# END OPENVPN RULES


Sebelum itu:



# Don't delete these required lines, otherwise there will be errors
*filter


Anda perlu mengaktifkan penerusan UFW paket secara default. Temukan baris yang diperlukan dan ubah nilai "DROP" menjadi "ACCEPT":



# sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"


Mengonfigurasi penerusan paket. Cari baris # net.ipv4.ip_forward = 0 atau # net.ipv4.ip_forward = 1, hapus #, jika nilainya 0, lalu ubah menjadi 1:



# sudo vim /etc/sysctl.conf

net.ipv4.ip_forward=1

# sudo sysctl -p
# sudo ufw enable


Selanjutnya, kami meluncurkan VPN kami:



# sudo systemctl start openvpn@vpnsrv1


Memeriksa peluncuran:



# ip addr


Harus ada antarmuka jaringan tun0 baru dengan ip 10.8.0.1



# sudo systemctl status openvpn@vpnsrv1


Jika Anda membutuhkan VPN untuk memulai sendiri setelah reboot, tambahkan layanan ke autorun:



# sudo systemctl enable openvpn@vpnsrv1


Selanjutnya, kami membuat konfigurasi klien. Sebelumnya, kami menempatkan semua kunci dan sertifikat di direktori ~ / client-configs / keys /.



Mari buat skrip yang akan mengumpulkan konfigurasi, kunci, dan sertifikat ke dalam satu file user.ovpn:



# cd ~/client-configs/
# vim configs-maker.sh

#!/bin/bash
# First argument: Client identifier
KEY_DIR=/home/dumasti/client-configs/keys
OUTPUT_DIR=/home/dumasti/client-configs/files
BASE_CONFIG=/home/dumasti/client-configs/base.conf
cat ${BASE_CONFIG} \
	<(echo -e '<ca>') \
	${KEY_DIR}/ca.crt \
	<(echo -e '</ca>\n<cert>') \
	${KEY_DIR}/${1}.crt \
	<(echo -e '</cert>\n<key>') \
	${KEY_DIR}/${1}.key \
	<(echo -e '</key>\n<tls-auth>') \
	${KEY_DIR}/ta.key \
	<(echo -e '</tls-auth>') \
	> ${OUTPUT_DIR}/${1}.ovpn


Skrip ini akan mengambil file dengan nama yang Anda berikan saat startup dan akan mengkonfigurasi satu file di direktori file.



Mari buat file tersebut dapat dieksekusi:



# chmod +x configs-maker.sh


Ayo jalankan:



# sudo ./configs-maker.sh dumasti


Sekarang kami mentransfer konfigurasi klien ke komputer Anda dari direktori / home / dumasti / client-configs / files /



Run VPN.



Untuk alasan keamanan, server yang menghosting CA harus dimatikan dan dihidupkan hanya untuk menandatangani sertifikat.



Kami tidak akan mengabaikan pencabutan sertifikat. Untuk mencabut sertifikat, kami pergi ke server CA tempat sertifikat ditandatangani dan melakukan hal berikut (Misalnya, kami akan mencabut sertifikat pengguna (dumasti) yang kami tanda tangani di server SubCA). Kami pergi ke server SubCA:



# cd ~/easyrsa/
# ./easyrsa revoke dumasti


Anda akan diminta untuk mengkonfirmasi pencabutan, masukkan "ya"



# ./easyrsa gen-crl


File crl.pem telah dibuat. Kita perlu meletakkannya di server OpenVPN dan menambahkan direktif dan jalur ke file di konfigurasi server:



# scp ~/easyrsa/pki/crl.pem user@ip_OpenVPN:/tmp


Pergi ke server OpenVPN:



# sudo mv /tmp/crl.pem /etc/openvpn/vpnsrv1/
# sudo vim /etc/openvpn/vpnsrv1.conf


Tambahkan baris berikut di mana kunci dan sertifikat ditulis:



crl-verify vpnsrv1/crl.pem


Mulai ulang openvpn:



# sudo systemctl restart openvpn@vpnsrv1


Sekarang klien dumasti tidak akan dapat terhubung ke VPN.



Terima kasih atas perhatian Anda!



All Articles