Làm cách nào để tắt chuyển tiếp cổng cục bộ SSH?


20

Tôi có một máy chủ chạy Ubuntu và daemon OpenSSH. Hãy gọi nó là S1.

Tôi sử dụng máy chủ này từ các máy khách (hãy gọi một trong số chúng là C1) để thực hiện đường hầm đảo ngược SSH bằng cách sử dụng chuyển tiếp cổng từ xa, ví dụ:

ssh -R 1234:localhost:23 login@S1

Trên S1, tôi sử dụng tệp sshd_config mặc định. Từ những gì tôi có thể thấy, bất kỳ ai có thông tin xác thực {login, pwd} trên S1 đều có thể đăng nhập vào S1 và thực hiện chuyển tiếp cổng từ xa chuyển tiếp cổng cục bộ. Thông tin đăng nhập như vậy có thể là một chứng chỉ trong tương lai, vì vậy theo tôi hiểu, bất kỳ ai lấy chứng chỉ đều có thể đăng nhập vào S1 từ bất kỳ nơi nào khác (không nhất thiết là C1) và do đó tạo ra các chuyển tiếp cổng cục bộ.

Đối với tôi, cho phép chuyển tiếp cổng cục bộ là quá nguy hiểm, vì nó cho phép tạo một số loại proxy công khai. Tôi đang tìm cách để vô hiệu hóa chỉ chuyển tiếp -L.

Tôi đã thử cách sau, nhưng điều này vô hiệu hóa cả chuyển tiếp cục bộ và từ xa:

AllowTcpForwarding No

Tôi cũng đã thử như sau, điều này sẽ chỉ cho phép -L đến SX: 1. Tốt hơn là không có gì, nhưng vẫn không phải là thứ tôi cần, đó là một lựa chọn "không".

PermitOpen SX:1

Vì vậy, tôi tự hỏi nếu có một cách, để tôi có thể cấm tất cả các cổng địa phương chuyển tiếp để viết một cái gì đó như:

PermitOpen none:none

Đây có phải là một ý tưởng tốt?

PermitOpen localhost:1

vì vậy, như mọi khi, hãy đi đến gốc rễ của vấn đề này: vấn đề thực sự của bạn là gì , tại sao bạn muốn thiết lập một cái gì đó như thế này cho thiết bị di động / nhúng, bạn muốn giải quyết vấn đề gì?
akira

Vấn đề cần giải quyết ở đây là có thể mở phiên Telnet, ở mọi nơi từ Internet, đến thiết bị di động / nhúng được kết nối với Internet, có tính đến việc thiết bị có thể bị NAT, hoặc tường lửa, do đó không thể truy cập được từ trên mạng.
SCO

telnet .. để làm gì? để đục lỗ vào tường lửa google cho 'stun'
akira

Câu trả lời:


16

bất cứ ai có thông tin đăng nhập đều có thể đưa ra sshd của riêng họ, chạy trên một cổng ngẫu nhiên và cho phép bất cứ điều gì họ muốn, bao gồm -L chuyển tiếp cục bộ:

% /usr/sbin/sshd -d -f mysshd.config -p 12345

nếu bạn không tin tưởng người dùng sẽ làm gì đó với máy của mình thì bạn không nên cho phép họ đăng nhập ngay từ đầu.

(btw, cờ -D cũng thuộc loại "vấn đề proxy")


Tôi đoán tôi có thể thiết lập một tài khoản rất hạn chế cho mục đích này (ví dụ: gắn người dùng vào nhà của nó, không liệt kê, không duyệt hệ thống tập tin), để nó không thể khởi động và sshd (hoặc cài đặt và bắt đầu nhị phân sshd). Vấn đề là các máy khách được cho là thiết bị nhúng. Nhưng vì họ có thể sẽ nhúng các chứng chỉ và bộ nhớ flash của họ có thể bị hủy, nên có thể các chứng chỉ sẽ bị rò rỉ, do đó cho phép bất cứ ai đăng nhập vào S1.
SCO

Sử dụng ChrootDirectory cho người dùng cụ thể đó sẽ thực hiện thủ thuật, sẽ thử điều đó!
SCO

1
Trong ủy quyền_key, thiết lập command="/sbin/nologin". Điều này sẽ ngăn họ chạy bất kỳ lệnh nào trên máy chủ.
justis

Câu lệnh "bất kỳ ai có thông tin đăng nhập đều có thể tự đưa ra <anything>" là sai. sshcó thể được sử dụng để kết nối với các tài khoản có trình đăng nhập bị hạn chế nghiêm trọng không cho phép điều này. Chuyển tiếp cổng là một lỗ hổng bảo mật trong các vỏ bị hạn chế như vậy. Ngoài việc chạy một lệnh được phép, người dùng có thể tạo đường hầm.
Kaz

3
Trích dẫn từ sshd_configtrang man: Lưu ý rằng việc tắt chuyển tiếp TCP không cải thiện bảo mật trừ khi người dùng cũng bị từ chối truy cập shell , vì họ luôn có thể cài đặt các giao nhận của riêng họ. (Nhấn mạnh mỏ).
Kaz

17

Một giải pháp khác là chỉ cho phép chuyển tiếp cổng tới người dùng cụ thể:

Từ SSH: Hướng dẫn dứt khoát

Chuyển tiếp cổng có thể được kích hoạt hoặc vô hiệu hóa trên toàn cầu trong sshd. Điều này được thực hiện với từ khóa cấu hình toàn máy chủ AllowTcpForwarding trong / etc / sshd_config. Từ khóa có thể có giá trị có (mặc định, cho phép chuyển tiếp) hoặc không (vô hiệu hóa chuyển tiếp):

