NỘI DUNG
Kết thúc nội dung Giải ngố Linux – Phần 10: Thiết lập Certificate Authority – CA trên Ubuntu 22.04 LTS, giờ là lúc tôi sẽ chuyển sang phần xử lý cho OpenVPN Server chạy trên Ubuntun 22.04 LTS như đã đề cập nhiều lần trước đó.
Do việc cấu hình và thiết lập OpenVPN Server khá lê thê, do vậy, tôi sẽ cần chia ra công tác này ra thành một số kỳ. Ở kỳ này, tôi sẽ tập trung vào việc tạo và ký certificate cho OpenVPN server/client với các đầu mục chính bao gồm:
- Cài đặt OpenVPN và Easy-RSA;
- Khởi tạo Public Key Infrastructure – PKI;
- Tạo Private key và Certificate request cho OpenVPN server/client;
- Ký các Certificate request cho OpenVPN Server/Client;
Ngoài ra, tôi cũng sẽ điều chỉnh tiêu đề cho phù hợp, vì từ kỳ này, các nội dung thực chất là phần cập nhật của bài Hướng dẫn tạo VPN Server miễn phí từ A đến Z – Phần 4: Tạo Private Key và ký Certificate cho VPN Server, VPN Client và cấu hình OpenVPN Server (và cũng có thể xem là phần tiếp theo của nội dung Bảo mật kết nối VPN – Phần 1: Đặc quyền khi tự quản lý VPN Server).
#1. Cài đặt OpenVPN và Easy-RSA
Quá trình cài cắm OpenVPN và Easy-RSA trên OpenVPN server khá đơn giản với các command:
sudo apt update
sudo apt install openvpn easy-rsa
Lưu ý: Mục đích cài đặt openvpn thì quá rõ ràng rồi. Còn vai trò của easy-rsa thì vẫn tương tự như kỳ trước, là công cụ để hỗ trợ quản lý Public Key Infrastructure – PKI.
#2. Khởi tạo Public Key Infrastructure – PKI cho OpenVPN
Và cũng tương tự kỳ trước, để phục vụ cho việc khởi tạo Public Key Infrastructure – PKI, trước hết tôi cần tạo thư mục easy-rsa. Sau đó tiến hành tạo symbolic link từ thư mục easy-rsa đến easy-rsa package files đã cài đặt ở Mục 1 ( /usr/share/easy-rsa/* trong trường hợp này).
mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Lưu ý: Vụ này tôi giới thiệu kỹ ở kỳ trước rồi nên không nhắc lại ở đây nữa. Nếu cần thiết, bạn có thể quay lại nội dung Giải ngố Linux – Phần 10: Thiết lập Certificate Authority – CA trên Ubuntu 22.04 LTS để xem cho rõ.
Tiếp tục, tôi tiến hành phân quyền tương ứng cho thư mục easy-rsa
chmod 700 ~/easy-rsa
ls -la ~/easy-rsa/

Tại thư mục easy-rsa, tôi cũng sẽ cần cập nhật nội dung tương ứng cho file vars. Với OpenVPN server, nội dung file vars sẽ tương đối gọn nhẹ hơn so với CA server.
cd ~/easy-rsa
nano vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
cat vars

Lưu ý:
- Liên quan đến Elliptic Curve – EC, tôi có đề cập các nội dung liên quan trong Giải ngố Blockchain – Phần 3: Nguyên lý cơ bản của Elliptic Curve Cryptography và vấn đề mã hóa, Giải ngố Cryptography – Phần 5: Elliptic Curve Cryptography (ECC) và ứng dụng trong Blockchain và Giải ngố Cryptography – Phần 4: Rivest–Shamir–Adleman (RSA), Diffie-Hellman (DH) và ứng dụng trong cấu hình OpenVPN;
- Liên đến sha512, tôi có đề cập các nội dung liên quan trong Giải ngố Cryptography – Phần 2: Đảm bảo Integrity với Hashing Algorithm.
Đến đây tôi đã có thể bắt đầu khởi tạo cái Public Key Infrastructure – PKI và kiểm tra kết quả với các command:
./easyrsa init-pki
ls -la pki

#3. Tạo Private key và Certificate request cho OpenVPN Server
Để tạo private key và certificate request cho OpenVPN server, tại thư mục easy-rsa tôi sẽ chạy command:
./easyrsa gen-req server
Quá trình xử lý tiếp theo sẽ yêu cầu tôi xác nhận (hoặc điều chỉnh) thông tin Common Name (tôi để tạm là server nhưng khi làm thật thì bạn nhớ đặt tên cho nghiêm chỉnh vào) và nhập passphrase tương ứng nhằm tăng mức độ bảo mật. Nhằm đơn giản hóa quá trình demo, tôi sẽ sử dụng option nopass để bỏ qua cái passphrase như phần minh hoạ sau đây.

Tôi xác nhận tình hình khởi tạo private key (server.key trong trường hợp bên dưới) và certificate request (server.req trong trường hợp bên dưới) với các command:
ls -la pki/private/
ls -la pki/reqs/
Tiếp theo, tôi hốt cái private key (server.key) vừa mới khởi tạo bỏ qua thư mục /etc/openvpn/server/.
sudo cp /home/test1/easy-rsa/pki/private/server.key /etc/openvpn/server/
Đến đây, tôi đã có thể mang cái server certificate request (server.req) sang cho CA server ký. Tuy nhiên, để thuận tiện, tôi sẽ tạo luôn cái client certificate request luôn rồi mới mang qua cho CA server ký.
#4. Tạo Private key và Certificate request cho OpenVPN client
Về cơ bản, tôi có thể tạo private key và certificate requets trên client machine rồi gửi qua cho CA server ký. Tuy nhiên, để tiện múc nhiều client mà không phải chuyển file tới lui nhiều lần, tôi có thể tạo script để xử lý kiểu “công nghiệp hóa, hiện đại hóa” trên OpenVPN server.
Với phương án này, tôi khởi tạo thư mục ~/client-configs/keys trên OpenVPN server để chứa key/certificate và thực hiện phân quyền tương ứng.
mkdir -p ~/client-configs/keys
Lưu ý: -p flag sẽ xử lý nested directories (tức là tạo thư mục cha nếu cần thiết)
chmod -R 700 ~/client-configs
Kế tiếp, tôi cũng quay lại thư mục easy-rsa để tạo client certificate request với Common Name tương ứng.
cd ~/easy-rsa
./easyrsa gen-req client1

Lưu ý: Tôi đặt đại Common Name là client1 cho nhanh. Tùy thuộc nhu cầu thực tế bạn nên đặt tên cho phù hợp, đừng phang đại theo kiểu tôi demo. Ngoài ra, ở trên tôi cũng sử dụng option nopass để demo cho nhanh.
Tương tự, tôi cũng copy cái client private key mới tạo client1.key bỏ qua ~/client-configs/keys.
cp pki/private/client1.key ~/client-configs/keys/
Đến đây, tôi đã sẵn sàng cho việc ký các certificate request trên CA server.
#5. Ký certificate request cho OpenVPN server/client
Quá trình này sẽ bao gồm các bước:
- Chuyển các certificate request của OpenVPN server (req) và client (client1.req) qua CA server;
- Import và sign các certificate request này trên CA server;
- Chuyển các signed certificate và CA server certificate (crt) về OpenVPN server.
- Bố trí signed certificate và CA server certificate (crt) vào vị trí phù hợp trên OpenVPN server.
#5.1 Chuyển các certificate request sang CA server
Ở đây có thể có nhiều phương án để chuyển file, nhưng vì đã thiết lập ssh đến CA server trước đó nên tôi có thể sử dụng command sau để đẩy hàng qua CA server (thư mục /tmp như minh họa bên dưới).
Chuyển server certificate request với command:
scp /home/test1/easy-rsa/pki/reqs/server.req test@192.168.64.133:/tmp
Tương tự, tôi cũng chuyển cái client certificate request với command sau:
scp /home/test1/easy-rsa/pki/reqs/client1.req test@192.168.64.133:/tmp
Lưu ý:
- Việc thiết lập ssh tôi đã đề cập trong nội dung Giải ngố Linux – Phần 9: Thiết lập firewall và cấu hình ssh trên Ubuntu 22.04 LTS;
- Bạn có thể chạy command để chuyển cùng lúc cả 2 cái certificate request. Ở đây tôi tách ra để tiện theo dõi (nhất là khi cần bổ sung thêm client);
- OpenVPN server và CA server mà tôi đang sử dụng demo là các Virtual Machines được thiết lập chung đường mạng nên tôi quất private IP nó vẫn chạy ầm ầm. Nếu chưa hình dung rõ thì bạn xem lại nội dung Giải ngố Linux – Phần 7: Cài đặt Ubuntu 22.04 LTS trên VMware;
- Trường hợp nếu OpenVPN server của bạn đang nằm chàng hảng ở trên đám Cloud nào đấy (ví dụ GCP, AWS), bạn có thể bay qua con CA server chạy scp command trỏ đến public IP tương ứng của OpenVPN server (với điều kiện đã thiết lập cho phép kết nối phù hợp).
#5.2 Import, sign các certificate request trên CA server và chuyển về OpenVPN server
Sau khi đẩy hàng đi, tôi cũng nhảy qua con CA server (ssh với user test) để kiểm tra với các command:
ssh test@192.168.64.133
cd ~/easy-rsa
ls -l /tmp
#5.2.1 Với OpenVPN server
Một khi đã xác nhận việc chuyển hàng thành công tốt đẹp, tôi tiến hành import và sign cái server certificate request vừa mới gửi sang với các command:
./easyrsa import-req /tmp/server.req server
./easyrsa sign-req server server

Lưu ý: Bạn sẽ cần xác nhận thông tin và cung cấp passphrase đã thiết lập tương ứng (nếu có).
Cái certificate đã được CA server ký (server.crt) sẽ nằm ở pki/issued. Tôi kiểm tra hàng lại với các command:
ls -l pki/issued/
ls -l pki | grep ca.crt
Kế đến, tôi sẽ hốt cái server.crt này và cả cái ca.crt mang về OpenVPN server.
scp pki/ca.crt test1@192.168.64.132:/tmp
scp pki/issued/server.crt test1@192.168.64.132:/tmp
#5.2.2 Với OpenVPN client
Tương tự, một khi đã xác nhận việc chuyển hàng thành công tốt đẹp, tôi tiến hành import và sign cái client certificate request vừa mới gửi sang với các command:
./easyrsa import-req /tmp/client1.req client1
./easyrsa sign-req client client1

Sau đó gửi cái certificate đã được CA server ký (client1.crt) mang về OpenVPN server.
scp pki/issued/client1.crt test1@192.168.64.132:/tmp
# 5.3 Bố trí các signed certificate và CA server certificate (ca.crt) trên OpenVPN server
Xong việc trên CA server, tôi quay xe nhảy về OpenVPN server để bố trí hàng đã nhận được vào các vị trí thích hợp.
Với OpenVPN server, tôi sẽ cần hốt 2 cái file tương ứng là server.crt và ca.crt bỏ vô thư mục /etc/openvpn/server.
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Với OpenVPN client, tôi sẽ cần hốt 2 cái file tương ứng là client1.crt và ca.crt bỏ vô ~/client-configs/keys.
cp /tmp/{client1.crt,ca.crt} ~/client-configs/keys/
Đến đây coi như tôi đã hoàn thành công tác tạo và ký các certificate cho OpenVPN server/client. Kỳ tới tôi sẽ bắt đầu chuyển sang nội dung thiết lập cấu hình cho OpenVPN server.
1 thought on “Bảo mật kết nối VPN – Phần 2: Tạo và ký certificate cho OpenVPN server/client trên Ubuntu 22.04 LTS”