Làm cách nào để hạn chế các cổng điều chỉnh SSH ngược?


9

Chúng tôi có một máy chủ công cộng chấp nhận kết nối SSH từ nhiều khách hàng phía sau tường lửa.

Mỗi khách hàng này tạo một đường hầm Reverse SSH bằng cách sử dụng ssh -Rlệnh từ máy chủ web của họ tại cổng 80 đến máy chủ công cộng của chúng tôi.

Cổng đích (ở phía máy khách) của Reverse SSH Tunnel là 80 và cổng nguồn (ở phía máy chủ công cộng) phụ thuộc vào người dùng. Chúng tôi đang lên kế hoạch duy trì bản đồ các địa chỉ cổng cho mỗi người dùng.

Ví dụ: khách hàng A sẽ tạo đường hầm máy chủ web của họ tại cổng 80 đến cổng 8000 của chúng tôi; khách hàng B từ 80 đến 8001; khách hàng C từ 80 đến 8002.

Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver

Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver

Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver

Về cơ bản, những gì chúng tôi đang cố gắng làm là ràng buộc mỗi người dùng với một cổng và không cho phép họ chuyển sang bất kỳ cổng nào khác.

Nếu chúng tôi đang sử dụng tính năng đường hầm chuyển tiếp của SSH ssh -L, chúng tôi có thể cho phép cổng nào được tạo đường hầm bằng cách sử dụng permitopen=host:portcấu hình. Tuy nhiên, không có tương đương cho đường hầm SSH đảo ngược.

Có cách nào để hạn chế các cổng đường hầm ngược cho mỗi người dùng không?


1
Chỉ bằng chính sách toàn hệ thống như SELinux hoặc IPTABLES.
Andrew Smith

Câu trả lời:


6

Vì bạn đã đặt không cho phép in đậm, tôi giả sử bạn muốn một số loại từ chối thời gian chạy ở phía máy khách SSH để ngăn chặn cổng liên kết. Vì vậy, tôi đã đào mã nguồn cho bạn:

serverloop.c:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

Thật không may, như bạn có thể thấy, không có nhiều điều kiện xuất hiện để ngăn chuyển tiếp cổng ngoài các tiêu chuẩn.

Tôi đã định đề xuất cùng một gợi ý cho việc sử dụng mod_ownerbên trong iptables, nhưng Jeff đã đánh bại tôi với nó.

Giải pháp sạch nhất của bạn sẽ chỉ là sửa đổi tệp này (ví dụ: bạn có thể sử dụng pw->pw_uidđể có được kết nối của người dùng và ánh xạ tới cổng chính xác) và biên dịch lại máy chủ SSH của bạn, nhưng điều đó phụ thuộc vào mức độ thoải mái của bạn với điều này .


Cái này thật sự rất tốt. Tôi thực sự có thể sao chép cùng một cú pháp từ tùy chọn -L (đường hầm) và làm cho nó hoạt động. Cảm ơn bạn.
Utku Zihnioglu

3

Đề nghị của tôi là sử dụng SELinux cho việc này. Bạn sẽ phải định cấu hình hồ sơ người dùng cho phép mở cổng nào. Các sshddĩa quá trình và giọt ưu đãi của người dùng trước khi mở một cổng chuyển tiếp, vì vậy bất cứ điều gì áp dụng cho các quá trình của người dùng sẽ được áp dụng vào sshd. Hãy chú ý rằng bạn sẽ cần phải hạn chế tất cả các quy trình người dùng kể từ khi có thể sử dụng netcatđể chuyển tiếp một cổng khác. Tôi sẽ cố gắng sắp xếp cú pháp phù hợp cho bạn sau này (hoặc bất kỳ người dùng nào khác đều được chào đón để chỉnh sửa nó cho tôi).

Ngoài ra, bạn có thể thử sử dụng iptables.

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

Tuy nhiên, điều đó sẽ không ngăn họ mở cổng và từ chối người dùng khác.


Cảm ơn câu trả lời tuyệt vời. Tôi sẽ thử cấu hình hồ sơ người dùng / người dùng. Nghe có vẻ như giải pháp cho câu hỏi của tôi.
Utku Zihnioglu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.