Cho phép người dùng thiết lập đường hầm SSH, nhưng không có gì khác


97

Tôi muốn cho phép người dùng thiết lập đường hầm SSH tới một máy cụ thể trên một cổng cụ thể (giả sử, 5000), nhưng tôi muốn hạn chế người dùng này càng nhiều càng tốt. (Xác thực sẽ được thực hiện với cặp khóa công khai / riêng tư).

Tôi biết mình cần chỉnh sửa tệp ~ / .ssh / allow_keys có liên quan, nhưng tôi không chắc chính xác nội dung cần đưa vào đó (ngoài khóa công khai).

Câu trả lời:


91

Trên Ubuntu 11.10, tôi thấy mình có thể chặn các lệnh ssh, được gửi có và không có -T và chặn sao chép scp, đồng thời cho phép chuyển tiếp cổng đi qua.

Cụ thể, tôi có một máy chủ redis trên "somehost" được liên kết với localhost: 6379 mà tôi muốn chia sẻ một cách an toàn qua đường hầm ssh tới các máy chủ khác có keyfile và sẽ ssh vào bằng:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

Điều này sẽ khiến redis-server, "localhost" cổng 6379 trên "somehost" xuất hiện cục bộ trên máy chủ thực hiện lệnh ssh, được ánh xạ lại thành cổng "localhost" 16379.

Trên "somehost" từ xa Đây là những gì tôi đã sử dụng cho Authority_keys:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

Các chuyến đi no-pty lên hầu hết các nỗ lực ssh muốn mở một thiết bị đầu cuối.

Giấy phép mở giải thích những cổng nào được phép chuyển tiếp, trong trường hợp này là cổng 6379 cổng máy chủ redis mà tôi muốn chuyển tiếp.

Lệnh = "/ bin / echo do-not-send-domains" lặp lại "do-not-send-command" nếu ai đó hoặc điều gì đó quản lý để gửi lệnh đến máy chủ thông qua ssh -T hoặc cách khác.

Từ một Ubuntu gần đây man sshd, lệnh / allow_keys được mô tả như sau:

command = "command" Chỉ định rằng lệnh được thực thi bất cứ khi nào khóa này được sử dụng để xác thực. Lệnh do người dùng cung cấp (nếu có) bị bỏ qua.

Các nỗ lực để sử dụng sao chép tệp an toàn scp cũng sẽ không thành công với tiếng vọng của "do-not-send-command". Tôi thấy sftp cũng không thành công với cấu hình này.

Tôi nghĩ rằng đề xuất shell bị hạn chế, được đưa ra trong một số câu trả lời trước đây, cũng là một ý tưởng hay. Ngoài ra, tôi đồng ý rằng mọi thứ chi tiết ở đây có thể được xác định từ việc đọc "man sshd" và tìm kiếm trong đó cho "allow_keys"


1
Mặc dù no-ptykhông cho phép mở các giao diện tương tác, nhưng nó không có tác dụng gì để ngăn chặn việc thực thi lệnh, vì vậy người dùng có thể chỉnh sửa authorized_keystệp nếu anh ta có quyền truy cập bằng thứ gì đó như ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
khớp thần kinh

4
@synapse command = "/ bin / echo do-not-send-command", cũng được liệt kê ở trên, nhằm mục đích chặn các lệnh. và cung cấp một thông điệp. Bạn có ý định ví dụ của mình để đánh bại toàn bộ cài đặt ở trên hay bạn chỉ bình luận về no-pty?
Paul

Nó gấu nhắc đến mà các quản trị viên không bắt buộc phải cấp quyền sở hữu sử dụng của một file authorized_keys hoặc chứa thư mục, và cũng không rằng nó thậm chí còn tồn tại trong thư mục nhà của người sử dụng (giả sử máy chủ ssh được cấu hình đúng cho vị trí của nó)
Daniel Farrell

?? @DanFarrell sẽ thuộc sở hữu của root, hoặc wheel, hay ai?
Andrew Wolfe

