Cách sử dụng shell đăng nhập không mặc định để đăng nhập ssh


9

Tôi hiện đang làm việc trong một mạng sử dụng LDAP để xác thực. Sau khi đặt zshlàm vỏ đăng nhập, tôi gặp phải vấn đề truy cập từ xa thông qua sshmột trong các máy trên mạng mà dường như không zshcài đặt được. Đăng nhập thất bại với

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Vì vậy, câu hỏi về cơ bản là: Làm thế nào tôi có thể bảo máy từ xa sử dụng shell đăng nhập khác với vỏ được cấu hình trong LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e


Bạn đã xem xét việc thay đổi vỏ LDAP của mình thành một cái gì đó phổ quát hơn /bin/sh, và sau đó điều khiển từ xa của bạn thực ~/.profilehiện vỏ thích hợp nếu có?
RobertL

Đó sẽ là một lựa chọn, nhưng không phải là một lựa chọn rất sạch sẽ, vì vậy tôi muốn tránh nó nếu có thể.
Sascha

Câu trả lời:


10

Nếu shell đăng nhập của bạn không thể được thực thi trên một số máy, thì bạn không thể đăng nhập vào nó qua SSH hoặc bằng hầu hết các phương thức khác cho vấn đề đó. Máy chủ SSH luôn thực thi shell đăng nhập của bạn. Nếu bạn truyền một lệnh trên sshdòng lệnh thì shell đăng nhập được thực thi -cvà chuỗi lệnh¹ làm đối số; mặt khác, vỏ đăng nhập được thực thi như một vỏ đăng nhập không có đối số.

Nếu có một cách để bỏ qua shell đăng nhập, đó sẽ là một lỗ hổng bảo mật. Một tài khoản có thể được cấu hình như một tài khoản bị hạn chế bằng cách tạo vỏ đăng nhập của nó thành một chương trình chỉ thực hiện một nhiệm vụ cụ thể; ví dụ, shell đăng nhập có thể git-shellchỉ cho phép truy cập vào kho git, hoặc rssh, v.v.

Để đăng nhập vào máy đó, bạn cần phải sắp xếp /bin/zshđể có mặt hoặc thay đổi vỏ đăng nhập của bạn thành thứ gì đó hiện diện.

Những gì tôi khuyên trong một môi trường không đồng nhất như thế này là hãy bám vào /bin/shnhư vỏ đăng nhập của bạn, bởi vì nó có mặt ở khắp mọi nơi. Đặt SHELLbiến môi trường thành /bin/zshnếu có, theo cách đó, bạn sẽ nhận được zsh dưới dạng vỏ tương tác.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Trong khi bạn đang ở đó, điều này cho phép bạn tránh mã hóa cứng đường dẫn đến zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Để có được zsh để chạy tự động cho đăng nhập chế độ văn bản, hãy gọi nó từ của bạn .profile. Nếu bạn muốn sử dụng .zprofileđể thiết lập mọi thứ, hãy biến nó thành một vỏ đăng nhập (nhưng sau đó bạn sẽ không nhận được môi trường tương tự trên các máy không có zsh, vì vậy tôi không khuyến nghị điều này). Chỉ làm điều này nếu đây là thông tin đăng nhập tương tác, không phải khi .profiletập lệnh của bạn được thực thi bởi tập lệnh, trong khi đăng nhập chế độ GUI, v.v.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ Client SSH concatenates lập luận không có quyền lựa chọn với các không gian ở giữa, và gửi chuỗi kết quả thông qua kết nối. Các giao thức SSH định nghĩa lệnh là một chuỗi, không phải là danh sách các chuỗi.


Cảm ơn vì lời giải thích chi tiết. Có vẻ như đó là cách duy nhất để không cài đặt zsh trên máy từ xa và nó hoạt động hoàn hảo, vì vậy tôi sẽ tuân theo nó.
Sascha

Tôi cũng đề nghị thêm một thử nghiệm [ "0$SHLVL" -lt 2 ]trong trường hợp shell đăng nhập mặc định hỗ trợ $SHLVLđể bash -lcó thể chạy shell khác nếu cần (ví dụ trong trường hợp zsh không thành công vì một số lý do). Do đó ssh -t host bash -lsẽ chạy bashshell đăng nhập mà không thực hiện zsh phía sau. Ngoài ra, tôi sẽ thay thế exec zshbằng cách exec zsh -lđể .zlogintập tin có nguồn gốc.
vinc17

2

Bạn phải ether cài đặt shell trên máy được chỉ định nếu bạn có quyền truy cập theo cách khác hoặc yêu cầu nó từ quản trị viên thực hiện việc này cho bạn hoặc thay đổi shell của bạn trong ldap thành shell tồn tại trên máy từ xa.

(mở) sshd sẽ luôn kiểm tra shell người dùng và nó sẽ luôn thực thi shell đó bất cứ điều gì được thông qua để thực thi. Nếu một shell khác được truyền để thực thi, nó sẽ thực thi nó chuyển nó dưới dạng đối số cho shell người dùng, ví dụ shell của người dùng là '/ bin / sh' và bạn chuyển như một đối số shell csh hơn nó sẽ chạy "/ bin / sh -c / bin / csh '.


Đọc bình luận redfast. openssh không cho phép bạn bỏ qua shell mặc định.
Rui F Ribeiro

@Rui F Ribeiro Nếu làm như vậy, nó sẽ loại bỏ logic đằng sau việc đặt vỏ thành một cái gì đó như '/ bin / false' hoặc '/ sbin / nologin'. Nếu bạn đang đề cập đến việc thay đổi shell sau khi đăng nhập thì ok, nhưng nó giống như tôi đã viết ở trên (sh -c otherh), nếu không có '/ bin / sh' thì bạn không gặp may. (Đã thử nghiệm trên Redhat).
nkms

Thực sự, nếu passwd có shell không được liệt kê trong / etc / shell, bạn sẽ không đăng nhập. Nhưng nếu bạn có thể đăng nhập và trừ khi sshd_config không ép buộc bạn vào một trình bao cụ thể, bất kỳ lệnh nào mà người dùng có khả năng chạy là trò chơi công bằng. Nếu bạn thực hiện thêm một vài thử nghiệm, chẳng hạn ssh -l user server "ps ax" | grep bash, rất dễ nhận thấy shell mặc định không phải lúc nào cũng được gọi. Điều nó thực sự ngăn cản giải pháp khác hoạt động là kiểm tra bảo mật của zsh không nằm trong / etc / shells
Rui F Ribeiro

@Rui F Ribeiro Chạy strace -f sshd về phía máy chủ. Bạn sẽ thấy một cái gì đó như "execve (" / bin / bash ", [" bash "," -c "," ps "] ..." Ngoài ra, / sbin / nologin là một vỏ hợp lệ trong / etc / shell.
nkms

Câu trả lời của @RuiFRibeiro redfast00 hoàn toàn sai. nkms là đúng.
Gilles 'SO- ngừng trở nên xấu xa'
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.