Server ứng dụng và database không nhất thiết phải mở SSH trực tiếp ra Internet. Với OpenSSH ProxyJump, máy quản trị kết nối tới một bastion công khai, rồi dùng kênh đó để mở TCP tới máy đích trong mạng private. Người dùng vẫn gõ một lệnh SSH; private key của máy đích không cần được chép lên bastion.
Bastion thu hẹp điểm vào mạng nhưng đồng thời trở thành tài sản nhạy cảm. Hướng dẫn này xây dựng cấu hình tối thiểu, tách danh tính giữa hai hop, xác minh host key và giới hạn những đích mà bastion được phép chuyển tiếp.
1. ProxyJump hoạt động thế nào?
Tùy chọn -J là dạng ngắn của directive ProxyJump. Theo tài liệu ssh(1), client trước tiên tạo kết nối SSH tới jump host, sau đó yêu cầu một TCP forwarding từ jump host tới máy đích. Trên kết nối TCP đó, client cục bộ thực hiện một phiên SSH độc lập với máy đích.
- Hop 1: laptop xác thực bastion và kiểm tra host key của bastion.
- Hop 2: chính SSH client trên laptop xác thực máy đích và kiểm tra host key của máy đích.
- Bastion biết địa chỉ/port đích và chuyển byte, nhưng phiên SSH tới máy đích vẫn được mã hóa end-to-end giữa client và máy đích.
- ProxyJump không tự động bật agent forwarding.
ProxyJump là đường truyền qua trung gian, không phải lệnh “SSH vào bastion rồi SSH tiếp”. Vì vậy không cần lưu private key của máy đích trên bastion.
2. Mô hình mạng mẫu
| Thành phần | Địa chỉ ví dụ | Luồng được phép |
|---|---|---|
| Máy quản trị | Internet/VPN của quản trị viên | TCP 22 tới bastion |
| Bastion | bastion.example.net | TCP 22 tới server private đã phê duyệt |
| App private | 10.20.1.15 | Nhận SSH chỉ từ bastion |
Security group/firewall của máy đích nên chỉ nhận SSH từ IP hoặc security identity của bastion, không nhận toàn Internet. Egress của bastion cũng nên giới hạn tới subnet/host/port quản trị cần thiết.
3. Thử kết nối một lần với -J
ssh -J jumpadmin@bastion.example.net deploy@10.20.1.15Nếu bastion dùng port khác:
ssh -J jumpadmin@bastion.example.net:2222 deploy@10.20.1.15Nhiều jump host có thể được phân cách bằng dấu phẩy, nhưng mỗi hop làm tăng độ phức tạp vận hành. Trước khi thêm hop thứ hai, hãy xem lại segmentation, VPN hoặc access proxy có phù hợp hơn không.
4. Cấu hình ~/.ssh/config dễ bảo trì
Host bastion-prod
HostName bastion.example.net
User jumpadmin
Port 22
IdentityFile ~/.ssh/id_ed25519_bastion
IdentitiesOnly yes
ForwardAgent no
Host app-private
HostName 10.20.1.15
User deploy
IdentityFile ~/.ssh/id_ed25519_app
IdentitiesOnly yes
ProxyJump bastion-prod
ForwardAgent no
ServerAliveInterval 30
ServerAliveCountMax 3Sau đó chỉ cần:
ssh app-privateIdentitiesOnly yes giúp client chỉ thử identity đã khai báo, tránh gửi hàng loạt public key từ agent và chạm MaxAuthTries. Dùng hai key khác nhau làm giảm blast radius nếu một key bị thu hồi hoặc lộ.
5. Không bỏ qua host key
Lần đầu kết nối, SSH có thể hỏi xác nhận host key cho cả bastion và máy đích. So sánh fingerprint qua kênh tin cậy, hoặc phân phối known_hosts bằng configuration management/SSH host certificate.
- Không đặt
StrictHostKeyChecking nođể “chạy cho được”. - Automation nên có host key được provision trước và dùng
BatchMode yesđể fail thay vì chờ prompt. - Khi host được cài lại, xác minh thay đổi fingerprint trước khi xóa entry cũ.
- Tên alias trong config không làm bastion và target dùng chung trust record; mỗi máy có host key riêng.
6. DNS của máy private được phân giải ở đâu?
Với ProxyJump, jump host mở kết nối TCP tới tên/địa chỉ target mà client yêu cầu. Vì thế hostname nội bộ thường phải phân giải được từ bastion. Nếu laptop không biết DNS private nhưng bastion biết, cấu hình sau vẫn có thể hoạt động:
Host app-private
HostName app01.internal.example
ProxyJump bastion-prodNếu lỗi Name or service not known xuất hiện ở hop chuyển tiếp, kiểm tra resolver và route từ bastion. Không thêm hostname private vào DNS công khai chỉ để sửa lỗi kết nối.
7. Agent forwarding: thường không cần
ssh -A chuyển socket của agent tới server từ xa. Bastion bị chiếm quyền có thể lợi dụng socket đang forward để yêu cầu agent ký trong thời gian phiên tồn tại. Private key không bị sao chép trực tiếp, nhưng khả năng sử dụng key vẫn có thể bị lạm dụng.
ProxyJump cho phép client cục bộ dùng key riêng cho target nên hãy giữ ForwardAgent no. Nếu workflow bắt buộc agent forwarding, giới hạn thời gian/key, dùng confirmation hoặc hardware-backed key và chỉ bật cho host cụ thể—không bật toàn cục bằng Host *.
8. Giới hạn forwarding trên bastion
sshd_config(5) hỗ trợ AllowTcpForwarding, PermitOpen, AllowAgentForwarding và DisableForwarding. Một account chuyên làm jump có thể được giới hạn như sau:
Match User jumpadmin
AllowTcpForwarding local
PermitOpen 10.20.1.15:22 10.20.1.16:22
AllowAgentForwarding no
X11Forwarding no
PermitTTY noDisableForwarding yes sẽ chặn luôn chức năng mà ProxyJump cần, nên không dùng cho account jump. AllowTcpForwarding một mình không phải sandbox hoàn chỉnh nếu user vẫn có shell; kết hợp account chuyên dụng, hạn chế shell/session, firewall egress và key options.
Trong authorized_keys, có thể áp dụng option như restrict, rồi bật lại đúng port-forwarding và giới hạn permitopen="host:port" cho từng key. Luôn kiểm thử trên một phiên SSH khác trước khi reload để tránh tự khóa quyền truy cập.
9. Harden bastion ở mức hệ thống
- Chỉ cho phép public-key authentication; vô hiệu đăng nhập root trực tiếp.
- Giới hạn nguồn vào bằng VPN, IP allowlist hoặc access layer phù hợp.
- Tách account theo người dùng; không chia sẻ một private key chung.
- Cập nhật OpenSSH/OS, bật audit log và đồng bộ thời gian.
- Dùng
AllowUsers/AllowGroups, rate limiting và công cụ phát hiện brute force phù hợp. - Không đặt source code, secret triển khai hoặc dữ liệu lâu dài trên bastion.
- Giám sát login, forwarding bất thường và kết nối egress ngoài danh sách.
- Chuẩn bị đường quản trị khẩn cấp đã kiểm soát thay vì nới firewall khi sự cố.
10. SCP, SFTP, rsync và Git qua ProxyJump
Các công cụ dùng OpenSSH có thể tái sử dụng alias:
scp release.tar.gz app-private:/tmp/
sftp app-private
rsync -av --delete ./build/ app-private:/srv/app/Với Git SSH, có thể dùng alias host trong remote nếu server Git là target. Hãy kiểm tra công cụ có thực sự đọc cùng file SSH config; một số thư viện SSH nhúng không hỗ trợ toàn bộ directive OpenSSH.
11. Debug theo từng lớp
- Kiểm tra kết nối trực tiếp tới bastion:
ssh -v bastion-prod. - Xem cấu hình đã resolve:
ssh -G app-private. - Chạy đầy đủ log:
ssh -vvv app-private; không đăng log chứa thông tin nội bộ lên kênh công khai. - Từ bastion, kiểm tra route/DNS/TCP tới target bằng công cụ read-only phù hợp.
- Kiểm tra log
sshdtrên bastion và target. - Xác nhận firewall inbound của target và egress của bastion.
| Triệu chứng | Khả năng | Điểm kiểm tra |
|---|---|---|
| Bastion timeout | Firewall/DNS/port công khai | Máy quản trị → bastion |
administratively prohibited | Forwarding hoặc PermitOpen chặn | sshd_config/key option trên bastion |
| Target timeout | Route/egress/inbound sai | Bastion → target:22 |
Too many authentication failures | Client thử quá nhiều key | IdentitiesOnly/IdentityFile |
| Host key changed | Máy cài lại hoặc nguy cơ MITM | Xác minh fingerprint ngoài băng |
12. Lưu ý cho automation
Host app-private-ci
HostName 10.20.1.15
User deploy
ProxyJump bastion-prod
IdentityFile ~/.ssh/id_ed25519_app_ci
IdentitiesOnly yes
BatchMode yes
ConnectTimeout 10
StrictHostKeyChecking yesCI secret phải thuộc cơ chế quản lý bí mật, có vòng đời ngắn nếu hạ tầng hỗ trợ và quyền nhỏ nhất. Không in ssh -vvv mặc định trong log CI. Tách key automation khỏi key con người, thu hồi độc lập và audit từng principal.
Checklist triển khai
- Target không mở SSH trực tiếp ra Internet.
- Bastion chỉ nhận kết nối từ nguồn quản trị cần thiết.
- Key bastion và target tách riêng; không chép private key lên bastion.
- Agent forwarding tắt mặc định.
- Host key của hai hop được xác minh.
PermitOpenvà firewall egress giới hạn đúng target:port.- Account jump không có quyền thừa.
- Log, cảnh báo và quy trình thu hồi key đã được kiểm thử.
- Có phiên dự phòng khi thay đổi
sshd_configvà đã chạysshd -t.
Kết luận
ProxyJump giúp giữ server private khỏi Internet mà vẫn cho quản trị viên trải nghiệm SSH trực tiếp. Giá trị bảo mật chỉ xuất hiện khi bastion được coi là một cổng truy cập đặc quyền: hai hop có key và host key riêng, agent forwarding tắt, forwarding bị giới hạn, firewall chỉ mở đúng luồng và mọi thay đổi đều có audit. Bắt đầu với cấu hình đơn giản, kiểm tra từng lớp rồi mới thêm automation hoặc nhiều hop.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.