Làm cách nào tôi có thể chroot người dùng SSH chỉ sftp vào nhà của họ?


124

Tôi muốn cấp cho khách hàng quyền truy cập vào máy chủ của mình, nhưng tôi muốn giới hạn những người dùng đó vào thư mục nhà của họ. Tôi sẽ liên kết gắn kết trong bất kỳ tệp nào tôi muốn chúng có thể xem.

Tôi đã tạo một người dùng được gọi bobvà thêm anh ta vào một nhóm mới được gọi sftponly. Họ có một thư mục nhà tại /home/bob. Tôi đã thay đổi vỏ của họ /bin/falseđể dừng đăng nhập SSH. Đây là /etc/passwddòng của họ :

bob:x:1001:1002::/home/bob:/bin/false

Tôi cũng đã thay đổi /etc/ssh/sshd_configđể bao gồm những điều sau đây:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Khi tôi cố gắng đăng nhập như họ, đây là những gì tôi thấy

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Nếu tôi nhận xét ChrootDirectorydòng tôi có thể SFTP nhưng sau đó họ có quyền tự do trên máy chủ. Tôi đã tìm thấy nó ChrootDirectory /homehoạt động, nhưng nó vẫn cung cấp cho họ quyền truy cập vào bất kỳ thư mục nhà. Tôi đã cố gắng rõ ràng ChrootDirectory /home/bobnhưng điều đó cũng không hoạt động.

Tôi đang làm gì sai? Làm thế nào tôi có thể giới hạn bobđể /home/bob/?

----BIÊN TẬP-----

Được rồi vì vậy tôi chỉ cần nhìn /var/log/auth.logvà thấy điều này:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Tôi không hoàn toàn chắc chắn những gì đang diễn ra ở đó, nhưng nó cho thấy có gì đó không ổn với thư mục người dùng. Đây là ls -h /homeđầu ra:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

2
Tôi tin rằng ChrootDirectory /home/%ucó thể được thay thế ChrootDirectory %h.
Franck Dernoncourt

Câu trả lời:


120

Tất cả nỗi đau này là nhờ một số vấn đề bảo mật như được mô tả ở đây . Về cơ bản, thư mục chroot phải được sở hữu rootvà không thể là bất kỳ quyền truy cập ghi nhóm nào. Đáng yêu. Vì vậy, về cơ bản bạn cần phải biến chroot của bạn thành một ô giữ và trong đó bạn có thể có nội dung có thể chỉnh sửa của mình.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

Và bam, bạn có thể đăng nhập và viết /writable.


3
Cảm ơn bạn thực sự hữu ích. Hai vấn đề mặc dù. 1.) Mặc dù tôi không thể viết, tôi vẫn có thể duyệt toàn bộ hệ thống tập tin. 2.) Thay đổi shell thành / bin / false ngăn chặn hoàn toàn SFTP. Tôi có làm điều gì sai?
kim3er

1
Cảm ơn bạn! Nhiều bài viết khác về chủ đề này bỏ lỡ chi tiết này, và một số bài viết khiến máy chủ không thể chấp nhận các kết nối ssh (loại này rất tệ khi bạn sử dụng EC2 và ... đó là cách duy nhất).
Tom Harrison Jr

4
kim3er: điều này là do bạn cần đặt shell của người dùng thành / sbin / nologin - / bin / false sẽ vô hiệu hóa mọi loại quyền truy cập.

8
Tôi cũng muốn lưu ý rằng tất cả các thư mục dẫn đến thư mục chroot của bạn nên được sở hữu root. Trong ví dụ này, /homecũng nên được sở hữu bởi root.
Shiki

2
Vào ngày 14.04, tôi cũng phải đổi Subsystem sftp /usr/lib/openssh/sftp-serverdòng Subsystem sftp internal-sftp -f AUTH -l VERBOSEtrước khi nó hoạt động.
tham gia vào

57

Để chroot một thư mục SFTP, bạn phải

  1. Tạo người dùng và buộc root phải là chủ sở hữu của nó

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. Thay đổi vị trí hệ thống con trên / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    và tạo một phần người dùng ở cuối tệp (ssh có thể chết trong quá trình hồi sinh nếu được đặt sau dòng Hệ thống con):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
điều này dường như không hoạt động. trong ví dụ của bạn, người dùng johnbị khóa vào /home/johnthư mục. bạn đã cấp 755quyền cho thư mục. vì vậy chủ sở hữu đã đọc (4), viết (2) và thực hiện (1) và nhóm đã đọc (4) và thực hiện (1). bạn cũng đã đặt chủ sở hữu và nhóm là root, vì vậy johnthuộc về người khác. anh cũng đã đọc và thực hiện (4 + 1 = 5) rồi. Vì vậy, bạn đã khóa john vào một thư mục mà anh ta không có đặc quyền ghi. Làm thế nào để khắc phục điều này? thay đổi đặc quyền để 757hoặc thậm chí 777phá vỡ đăng nhập. thay đổi nhóm hoặc chủ sở hữu thành john cũng phá vỡ đăng nhập.
Daniel

