Vấn đề với các cổng (port) mở
Log SSH của tôi từng là một mớ hỗn độn. Mỗi sáng, tôi thường cuộn qua hàng trăm nỗ lực đăng nhập thất bại từ các botnet ở những nơi trên thế giới mà tôi chưa từng đặt chân đến. Quy trình tiêu chuẩn của tôi thường là mở một cổng, cấu hình Nginx và cầu nguyện rằng Fail2Ban sẽ chặn được những kẻ xấu. Tôi nhận ra rằng đừng để các công cụ nội bộ bị lộ là cách tốt nhất để bảo vệ hệ thống. Sau sáu tháng chạy OpenZiti, những bản log đó cuối cùng đã im hơi lặng tiếng. Tôi đã không phải chạm vào một quy tắc tường lửa nào trong nửa năm qua, nhưng các dịch vụ của tôi vẫn dễ dàng truy cập hơn bao giờ hết.
Bảo mật truyền thống dựa trên mô hình ‘lâu đài và hào nước’. Bạn xây dựng một bức tường dày (tường lửa) nhưng lại để hở một cổng cho Port 443 hoặc 22. Vấn đề rất đơn giản: nếu một cổng mở cho bạn, nó cũng mở cho tất cả mọi người, dễ dẫn đến các cuộc tấn công brute-force. OpenZiti đảo ngược kịch bản này. Nó tạo ra các dịch vụ ‘tối’ (dark services) không hề lắng nghe trên một IP công cộng nào cả. Thay vào đó, chúng chủ động kết nối ra một mạng lưới (fabric) bảo mật. Nếu Shodan hoặc Nmap quét IP của bạn, chúng sẽ không thấy gì ngoài một bức tường kỹ thuật số vững chãi.
So sánh các phương pháp: VPN truyền thống và OpenZiti
Trước khi chuyển sang dùng OpenZiti, tôi dựa vào WireGuard. Nó nhanh, nhưng vẫn yêu cầu một đầu của đường hầm phải có một cổng UDP công cộng có thể truy cập được. Nếu ai đó tìm thấy cổng đó, bạn vẫn là mục tiêu của các cuộc tấn công DDoS. OpenZiti loại bỏ hoàn toàn yêu cầu ‘lắng nghe’ đó, nâng cao mức độ bảo mật Linux thời gian thực.
| Tính năng | VPN truyền thống (WireGuard) | OpenZiti (Zero Trust) |
|---|---|---|
| Cổng vào (Inbound Ports) | Bắt buộc (UDP/TCP) | Không có (Chỉ Outbound) |
| Kiểm soát truy cập | Toàn mạng (Dựa trên IP) | Chi tiết (Dựa trên định danh) |
| Bề mặt tấn công | Được giảm thiểu | Được loại bỏ (Ẩn mình) |
| Sử dụng tài nguyên | Rất thấp | Thấp (~50MB RAM cho các tunneler) |
Bài học sau sáu tháng vận hành thực tế
Những điểm cộng
- Không còn log rác: Log xác thực của tôi hiện tại thực sự có thể đọc được. Vì không có cổng 22 công cộng nào bị lộ, tôi đã thấy các nỗ lực tấn công brute-force giảm 100%.
- Đúng chuẩn Đặc quyền tối thiểu: Tôi có thể cấp quyền cho một đối tác truy cập vào một instance PostgreSQL cụ thể trên cổng 5432 mà không cho phép họ chạm vào bất kỳ thứ gì khác trên máy chủ.
- Sự linh hoạt của mạng: Máy tính xách tay của tôi kết nối theo cùng một cách cho dù tôi đang dùng cáp quang tại nhà hay Wi-Fi chập chờn ở quán cà phê. Kết nối được gắn chặt với một định danh mã hóa, không phải một địa chỉ IP tạm thời.
Những rào cản
- Thay đổi tư duy: Bạn phải ngừng suy nghĩ về địa chỉ IP và bắt đầu nghĩ về Dịch vụ (Services) và Định danh (Identities). Tôi đã mất khoảng bốn ngày để bỏ thói quen tìm đến
iptablestheo phản xạ. - Quản lý PKI: Quản lý chứng chỉ và khóa là xương sống của hệ thống. Nếu bạn làm mất root CA của bộ điều khiển (controller), bạn sẽ phải tốn cả một buổi chiều dài để xây dựng lại mọi thứ.
Kiến trúc thiết lập khuyến nghị
Để có một mạng ‘ẩn danh’ tin cậy, tôi đề xuất cách tiếp cận ba tầng:
- Bộ điều khiển (The Controller): Đóng vai trò như tháp điều khiển không lưu cho mạng của bạn. Nó quản lý các định danh và thực thi các chính sách. Tôi chạy bộ điều khiển của mình trên một VPS giá 5 USD/tháng.
- Edge Router: Đây là điểm nhập vào mạng lưới fabric của bạn. Đối với các thiết lập nhỏ, bạn có thể lưu trữ nó trên cùng một VPS với bộ điều khiển.
- Tunneler: Một agent nhẹ (ziti-edge-tunnel) chạy trên máy chủ và các thiết bị khách của bạn.
Khi tôi thiết lập Ziti Controller, tôi đã sử dụng trình tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator để tạo các khóa quản trị có độ hỗn loạn (entropy) cao. Vì nó tạo các chuỗi ký tự cục bộ ngay trong trình duyệt, đây là một cách an toàn để xử lý các thông tin xác thực phức tạp cần thiết cho cơ sở dữ liệu và tài khoản quản trị mà không rủi ro bị lộ trên mạng.
Triển khai: Thiết lập mạng ẩn danh của bạn
Chúng ta sẽ sử dụng phương pháp ‘Cài đặt nhanh’ (Express Install). Đây là con đường đơn giản nhất cho người dùng Ubuntu 22.04 hoặc 24.04 LTS.
Bước 1: Cài đặt OpenZiti CLI
Trước tiên hãy tải các công cụ quản lý. Chạy lệnh này trên máy chủ dự định làm bộ điều khiển:
curl -sS https://get.openziti.io/install.sh | sudo bash
export PATH=$PATH:$HOME/.ziti/bin
Bước 2: Khởi chạy Fabric
Script Quickstart sẽ tự động hóa việc tạo chứng chỉ tẻ nhạt và thiết lập định tuyến. Nó giúp tiết kiệm rất nhiều thời gian.
# Sử dụng DNS công cộng hoặc IP của máy chủ của bạn
export ZITI_CTRL_ADVERTISED_ADDRESS=ziti.yourdomain.com
source /dev/stdin <<< "$(curl -sS https://get.openziti.io/quickstart/express-install.sh)"
Lưu lại các thông tin xác thực quản trị mà script hiển thị. Bạn sẽ cần chúng để quản lý mạng sau này. Lệnh này sẽ tự động khởi tạo cả Controller và một Edge Router.
Bước 3: Tạo các định danh (Identity)
Tiếp theo, chúng ta cần hai “hộ chiếu kỹ thuật số”: một cho máy chủ ứng dụng và một cho máy tính xách tay của bạn.
# Xác thực với bộ điều khiển (controller)
ziti edge login $ZITI_CTRL_ADVERTISED_ADDRESS:1280 -u $ZITI_USER -p $ZITI_PWD
# Tạo các định danh
ziti edge create identity device app-server-node -o app-server.jwt
ziti edge create identity user my-laptop -o laptop.jwt
Các tệp .jwt là các mã đăng ký một lần. Hãy chuyển tệp app-server.jwt sang máy chủ của bạn và laptop.jwt sang máy trạm của bạn một cách an toàn.
Bước 4: Ẩn máy chủ ứng dụng
Trên máy chủ bạn muốn bảo vệ, hãy cài đặt tunneler. Agent này tạo một kết nối chỉ-đi-ra (outbound-only) tới fabric. Không cần quy tắc tường lửa cho chiều vào (inbound) nào cả.
sudo apt update && sudo apt install ziti-edge-tunnel
# Đăng ký thiết bị
sudo ziti-edge-tunnel enroll --jwt app-server.jwt --identity /var/lib/ziti/app-server.json
Bước 5: Định nghĩa dịch vụ
Đây là nơi chúng ta ánh xạ kết nối. Chúng ta đang báo cho OpenZiti rằng một dịch vụ tồn tại trên ‘app-server-node’ (cục bộ tại cổng 8080), nhưng chúng ta muốn máy tính xách tay của mình nhìn thấy nó dưới tên internal.dashboard.ziti.
# Tạo mục nhập dịch vụ
ziti edge create service my-private-app
# Định nghĩa nơi ứng dụng chạy (The Bind)
ziti edge create config app-host.v1 host.v1 '{"protocol":"tcp", "address":"localhost", "port":8080}'
# Định nghĩa cách client truy cập (The Intercept)
ziti edge create config app-client.v1 intercept.v1 '{"protocols":["tcp"], "addresses":["internal.dashboard.ziti"], "portRanges":[{"low":80, "high":80}]}'
# Áp dụng các chính sách truy cập
ziti edge create service-policy app-bind Bind --identity-roles "#app-server-node" --service-roles "#my-private-app"
ziti edge create service-policy app-dial Dial --identity-roles "#my-laptop" --service-roles "#my-private-app"
Kiểm tra kết nối ẩn
Cài đặt OpenZiti Desktop Edge trên máy tính xách tay của bạn và nhập tệp laptop.jwt. Bây giờ, hãy mở trình duyệt và truy cập http://internal.dashboard.ziti.
Cảm giác thật kỳ diệu, nhưng thực chất đó chỉ là định tuyến thông minh. Tường lửa của máy chủ vẫn đang chặn mọi kết nối vào. Nếu bạn thử quét IP công cộng của máy chủ, nó sẽ hiển thị như thể máy chủ thậm chí không trực tuyến. Tuy nhiên, trình duyệt của bạn vẫn tải trang dashboard ngay lập tức.
Chuyển sang OpenZiti đã thay đổi căn bản tư thế bảo mật của tôi. Bằng cách loại bỏ ‘cửa trước’ của máy chủ, tôi đã loại bỏ toàn bộ một danh mục các cuộc tấn công tự động. Việc gia cố bảo mật dịch vụ đòi hỏi nhiều công sức hơn một đường hầm SSH cơ bản, nhưng sự an tâm mà nó mang lại hoàn toàn xứng đáng với 15 phút thiết lập.

