Thêm người dùng chỉ có thể thực thi tập lệnh từ xa


14

Tôi muốn tạo một người dùng chỉ có thể làm một việc: thông qua ssh chỉ định một tập lệnh (và đối số dòng lệnh cho tập lệnh) nằm trong một thư mục cụ thể (vì mục đích của câu hỏi này, chúng ta hãy gọi nó /local/remote_only_scripts/foo) và để tập lệnh đó thực thi và trả lại đầu ra của nó.

Để rõ ràng một số ví dụ về những điều tôi không muốn người dùng có thể làm:

  • Đăng nhập cục bộ vào tài khoản. Ứng dụng đăng nhập là /bin/login. Nó không phải là một tập lệnh trong /local/remote_only_scripts/foothư mục, do đó người dùng không nên gọi.
  • Đăng nhập từ xa vào tài khoản. Một lần nữa đăng nhập (là những gì được gọi bởi ssh?) Không phải là một tập lệnh trong thư mục có liên quan.
  • Liệt kê nội dung của thư mục. ls là trong /bin/ls. Nó không phải là một kịch bản trong thư mục thích hợp.
  • Chỉnh sửa một tập tin trong thư mục đó. emacs, vi, gedit hầu hết các trình soạn thảo khác không phải là tập lệnh trong directoy đó.
  • Xem nội dung của một tập tin trong thư mục đó.
  • Thực hiện một tập tin trong thư mục mà anh ta không có quyền thực thi.

Lưu ý rằng đây là những ví dụ có nhiều hành động khác mà tôi không muốn người dùng có thể thực hiện. Khi xem xét một hành động, hãy hỏi "điều này có được thực hiện bởi một kịch bản /local/remote_only_scripts/fookhông?" Nếu câu trả lời là không, người dùng sẽ không thể làm điều đó. Nếu câu trả lời là có thì người dùng sẽ có thể làm điều đó.

PS: Hãy để tôi làm rõ ý của tôi bằng cách "thêm người dùng". Tôi không có nghĩa là thêm người dùng vào một số hệ thống con ssh. Thay vào đó tôi có nghĩa là thêm một người dùng vào hệ thống máy tính. Vì vậy, ví dụ, tôi có một hệ thống chạy ổn định debian, hãy gọi nó bằng địa chỉ của nó, www.hg.bar.com. Tôi muốn thêm người dùng (thông qua kuser, user-admin hoặc useradd hoặc một số cách tương tự) gọi anh ta hg_guest. hg_guest không thể đăng nhập cục bộ hoặc thực hiện bất kỳ điều nào trong danh sách trên. Tất cả hg_guest có thể làm là thực thi các tập lệnh "từ xa". Tôi nói anh ấy sẽ có thể làm như vậy thông qua ssh, nhưng nghĩ về nó bây giờ, có thể cho phép anh ấy sử dụng ssh có thể cho phép anh ấy đăng nhập cục bộ, vì vậy một số cơ chế khác có thể được yêu cầu.

Câu trả lời:


12

Có một tùy chọn lệnh trong tệp ủy quyền. Tùy chọn này dường như làm chính xác những gì bạn muốn.

Lưu ý rằng đó không phải là chroot hoặc vỏ bị hạn chế. Nó chỉ cho phép thực thi những lệnh đó thông qua ssh. Với ví dụ của bạn, nó sẽ là:

ssh somehost /local/remote_only_scripts/foo

Đối với tệp ủy quyền này:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Có rất nhiều cách nếu bạn không muốn người dùng của mình có thể đăng nhập cục bộ. Bạn có thể:

  • chỉ cần đặt shell của nó thành / bin / false (có thể bạn sẽ cần / bin / true vì ssh cần đăng nhập hợp lệ)
  • khóa mật khẩu của nó, xem passwd -l

EDIT : thêm nhiều tùy chọn hạn chế và làm rõ cách bạn loại bỏ quyền truy cập cục bộ.


Tôi không nghĩ bạn cần chỉ định lệnh đó trong ssh ở phía máy khách, đó là lệnh 'bắt buộc' để nó luôn được thực thi;) Người dùng trên trang web từ xa vẫn cần shell hợp lệ được xác định trong / etc / passwd.
jirib

1
Bên cạnh đó command=, các tùy chọn no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptylà cần thiết để thực sự hạn chế tài khoản.
jofel

Đồng ý. Tôi thức dậy vào giữa đêm và quyết định kiểm tra câu trả lời. Vì tôi buồn ngủ nên tôi sẽ không đồng hóa toàn bộ câu trả lời mà chỉ hỏi điều gì đó khiến tôi bối rối. Làm thế nào điều này ngăn hg_quest đăng nhập từ một tty?
HandyGandy

@HandyGandy Đây là phần đơn giản nhất. Tôi đã thêm 2 cách để làm điều đó, nhưng tôi nghĩ còn nhiều hơn nữa
Coren

0

Hãy thử đây là vỏ đăng nhập cho người dùng:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Bạn có thể cũng muốn có điều này trong authorized_keystệp một cách rõ ràng như trong câu trả lời của Coren; nhưng thay thế '... / foo; với chương trình tại đây. Điều đó sẽ ngăn chặn các lệnh từ SSH như sftp, scp, và ssh hostname command.


Nếu bạn chỉ muốn người dùng có thể thực thi các lệnh từ thư mục của bạn (và không có quá nhiều), bạn có thể lấy "prog" ra khỏi phần đọc ở trên và sử dụng một câu lệnh chọn để đưa ra một menu văn bản các lựa chọn của các chương trình và sau đó thực hiện đọc cho các đối số. Tôi cũng sẽ kiểm tra điều này để đảm bảo điều gì sẽ xảy ra nếu bạn nhập một loạt các Ctrl-C tại các điểm khác nhau trong tập lệnh. Bạn có thể muốn một lệnh bẫy trong đó quá.
Joe

0

Trong trường hợp có khả năng họ chỉ cần truy cập vào một tập lệnh, điều này thực sự tốt cho tôi. Thêm người dùng và thay đổi shell mặc định của họ theo đường dẫn của tập lệnh. Khi họ kết nối qua ssh, nó sẽ thực thi tập lệnh và đóng phiên của họ.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

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.