cũng cần lưu ý: trong / etc / ssh / sshd_config các cấu hình được đọc theo thứ tự. Vì vậy, nếu bạn có một quy tắc cho người dùng nói chung và bạn muốn ghi đè lên một trong số họ, chỉ cần đặt quy tắc dành riêng cho người dùng lên hàng đầu.
rwenz3l

Tôi muốn chroot một thư mục SFTP trong một số thư mục nhà của người dùng khác. Tôi đã userx tại /home/userx/sftproot/uploadsvà sftpuser tại / home / sftpuse. Tôi đã đặt chroot tại /home/usex/sftprootđể được sở hữu bởi root: root và chmod 755. /home/usex/sftproot/uploadsĐược chft-ed bởi sftpuser: sftpuser. Tôi nhận được lỗi tương tự như câu hỏi ban đầu ở trên. Có phải chroot và tất cả các thư mục mẹ cần được sở hữu bởi root: root để sftp hoạt động?
Primoz Rome

6

Tôi đã dành cả ngày để cố gắng để có được một chia sẻ mạng trên quả mâm xôi của tôi. Tôi muốn khóa người dùng để nó không thể điều hướng trong toàn bộ hệ thống tệp, không có quyền truy cập đăng nhập ssh và tôi muốn có quyền truy cập ghi vào chia sẻ mạng.

Và đây là cách tôi làm cho nó hoạt động:

Đầu tiên tôi tạo một người dùng:

sudo useradd netdrive

Sau đó chỉnh sửa /etc/passwdvà đảm bảo rằng nó có /bin/falsecho người dùng, vì vậy dòng này là:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Tôi đã chỉnh sửa /etc/ssh/sshd_configđể bao gồm:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Thay đổi chủ sở hữu thư mục nhà và quyền:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok, sau tất cả những điều này tôi đã có thể kết nối bằng cách sử dụng sshfsnhưng ở chế độ chỉ đọc. Tôi phải làm gì để có được một thư mục có thể ghi:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Đó là nó, nó làm việc mà không có bất kỳ thay đổi nào. Lưu ý rằng tôi chỉ có quyền ghi cho người dùng , không cho nhóm như nhiều giải pháp trực tuyến khác. Tôi đã có thể tạo / xóa / chỉnh sửa / đổi tên tập tin / thư mục mà không gặp vấn đề gì.

Khi truy cập vào sử dụng sshfsvới Netdrive sử dụng vì cấu hình chroot Tôi sẽ chỉ nhìn thấy mọi thứ được lưu trữ bên trong máy chủ của /home/netdrive/thư mục, hoàn hảo. /home/netdrive/home/netdrive/Cấu trúc thư mục lặp đi lặp lại là những gì làm cho nó hoạt động với tôi trong việc có một giải pháp có thể ghi ssh chroot sạch .

Bây giờ tôi sẽ giải thích bên dưới những vấn đề tôi gặp phải:

Bạn có thể không nên thực hiện các đoạn sau :

Sau khi xem các giải pháp trên (và nhiều giải pháp khác trên mạng thậm chí đã sử dụng acl (danh sách kiểm soát truy cập)) tôi vẫn không thể làm cho nó hoạt động được vì những gì tôi làm tiếp theo là:

Những điều sau đây KHÔNG làm việc cho tôi:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Bởi vì người dùng netdrive vẫn không thể ghi vào /home/netdrive/writable/thư mục đó mặc dù sở hữu thư mục và có quyền. Sau đó, tôi đã làm: sudo chmod 775 / home / netdrive / writable / Và bây giờ tôi có thể tạo một thư mục và xóa nó nhưng tôi không thể chỉnh sửa nó vì nó được tạo mà không có quyền ghi nhóm. Ở đây từ những gì tôi thấy trên mạng mọi người sử dụng aclđể sửa nó. Nhưng tôi không hài lòng với điều đó vì tôi phải cài đặt acl, sau đó định cấu hình các điểm gắn kết, v.v. Ngoài ra tôi không biết tại sao tôi lại cần quyền của nhóm để ghi vào một thư mục thuộc sở hữu của cùng một người dùng.

Dường như vì một số lý do tạo /home/netdrive/home/netdrivevà trao quyền sở hữu cho netdrivethư mục cuối cùng, tôi có thể làm mọi thứ hoạt động mà không bị rối với quyền của nhóm .


1

Tôi đi theo này bài viết nhưng nó làm việc. Nó bắt đầu hoạt động sau khi tôi thực hiện thay đổi này (được đề xuất trong các câu trả lời ở trên):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Plus đã tạo thư mục gốc có thể sở hữu gốc, theo đó tôi có thư mục con có thể ghi được (như được mô tả ở trên).

Điều mới và hữu ích tôi muốn thêm vào với câu trả lời này là bạn có thể đơn giản hóa cấu hình chỉ bằng cách chỉ định% h là thư mục gốc của người dùng:

ChrootDirectory %h

Tôi đã phát hiện ra nó nhờ liên kết này .

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.