# SSH1, SSH2, OpenSSH
AllowTcpForwarding no

Ngoài ra, SSH2 có các tùy chọn sau:

# SSH2 only
AllowTcpForwardingForUsers
AllowTcpForwardingForGroups

Cú pháp của những điều này giống như đối với các tùy chọn AllowUsers và Allowgroup. [Mục 5.5.2.1, "Kiểm soát truy cập tài khoản"] Họ chỉ định danh sách người dùng hoặc nhóm được phép sử dụng chuyển tiếp cổng; máy chủ từ chối tôn trọng các yêu cầu chuyển tiếp cổng cho bất kỳ ai khác. Lưu ý rằng những tài liệu này đề cập đến tài khoản đích của phiên SSH, không phải tên người dùng của khách hàng (thường không được biết đến).

...

Điều quan trọng là phải nhận ra rằng các lệnh trong phần này không thực sự ngăn chặn chuyển tiếp cổng, trừ khi bạn cũng vô hiệu hóa thông tin đăng nhập tương tác và hạn chế những chương trình nào có thể được chạy ở phía xa. Mặt khác, người dùng có kiến ​​thức có thể chỉ cần chạy ứng dụng chuyển tiếp cổng của riêng họ qua phiên SSH. Chỉ riêng những thiết lập này có thể là một yếu tố ngăn chặn đủ trong một cộng đồng phi kỹ thuật, nhưng chúng sẽ không ngăn được ai đó biết cô ấy đang làm gì.


1
Về cơ bản tôi sẽ chỉ có một người dùng được cung cấp trên S1. AFAIU, trong trường hợp cụ thể này, sử dụng AllowTcpForwardingForUsers / AllowTcpForwardingForgroup sẽ không thực hiện thủ thuật, phải không? Cấm đăng nhập tương tác là một ý tưởng tốt vì nó sẽ khiến người dùng không thể bắt đầu nhị phân. Nhưng bất kỳ khách hàng nào vẫn sẽ được phép sử dụng cú pháp -L phải không? Vì vậy, hiện tại, các tùy chọn tốt nhất sẽ là: 1 / Vô hiệu hóa đăng nhập tương tác, 2 / PermitOpen với tên máy chủ giả mạo: cổng. Tôi đã bỏ lỡ một cái gì đó?
SCO

Cách tốt nhất để xác minh điều này, sẽ là thử cài đặt.
Christian

Tôi không thể thấy các tùy chọn này trong phần mềm OpenSSH miễn phí. Một google cho AllowTcpForwardingForUsersthấy rằng nó được cấu hình trong một sshd2_config, được sử dụng trong một số chương trình thương mại. Xem một trong những câu trả lời cho: superuser.com/questions/384643/ Ấn
Kaz

^ OpenSSH có Matchcác khối trong cấu hình. Bạn có thể Matchtrên người dùng và các nhóm, và gửi kèm AllowTcpForwardingbên trong.
Kaz

2

Hiện tại có một tùy chọn chỉ cho phép chuyển tiếp cục bộ / từ xa.

AllowTcpForwarding Chỉ định liệu chuyển tiếp TCP có được phép hay không. Các tùy chọn có sẵn là “có” hoặc “tất cả” để cho phép TCP chuyển tiếp, “không” để ngăn chặn tất cả các giao thức TCP, “địa phương” để cho phép địa phương (từ quan điểm của ssh (1)) chỉ chuyển tiếp hoặc “từ xa” để cho phép điều khiển từ xa chỉ chuyển tiếp . Mặc định là có có. Lưu ý rằng việc tắt chuyển tiếp TCP không cải thiện bảo mật trừ khi người dùng cũng bị từ chối truy cập shell, vì họ luôn có thể cài đặt các giao nhận của riêng họ.

Vì vậy, như đã nêu, bạn cũng nên đặt shell thành nologin.


0

Giải pháp của tôi cho vấn đề này là thêm: PermitOpen fo.local: 80 trong phần chính của sshd_config.

Điều này chỉ đơn giản là từ chối mọi yêu cầu chuyển tiếp cục bộ bên cạnh fo.local: 80.


0

Tôi đang tìm cách để vô hiệu hóa chỉ chuyển tiếp -L

Nếu tôi hiểu bạn một cách chính xác, người dùng của bạn có quyền truy cập toàn bộ vỏ, nhưng bạn không muốn họ có thể mở các kết nối với phần còn lại của mạng.

"Chuyển tiếp cổng cục bộ" được SSH cho phép chỉ là một trong những cách có thể để làm điều đó. Những người khác bao gồm tung ra một thể hiện của socat, netcathoặc bất kỳ số khác của các công cụ.

Cách tốt nhất để kiểm soát các kết nối đi cũng như các kết nối đến trong Linux là Netfilter, còn gọi là IPTables.

Nó có một mô-đun đặc biệt gọi là chủ sở hữu ( ipt_owner) cho phép bạn khớp các đặc điểm khác nhau của trình tạo gói, cho các gói được tạo cục bộ. Nó là hợp lệ trong OUTPUTPOSTROUTINGchuỗi.

Bạn có thể sử dụng nó để từ chối các gói gửi đi được tạo bởi một số nhóm người dùng nhất định, do đó không cho phép bất kỳ loại chuyển tiếp cổng nào, không chỉ là -Ltùy chọn của SSH.

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.