Nỗi phiền toái mang tên “Your connection is not private”
Sau khi audit bảo mật cho hơn 10 server nội bộ tại một dự án cũ, mình phát hiện ra một thực trạng: 90% anh em vẫn dùng HTTP cho các dashboard quản lý hoặc dùng chứng chỉ tự ký (self-signed). Vấn đề là chẳng ai nhớ nổi ngày hết hạn để gia hạn chúng.
Mỗi lần truy cập vào trang quản trị mà trình duyệt hiện dấu gạch chéo đỏ lòm, cảm giác rất thiếu chuyên nghiệp. Tuy nhiên, dùng Let’s Encrypt trong mạng nội bộ lại cực kỳ phiền phức. Bạn phải cấu hình DNS-01 challenge hoặc mở port ra Internet – điều mà các hệ thống Isolated Network không cho phép. Đó là lúc mình tìm đến step-ca.
So sánh các phương án quản lý SSL nội bộ
Mình đã từng thử qua nhiều cách trước khi chốt phương án cuối cùng. Dưới đây là những gì mình rút ra:
1. OpenSSL (Làm thủ công)
Đây là cách truyền thống: tạo Root CA rồi dùng nó để ký Certificate Signing Request (CSR).
- Ưu điểm: Không cần cài server phức tạp.
- Nhược điểm: Cực hình khi quản lý. Nếu bạn có 50 microservices, việc nhớ ngày hết hạn để ký tay từng cái là nhiệm vụ bất khả thi và rất dễ sai sót.
2. HashiCorp Vault (Dành cho Enterprise)
Vault có PKI engine rất mạnh và API đầy đủ.
- Ưu điểm: Bảo mật cấp độ doanh nghiệp, tính năng cực kỳ đồ sộ.
- Nhược điểm: Quá nặng nề. Setup một cụm Vault Cluster chỉ để cấp SSL cho vài server nội bộ giống như dùng máy cày để đi chợ vậy.
3. Smallstep (step-ca) – Sự lựa chọn cân bằng
Đây là giải pháp mình đang áp dụng cho các dự án quy mô vừa và Homelab cá nhân.
- Ưu điểm: Hỗ trợ giao thức ACME y hệt Let’s Encrypt. Nó giúp tự động hóa 100% việc cấp phát và gia hạn thông qua CLI cực kỳ mượt mà.
- Nhược điểm: Bạn tốn thêm một tài nguyên nhỏ (VPS hoặc Container) để duy trì dịch vụ CA.
Tại sao step-ca lại đáng dùng?
Điểm ăn tiền của step-ca nằm ở chỗ nó đánh lừa được các công cụ như Nginx hay Caddy. Các web server này tưởng rằng chúng đang nói chuyện với Let’s Encrypt, nhưng thực tế là đang kết nối với server CA nằm ngay trong mạng LAN của bạn. Bạn có được sự tiện lợi của tự động hóa mà không cần mở bất kỳ port nào ra ngoài Internet.
Hướng dẫn triển khai step-ca chi tiết
Bước 1: Cài đặt step-cli
Đầu tiên, bạn cần bộ công cụ dòng lệnh step. Trên Ubuntu, hãy chạy các lệnh sau:
wget https://github.com/smallstep/cli/releases/download/v0.24.4/step-cli_0.24.4_amd64.deb
sudo dpkg -i step-cli_0.24.4_amd64.deb
Tiếp theo là cài đặt server chính:
wget https://github.com/smallstep/certificates/releases/download/v0.24.2/step-ca_0.24.2_amd64.deb
sudo dpkg -i step-ca_0.24.2_amd64.deb
Bước 2: Khởi tạo Certificate Authority
Chạy lệnh khởi tạo và điền thông tin theo hướng dẫn:
step ca init
Hãy lưu ý các thông số quan trọng:
- Deployment Type: Chọn
Standalone. - CA Name: Ví dụ:
Lab-Internal-CA. - DNS Names: Nhập IP hoặc Domain của server CA (ví dụ:
ca.internal.lan). - Password: Tuyệt đối không được quên mật khẩu này vì nó dùng để bảo vệ Root Key.
Bước 3: Vận hành CA Server
Bạn có thể kích hoạt CA bằng lệnh:
step-ca $(step path)/config/ca.json
Kinh nghiệm thực tế: Hãy setup nó như một systemd service. Đừng bao giờ chạy tạm trong tmux, vì nếu server crash mà bạn không biết, toàn bộ việc gia hạn SSL sau này sẽ thất bại.
Bước 4: Cài đặt Root Certificate
Để trình duyệt không báo lỗi, bạn phải cài file root_ca.crt vào máy khách. File này nằm tại ~/.step/certs/root_ca.crt.
Cách nhanh nhất trên máy Linux khác là dùng lệnh:
step certificate install root_ca.crt
Tự động hóa hoàn toàn với ACME
Để không phải gõ lệnh mỗi khi có service mới, hãy bật tính năng ACME:
step ca provisioner add acme --type ACME
Nếu bạn dùng Caddy, cấu hình sẽ cực kỳ gọn nhẹ như thế này:
app.internal.lan {
reverse_proxy localhost:8080
tls {
ca https://ca.internal.lan:9000/acme/acme/directory
ca_root /path/to/root_ca.crt
}
}
Caddy sẽ tự động lo liệu việc lấy cert và gia hạn. Bạn có thể yên tâm kê cao gối ngủ mà không lo chứng chỉ hết hạn vào lúc nửa đêm.
Lưu ý quan trọng khi quản lý CA nội bộ
Sau một thời gian vận hành, mình rút ra 3 bài học lớn:
- Sao lưu Root Key: Mất Root Key đồng nghĩa với việc bạn phải cài lại toàn bộ CA và đi trust lại từng máy khách. Hãy cất nó trong Bitwarden hoặc USB an toàn.
- Điều chỉnh thời hạn: Mặc định
step-cachỉ cấp cert có thời hạn 24 giờ để tăng tính bảo mật. Nếu hệ thống auto-renew của bạn chưa ổn định, hãy tăng lên 90 ngày trong fileca.json. - Bảo mật server CA: Đây là trái tim của hệ thống. Hãy hạn chế SSH và đóng mọi port không cần thiết. Nếu CA bị chiếm quyền, kẻ tấn công có thể giả mạo bất kỳ domain nào trong mạng của bạn.
Tổng kết
Xây dựng một CA nội bộ không hề khó nếu bạn chọn đúng công cụ. step-ca không chỉ giúp hệ thống chuyên nghiệp hơn mà còn giải quyết triệt để các vấn đề bảo mật trong mạng LAN. Nếu bạn đang quản lý Homelab hoặc hệ thống nội bộ công ty, hãy thử triển khai ngay nhé.
