Cho phép SCP nhưng không đăng nhập thực tế bằng SSH


62

Có cách nào để định cấu hình người dùng trên hộp Linux (Centos 5.2 trong trường hợp này) để họ có thể sử dụng scp để truy xuất tệp, nhưng thực tế không thể đăng nhập vào máy chủ bằng SSH?


Tôi đã thử thiết lập shell đăng nhập thành / bin / false, nhưng điều đó chỉ khiến scp hoạt động hoàn toàn.
DrStalker

Câu trả lời:


44

vỏ rssh ( http://pizzashack.org/rssh/ ) được thiết kế cho mục đích chính xác này.

Vì RHEL / CentOS 5.2 không bao gồm gói cho rssh, bạn có thể xem tại đây để nhận RPM: http://dag.wieers.com/rpm/packages/rssh/

Để sử dụng, chỉ cần đặt nó làm vỏ cho một người dùng mới như thế này:

useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1

.. hoặc thay đổi vỏ cho một cái hiện có như thế này:

chsh -s /usr/bin/rssh scpuser1

..và chỉnh sửa /etc/rssh.confđể định cấu hình shell rssh - đặc biệt là dòng uncomment allowscpđể cho phép truy cập SCP cho tất cả người dùng rssh.

(Bạn cũng có thể muốn sử dụng chroot để giữ người dùng trong nhà của họ nhưng đó là một câu chuyện khác.)


điều đó thật tuyệt - tôi cũng đã tìm kiếm thứ gì đó như thế này rồi
warren

6
ý tưởng đằng sau rssh là tốt, nhưng iirc rssh không chính xác là một phép màu của bảo mật trong các điều khoản lập trình. Một google đơn giản về 'khai thác rssh' mang lại nhiều kết quả hơn tôi cảm thấy thoải mái với ...
wzzrd

7
scponly là nhiều hơn hoặc ít hơn những điều tương tự như tốt và dường như ít khai thác dễ xảy ra: sublimation.org/scponly/wiki/index.php/Main_Page
François Feugeas

dường như đã chuyển sang github. Liên kết thăng hoa đã chết. github.com/scponly/scponly/wiki
spazm

38

Tôi đến muộn nhưng bạn có thể sử dụng các khóa ssh và chỉ định lệnh chính xác được phép trong tệp ~ / .ssh / ủy quyền của họ, vd

không chuyển tiếp cổng, không pty, lệnh = "mục tiêu nguồn scp" ssh-dss ...

Bạn có thể cần sử dụng ps trên mục tiêu để đặt cài đặt lệnh đúng.

PS: Nếu bạn chạy lệnh kiểm tra scp bằng "-v", bạn có thể thấy một cái gì đó như thế này

debug1: Sending command: scp -v -t myfile.txt

Bạn sẽ lưu ý rằng "-t" là một tùy chọn scp không có giấy tờ, được chương trình sử dụng ở phía xa. Điều này cung cấp cho bạn ý tưởng về những gì bạn cần đưa vào ủy quyền.

EDIT: Bạn có thể tìm thêm thông tin (với một số liên kết) trong câu hỏi StackOverflow này .

Dưới đây là một ví dụ hoạt động về điều này, cho một người dùng có tên backup_userở phía máy chủ.

~backup_user/.ssh/authorized_keys nội dung về phía máy chủ (với một số hạn chế bảo mật hơn):

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...

Tạo một liên kết trong ~ backup_user / liên kết đến thư mục nơi nội dung sẽ có thể truy cập được.

$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT

Bây giờ, từ phía máy khách, lệnh sau sẽ hoạt động:

scp -v  -r  -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT

Lệnh này làm gì:

  • Nó hiển thị thông tin dài dòng ( tùy chọn : bạn có thể xóa -vtệp từ cả hai lệnh và tệp ủy quyền)
  • Nó đệ quy sao chép nội dung của đường dẫn / đến / dữ liệu. ( tùy chọn : bạn có thể xóa -rkhỏi cả tệp lệnh và tệp ủy quyền nếu bạn không muốn tạo một bản sao đệ quy)
  • Nó sử dụng cổng 2222 để kết nối với máy chủ ( tùy chọn : bạn có thể xóa -P 2222khỏi lệnh)
  • Nó sử dụng và tập tin nhận dạng để tự động hóa kết nối ( tùy chọn : bạn có thể xóa-i .ssh/id_rsa_key_file
  • Nội dung của path/to/datasẽ được sao chép vào/path/to/directory/with/accessible/content/

Để tạo một bản sao của một tệp (hoặc một số) từ máy chủ đến máy khách, bạn nên tạo một tập lệnh shell xử lý việc này như được mô tả ở đây


1
Điều gì để ngăn người dùng lướt qua tệp ủy quyền của họ? Nó có thể bị hạn chế không được sở hữu bởi chính người dùng?
Dan

1
@Dan - Có thể đặt quyền chỉ đọc trên tệp ủy quyền, tức là. chmod 400 ~/.ssh/authorized_keys.
Roger Dueck

Ngoài ra, bạn nên thực hiện ~/.bashrc(và bất cứ điều gì khác Bash thực thi) và chỉ ~/.ssh/rcđọc. Nhưng nếu người dùng độc hại có quyền truy cập vào rsync hoặc sftp, anh ta vẫn có thể xóa ~/.bashrcvà tải lên một cái mới. Vì nó khó bảo vệ, tôi khuyên bạn nên chống lại phương pháp này ( command="...").
pts

31

Tôi đến bữa tiệc hơi muộn, tuy nhiên tôi sẽ đề nghị bạn xem qua ForceCommandchỉ thị của OpenSSH.

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

Cấp, đây là SFTP và không phải SCP, nhưng nó đạt được cùng một mục tiêu, an toàn hơn so với vỏ bị hạn chế. Ngoài ra, bạn có thể chroot người dùng nếu bạn muốn.


2
thêm chrootDirectory %hAllowTcpForwarding no sau phần khớp để buộc người dùng sftponly chroot đến nhà của họ. xin lưu ý rằng trận đấu phải (phải!) là phần cuối cùng trên cấu hình ssh và các tùy chọn sau đó là các tùy chọn chỉ dành cho người dùng phù hợp
higuita

4
ForceCommand internal-sftp -u 0077 -d /uploaddircó thể làm nó cứng hơn bằng cách buộc một ô trên một thư mục tải lên. Kết hợp với 'ChrootDirectory`, nó tạo ra một môi trường tải lên bị cô lập, bị kiểm soát chặt chẽ. Phần thưởng lưu ý: thư mục mặc định và ô phải được đặt trong ForceCommand, không phải trong lệnh Subsystem, nếu bạn muốn chúng hoạt động.
Marcin

Một bài viết dài hơn giải thích điều này là có sẵn tại debian
ad dùng.org / article / 590 / trên

7

Tôi khuyên bạn nên sử dụng một cách khéo léo.

Nó là một lớp vỏ bị hạn chế cho phép người dùng thực hiện những gì nó nghe giống như các tệp SCP cho máy chủ, nhưng không thực sự đăng nhập. Thông tin và mã nguồn tải xuống cho phần mềm có sẵn ở đây và các gói RPM được biên dịch sẵn có qua Kho lưu trữ EPEL YUM .

Sau khi cài đặt, bạn sẽ cần định cấu hình từng tài khoản người dùng mà bạn muốn hạn chế quyền truy cập để sử dụng trình bao bị hạn chế mới cài đặt. Bạn có thể thực hiện việc này một cách thủ công qua / etc / passwd hoặc sử dụng lệnh sau: usermod -s /usr/bin/scponly USERNAME


Tôi thứ hai này. scponlyđược THIẾT KẾ cho chính xác mục đích này.
UtahJarhead

1
dường như đã chết debian dường như đã xóa nó: tests.debian.org/search?keywords=scponlymã trên github cũng đã chết. Thảo luận tiếp theo: serverfault.com/questions/726519/
Ấn


3

Đến bữa tiệc rất muộn, nhưng chỉ cần đặt shell của người dùng git là / usr / bin / git-shell. Đó là một vỏ bị hạn chế không cho phép đăng nhập tương tác. Bạn vẫn có thể gửi cho người dùng bằng 'su -s / bin / bash git' hoặc bất cứ tên người dùng git nào của bạn.


2

Chúng tôi sử dụng shell psudo được gọi là scponly trên các máy chủ ftp an toàn của chúng tôi cho người dùng mà chúng tôi chỉ muốn có thể quét các tệp nhưng không đăng nhập.


2

Tôi đã tìm thấy một cách hay là sử dụng tính năng lệnh = "..." của tệp ủy quyền. (Đề xuất với tôi bởi trang này )

Lệnh bạn chạy sẽ là một lệnh kiểm tra các đối số bắt đầu bằng scp (và rsync).

Đây là tập tin ủy quyền:

# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew

Đây là nội dung của remote-cmd.sh:

#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
 'scp'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 'rsync'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 *)
    echo "Access Denied"
    ;;
esac

Tôi đoán có lẽ bạn vẫn cần bảo vệ tệp ủy quyền của người dùng, nhưng mục đích của tôi là có một khóa không có mật khẩu mà tôi có thể sử dụng để sao lưu, mà không phải tạo một người dùng hoàn toàn mới và có khóa không cung cấp vỏ (ok, dễ dàng)


3
Điều này khá thú vị - nhưng tôi tưởng tượng nó có thể bị phá vỡ bằng cách ban hành một lệnh thực hiện scp, sau đó chạy một kịch bản sau đó!
davidgo

@davidgo đang trả trước $ SSH_ORIGINAL_COMMAND với exec có thể giải quyết lỗ hổng đó, giả sử scp và rsync không cố gắng chạy nhiều chương trình (trong trường hợp này, điều này sẽ phá vỡ điều đó)
Phil

Ngoài ra, bạn nên thực hiện ~/.ssh/authorized_keys, ~/.bashrc(và bất cứ điều gì khác Bash thực thi) và chỉ ~/.ssh/rcđọc cho người dùng. Nhưng nếu người dùng độc hại có quyền truy cập vào rsync hoặc sftp, anh ta vẫn có thể xóa ~/.bashrcvà tải lên một cái mới. Vì nó khó bảo vệ, tôi khuyên bạn nên chống lại phương pháp này ( command="...").
pts

1
@pts bạn có thể tạo cả hai tệp RC và các thư mục chứa chúng thuộc sở hữu của một người nào đó không phải là người dùng (không ai?) và không thể ghi được bởi người dùng. Nhưng tại thời điểm này, bạn nên sử dụng một cái gì đó chuyên dụng như rssh. Wow, tôi chỉ nhận ra đây là câu trả lời của tôi! No cu! Haha!
Phil

Đừng quên rằng scp -S ...rsync -e ... cho phép người dùng thực thi các lệnh tùy ý. Vì vậy, bạn nên kiểm tra các đối số trong $ SSH_ORIGINAL_COMMAND trước khi thực hiện nó. Thêm thông tin tại đây: mining-db.com/Exloits/24795
pts

1

Thay đổi vỏ đăng nhập của người dùng thành một cái gì đó hạn chế, cho phép người dùng chỉ chạy scp , sftp-serverrsync , và nó cũng kiểm tra các đối số không an toàn không được phép (ví dụ: scp -S ...rsync -e .. . không an toàn, xem tại đây: http://Exloit-db.com/Exloits/24795 ). Ví dụ cho shell đăng nhập hạn chế như vậy:

Bạn có thể muốn chạy một trong những thứ này trong một chroot hoặc trong một môi trường bị hạn chế khác (ví dụ: nsjail trên Linux), để vô hiệu hóa truy cập mạng và để kiểm soát (danh sách trắng) dễ dàng hơn những thư mục nào có thể được đọc và / hoặc ghi.

Tôi không khuyên bạn sử dụng command="..."trong ~/.ssh/authorized_keys, bởi vì không có bảo vệ bổ sung cẩn thận (như chmod -R u-w ~cho người sử dụng) một người sử dụng độc hại có thể tải lên một phiên bản mới của ~/.ssh/authorized_keys, ~/.ssh/rchay ~/.bashrc, và do đó có thể bao gồm và thực hiện các lệnh tùy ý.


0

Đây không phải là giải pháp duyên dáng nhất, nhưng bạn có thể ném thứ gì đó như thế này vào người dùng .bashrc

if [ "$TERM"  != "dumb" ]; then
  exit
fi

Tôi đã phát hiện ra rằng người dùng SCP nhận được HẠN 'câm' và những người khác thường sẽ nhận được vt100.

Tôi tưởng tượng người dùng có thể tìm kiếm một .bashrc mới, điều này làm cho đây không phải là giải pháp tốt nhất, nhưng đối với một giải pháp nhanh và bẩn, điều này sẽ hoạt động


1
Tôi thực sự khuyên bạn nên chống lại giải pháp được đề xuất này, quá dễ để người dùng độc hại phá vỡ (ví dụ: bằng cách tải lên một giải pháp khác ~/.bashrc). Điều này cũng không ổn theo nghĩa là có thể các phiên bản mới hơn của OpenSSH sẽ đặt TERMbiến khác nhau hoặc một số cài đặt cấu hình sshd có thể ảnh hưởng TERM.
pts

1
Ơ ... ssh -o SetEnv TERM=dumb yourserver bash??
ulidtko
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.