SSH đảo ngược cho một thiết bị: bộ lắng nghe loopback hay VPN có định tuyến?
Một cổng quản trị duy nhất cho thiết bị chỉ có thể gọi ra ngoài. Ba điều kiện quyết định liệu đường hầm đảo ngược có đủ hay bạn cần một đường dẫn định tuyến thật sự.
Thiết bị của bạn nằm sau NAT của nhà mạng, có thể mở các kết nối đi ra và chạy một máy chủ SSH mà không ai chạm tới được. Yêu cầu gửi đến thường được diễn đạt là "cho nó một VPN", đó là một trong nhiều câu trả lời. Trước khi chấp nhận, hãy quyết định bạn cần một cổng TCP quản trị hay một đường dẫn định tuyến tới cả một mạng con, vì đó là những dự án khác nhau với mức phơi nhiễm khác nhau.
Đường hầm đảo ngược trả lời tốt cho phiên bản hẹp. Thiết bị gọi tới hub của bạn, nhờ hub lắng nghe trên một cổng loopback và chuyển tiếp cổng đó về dịch vụ SSH của chính nó. Sau đó quản trị viên tiếp cận bộ lắng nghe qua hub, chứ không qua internet công cộng.
Ba điều kiện quyết định lựa chọn
Hãy ghi chúng ra trước mọi cấu hình. Chúng là ranh giới giữa một lối vào quản trị có giới hạn và một sự mở rộng mạng, và trộn lẫn chúng chính là cách một đường hầm năm dòng trở thành một mạng phẳng không chủ.
| Condition | Reverse tunnel fits | Something else is needed |
|---|---|---|
| How many services must be reachable? | One, or a small fixed set on loopback | Anything that needs many ports or dynamic discovery |
| Who connects, and how are they authenticated? | Named administrators with their own hub accounts | Third parties, or anything needing per-flow audit you do not control |
| Does the device's own LAN need to be reachable? | No | Yes, so a routed VPN or a managed platform is the honest answer |
Hàng thứ ba là hàng người ta tranh luận. Một đường hầm tới cổng SSH của thiết bị không đưa các thiết bị lân cận vào mạng của bạn, và không nên làm cho nó có vẻ như vậy qua một chuỗi chuyển tiếp thêm. Nếu yêu cầu thực sự là LAN, hãy nói ra và thiết kế chính nó thay vào đó.
Phía hub: một tài khoản chuyển tiếp có giới hạn
Cấp cho mỗi thiết bị tài khoản chuyển tiếp riêng với xác thực bằng khóa công khai và không có phiên tương tác. Match khối được giới hạn cho tài khoản đó giữ quyền hạn nhỏ, và khóa riêng vẫn ở trên thiết bị nơi nó thuộc về.
Match User relay-dev-7
AuthenticationMethods publickey
PubkeyAuthentication yes
AllowTcpForwarding remote
PermitListen 127.0.0.1:21022
GatewayPorts no
MaxSessions 0
PermitTTY no
X11Forwarding no
AllowAgentForwarding no
MaxSessions 0 là dòng đáng chú ý. Nó từ chối các phiên shell và hệ thống con trong khi vẫn cho phép chuyển tiếp mà thiết bị cần, nên một khóa bị đánh cắp không thể biến thành đăng nhập tương tác. PermitListen ghim địa chỉ và cổng của bộ lắng nghe ở phía hub, và GatewayPorts no giữ nó trên loopback thay vì mở nó cho mạng nơi hub đặt.
Hãy kiểm tra cấu hình hiệu lực trước khi nạp lại, và giữ một phiên thứ hai mở trong lúc làm việc đó. Match khối vô tình áp dụng cho mọi người, hoặc lỗi đánh máy trong tên tùy chọn, là cách kinh điển để tự khóa mình ra khỏi chiếc máy bạn đang gia cố. Hãy kết xuất cấu hình đang chạy và đọc lại các tùy chọn thay vì tin vào tệp bạn vừa viết. Lưu ý rằng hỗ trợ tùy chọn khác nhau giữa các bản dựng, nên một dòng được máy chủ mới hơn chấp nhận có thể bị máy cũ hơn bỏ qua đơn giản.
Phía thiết bị: chuyển tiếp thất bại ầm ĩ
Thiết bị mở kết nối và yêu cầu bộ lắng nghe. Hai địa chỉ trong đối số -R mang nghĩa khác nhau, và đọc chúng từ trái sang phải là cách nhanh nhất để nhớ cái nào là cái nào.
ssh -NT \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-R 127.0.0.1:21022:127.0.0.1:22 \
[email protected]
Cặp bên trái là nơi hub nên lắng nghe. Cặp bên phải là nơi thiết bị kết nối tới khi có yêu cầu đến, được phân giải từ phía chính thiết bị. Đổi chỗ chúng tạo ra một đường hầm dựng lên sạch sẽ và chuyển tiếp sai chỗ, điều tệ hơn cả thất bại.
ExitOnForwardFailure=yes buộc lệnh thoát khi không thể thiết lập bộ lắng nghe được yêu cầu, nên vòng lặp khởi động lại nói cho bạn sự thật thay vì để lại một phiên chỉ chạy một nửa. Nó không nói gì về việc dịch vụ SSH cục bộ có khỏe về sau hay không, nên hãy ghép nó với một trình quản lý tiến trình và một bài kiểm tra kết nối thật thỉnh thoảng.
Đừng bao giờ thay địa chỉ lắng nghe loopback bằng ký tự đại diện để tránh thêm một bước nhảy. Chính thay đổi duy nhất đó là khác biệt giữa một đường quản trị và một cổng ai cũng chạm tới được, và nó thường xảy ra khi gỡ lỗi rồi ở lại. Nếu đồng nghiệp không tới được cổng qua hub, hãy sửa cấu hình nhảy thay vì mở rộng ràng buộc. Loopback là toàn bộ lập luận bảo mật của thiết kế này.
Quyền truy cập của quản trị viên qua hub
Một quản trị viên có tài khoản thường trên hub có thể nhảy qua nó tới cổng được chuyển tiếp. Tài khoản chuyển tiếp không được dùng cho việc này, và đó chính là lý do giữ chúng tách biệt.
ssh -J [email protected] -o HostKeyAlias=device-7 \
-p 21022 [email protected]
Hãy xác minh khóa máy chủ của thiết bị dưới bí danh bạn đã chọn, vì khóa đó nhận dạng thiết bị ở cuối chuỗi và đường hầm chỉ là vận chuyển. Đăng nhập đầu-cuối vẫn xác thực cả hai đầu; một đường hầm kết thúc trên hub dùng chung không tự nó biến nó thành đường tin cậy.
Hãy sở hữu vòng đời
Chạy lệnh của thiết bị dưới một trình quản lý tiến trình với đúng một phiên bản đang hoạt động và một chính sách khởi động lại bạn đã chọn có chủ ý. Các tùy chọn keepalive phát hiện đối tác đã chết; chúng không làm sống lại tiến trình đã thoát.
Sau đó viết thủ tục ngừng sử dụng. Mỗi thiết bị có bộ lắng nghe riêng và khóa riêng, nên ngừng sử dụng nghĩa là thu hồi tài khoản đó và xóa khóa đó, không phải xoay một bí mật dùng chung cho cả đội.
Cuối cùng, hãy nhớ loopback mang lại cho bạn điều gì. Nó giới hạn phơi nhiễm mạng và không làm gì với những người dùng cục bộ khác trên một hub dùng chung, nên chính sách truy cập của hub vẫn phải đúng. Tài liệu tham khảo sshd_config ghi lại từng tùy chọn được dùng ở trên, và đáng để đọc trọn các phần chuyển tiếp trước khi mở rộng bất kỳ phần nào trong đó.