Thông thường, @AndrewWolfe ~user/.ssh/authorized_keyssẽ được sở hữu bởi userusersẽ quản lý các khóa được ủy quyền được sử dụng để truy cập tài khoản. SSH kén chọn các quyền và có thể áp đặt các kỳ vọng ~/.ssh/và nội dung của nó. Tôi đã làm một sudo chown root: .ssh/authorized_keysvà nó dường như đã ngăn tôi đăng nhập, nhưng tôi biết từ kinh nghiệm trước đây rằng người dùng không cần phải sở hữu tệp đó - rootcó thể quản lý nó nếu bạn muốn.
Daniel Farrell

18

Có thể bạn sẽ muốn đặt trình bao của người dùng thành trình bao bị hạn chế . Bỏ đặt biến PATH trong ~ / .bashrc hoặc ~ / .bash_profile của người dùng và họ sẽ không thể thực hiện bất kỳ lệnh nào. Sau đó, nếu bạn quyết định muốn cho phép (các) người dùng thực hiện một nhóm lệnh giới hạn, chẳng hạn như lesshoặc tailchẳng hạn, thì bạn có thể sao chép các lệnh được phép vào một thư mục riêng biệt (chẳng hạn như /home/restricted-commands) và cập nhật PATH để trỏ tới thư mục đó.


1
Nhưng điều đó không ngăn cản người dùng chỉ định một lệnh khác trên dòng lệnh ssh, giống như ssh use@host "/bin/bash", phải không?
Fritz,

Có, nó có, giả sử rằng user@hostcó rbash làm vỏ. See The Restricted Shell
Ngày của Jason,

Được rồi, tôi đã thử và bạn đã đúng. Vì lệnh đã chỉ định được thực thi bởi trình bao đăng nhập, nên việc thực thi /bin/bashkhông thành công vì nó chứa dấu gạch chéo.
Fritz

3
Mặc dù cần phải nói rằng cho phép lesscó lẽ là một ý tưởng tồi, bởi vì từ đó bạn có thể thoát ra một shell không bị giới hạn !/bin/bash. Xem pen-testing.sans.org/blog/2012/06/06/… để biết các ví dụ khác. Vì vậy, việc cho phép các lệnh riêng lẻ nên được thực hiện rất, rất cẩn thận, nếu có.
Fritz

17

Bên cạnh tùy chọn allow_keys như no-X11-forwarding, thực sự có một tùy chọn bạn đang yêu cầu: allowopen = "host: port". Bằng cách sử dụng tùy chọn này, người dùng chỉ có thể thiết lập một đường hầm đến máy chủ và cổng được chỉ định.

Để biết chi tiết về định dạng tệp AUTHORIZED_KEYS, hãy tham khảo man sshd.


13
Bạn cũng sẽ cần chỉ định "no-pty" như một phần của bộ tùy chọn. Nếu bạn chỉ sử dụng "allowopen", thì bạn sẽ hạn chế các đường hầm đối với máy chủ / cổng nhất định ... nhưng bạn vẫn sẽ cho phép các trình bao tương tác.
John Hart

Việc hạn chế chuyển tiếp cổng với allowopen cũng khóa loại chuyển tiếp thiết bị đường hầm mà ssh -w yêu cầu?
flabdablet

5
@JohnHart: no-ptycũng không hạn chế quyền truy cập shell, bạn vẫn sẽ vào được shell, nó chỉ không hiển thị cho bạn lời nhắc; Bạn vẫn có thể đưa ra các lệnh và xem kết quả đầu ra tốt. Bạn cần command="..."tùy chọn nếu bạn muốn hạn chế quyền truy cập trình bao .ssh/authorized_keys.
Aleksi Torhamo

9

Giải pháp của tôi là cung cấp cho người dùng chỉ có thể đang đào hầm, không có trình bao tương tác , đặt trình bao đó trong / etc / passwd thành / usr / bin / tunnel_shell .

Chỉ cần tạo tệp thực thi / usr / bin / tunnel_shell với vòng lặp vô hạn .

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

Giải thích đầy đủ tại đây: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


9
CTRL + Z sẽ thoát khỏi kịch bản cho bạn truy cập vào bash ... Hãy thử thêm "cái bẫy '' 20" (không có dấu ngoặc kép) tại rất bắt đầu của kịch bản
Big Papoo

1
cảm ơn cho gợi ý, tôi đã thêm bẫy của một số tín hiệu ngắt
Daniel W.

1
Tôi chỉ sử dụng / bin / cat cho một "shell". Có vẻ hoạt động tốt. Không biết về bất kỳ hành vi lợi dụng nào đối với mèo và ngay cả khi bạn đã tìm thấy một số mẫu nhập liệu có thể làm hỏng nó, phiên ssh của bạn sẽ chỉ chấm dứt.
flabdablet

4
@BigPapoo: Bạn đã thực sự kiểm tra nó? Tôi không thể biết nó sẽ trốn đến đâu. Nếu bạn đang ở trong trình bao và bạn chạy tunnel_shell, bạn sẽ có shell -> /bin/bash tunnel_shellđể tất nhiên bạn có thể thoát trở lại trình bao, nhưng nếu bạn đã đặt tunnel_shell làm trình bao của người dùng, bạn sẽ chỉ có /bin/bash tunnel_shellchạy, không có trình bao nào để thoát , theo như tôi thấy. Tôi đã thử nghiệm nó và không thể thoát bằng ctrl-z. Nếu bạn đã thử và có thể thoát, bạn có thể đăng thiết lập không? Tương tự như vậy, nếu bạn biết bất kỳ tài liệu nào nói rằng nó sẽ hoạt động như vậy, bạn có thể đăng nó không?
Aleksi Torhamo

3

Tôi có thể thiết lập tệp allow_keys với khóa công khai để đăng nhập. Điều tôi không chắc là thông tin bổ sung mà tôi cần để hạn chế những gì tài khoản đó được phép làm. Ví dụ, tôi biết tôi có thể đặt các lệnh như:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Bạn sẽ muốn một dòng trong tệp ủy quyền của mình trông giống như thế này.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 


3

Ở đây bạn có một bài đăng hay mà tôi thấy hữu ích: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

Ý tưởng là: (với tên người dùng bị hạn chế mới là "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Lưu ý rằng chúng tôi sử dụng rbash (limited-bash) để hạn chế những gì người dùng có thể làm: người dùng không thể cd (thay đổi thư mục) và không thể đặt bất kỳ biến môi trường nào.

Sau đó, chúng tôi chỉnh sửa biến env PATH của người dùng /home/sshtunnel/.profilethành không có gì - một thủ thuật sẽ khiến bash không tìm thấy bất kỳ lệnh nào để thực thi:

PATH=""

Cuối cùng, chúng tôi không cho phép người dùng chỉnh sửa bất kỳ tệp nào bằng cách đặt các quyền sau:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

0

Tôi đã tạo một chương trình C trông như thế này:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

Tôi đặt trình bao của người dùng bị hạn chế cho chương trình này.

Tôi không nghĩ rằng người dùng bị hạn chế có thể thực thi bất cứ điều gì, ngay cả khi họ làm ssh server command, bởi vì các lệnh được thực thi bằng cách sử dụng trình bao và trình bao này không thực thi bất cứ điều gì.



-3

Bạn sẽ tạo một khóa trên máy người dùng thông qua bất kỳ ứng dụng ssh nào họ đang sử dụng. pUTTY chẳng hạn có một tiện ích để làm điều này chính xác. Nó sẽ tạo ra cả khóa riêng tư và khóa công khai.

Nội dung của tệp khóa công khai được tạo sẽ được đặt trong tệp ủy quyền.

Tiếp theo, bạn cần đảm bảo rằng máy khách ssh được cấu hình để sử dụng khóa riêng tư đã tạo khóa công khai. Nó khá dễ hiểu, nhưng hơi khác một chút tùy thuộc vào khách hàng được sử dụng.

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.