Как я могу заблокировать SSH-пользователей только для sftp в их домах?

Я хочу предоставить клиенту доступ к моему серверу, но я хочу ограничить этих пользователей их домашними каталогами. Я буду привязывать-монтировать любые файлы, которые я хочу, чтобы они могли видеть.

Я создал пользователя с именем bob и добавил его в новую группу под названием sftponly. У них есть домашний каталог по адресу /home/bob. Я изменил их оболочку на /bin/false чтобы остановить вход в систему по SSH. Вот их /etc/passwd линия:

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

Я также изменил /etc/ssh/sshd_config чтобы включить следующее:

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

Когда я пытаюсь войти в систему под их именем, вот что я вижу

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

Если я прокомментирую ChrootDirectory линия, в которой я могу подключиться к SFTP, но тогда у них есть свобода действий над сервером. Я обнаружил, что ChrootDirectory /home работает, но это по-прежнему дает им доступ к любому домашнему каталогу. Я явно пытался ChrootDirectory /home/bob но это тоже не работает.

Что я делаю не так? Как я могу ограничить bob к /home/bob/?

---- РЕДАКТИРОВАТЬ-----

Хорошо, я только что взглянул на /var/log/auth.log и увидел это:

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

Я не совсем уверен, что там происходит, но это говорит о том, что что-то не так с пользовательским каталогом. Вот ls -h /home выход:

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

Вся эта боль возникает из-за нескольких проблем безопасности, таких как описано здесь. В основном каталог chroot должен принадлежать root и не может быть никакого группового доступа на запись. Прекрасный. Таким образом, вам, по сути, нужно превратить свой chroot в камеру хранения и внутри тот у вас может быть свой редактируемый контент.

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

И бац, вы можете войти в систему и написать в /writable.

Чтобы удалить каталог SFTP, вы должны

  1. Создайте пользователя и заставьте root быть его владельцем

    sudo mkdir /home/johnuseradd -d /home/john -M -N -g users johnsudo chown root:root /home/johnsudo chmod 755 /home/john
  2. Измените расположение подсистемы на /etc/ssh/sshd_config:

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

    и создайте раздел пользователя в конце файла (ssh может умереть при возрождении, если его поместить после Подсистема линия):

    Match User john    ChrootDirectory %h    ForceCommand internal-sftp    AllowTCPForwarding no    X11Forwarding no

Я потратил целый день, пытаясь получить доступ к сетевому ресурсу на своей raspberry.Я хотел заблокировать пользователя, чтобы он не мог перемещаться по всей файловой системе, не имел доступа для входа по ssh, и я хотел иметь доступ на запись к общему сетевому ресурсу.

И вот как я заставил это работать:

Сначала я создал пользователя:

sudo useradd netdrive

Затем отредактированный /etc/passwd и убедился, что у него есть /bin/false для пользователя, чтобы строка была:

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

Я отредактировал /etc/ssh/sshd_config включать:

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

Изменен владелец домашнего каталога и разрешения:

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

Итак, после всего этого я смог подключиться с помощью sshfs но в режиме только для чтения. Что мне нужно было сделать, чтобы получить доступную для записи папку:

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

Вот и все, это сработало без каких-либо дальнейших изменений. Обратите внимание, что у меня есть только права на запись для пользователь, а не к группа как и многие другие онлайн-решения. Я смог создавать / удалять / редактировать / переименовывать файлы / папки без проблем.

При доступе с помощью sshfs с netdrive пользователя из-за конфигурации chroot я бы видел только вещи, хранящиеся внутри сервера /home/netdrive/ каталог, идеально. Повторяющийся /home/netdrive/home/netdrive/ структура каталогов - это то, что заставило меня работать в чистом chroot ssh доступен для записи решение.

Теперь я собираюсь объяснить ниже проблемы, с которыми я столкнулся:

Вероятно, вам не следует выполнять следующие пункты:

Посмотрев на вышеупомянутые решения (и многие другие в сети, которые даже использовали acl (списки контроля доступа)) Я все еще не мог заставить его работать, потому что то, что я сделал дальше, было:

Следующее сделало НЕ работай на меня:

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

Потому что netdrive пользователь все еще не мог писать в этом /home/netdrive/writable/ каталог, несмотря на владение папкой и наличие соответствующих разрешений. Затем я сделал: sudo chmod 775 / home / netdrive / writable /, И теперь я мог создать каталог и удалить его, но я не смог его отредактировать, потому что он создавался без групповых разрешений для записи. Вот из того, что я видел в сети, люди используют acl чтобы исправить это. Но я не был доволен этим, так как мне пришлось его установить acl, затем настройте точки монтирования и т.д. Кроме того, я понятия не имею, зачем мне это нужно группа разрешение на запись в папку, принадлежащую тому же пользователю.

Кажется, что по какой-то причине создание /home/netdrive/home/netdrive и передача права собственности последнему netdrive папку, я смог заставить все работать, не возясь с группа разрешения.

Я последовал за ним этот статью, но это не сработало.Он начал работать после того, как я внес это изменение (предложенное в приведенных выше ответах):

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

Плюс создал корневой собственный домашний каталог, в котором у меня был подкаталог, доступный для записи пользователем (как описано выше).

Новая и полезная вещь, которую я хочу добавить в этот ответ, заключается в том, что вы можете упростить конфигурацию, просто указав % h в качестве домашнего каталога пользователя:

ChrootDirectory %h

Я обнаружил это благодаря этот ссылка.

Я создал сценарий из ответа @Oli:

#!/bin/bash# 1. adds a user to the group sftponly, which have only access to their home directory# 2. creates a writable folder in the users home directory# 3. mounts a folder into the users home directory with bind# see https://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homesif [ "$1" == "" ]; then  echo "usage: $0 [username] [path to share] [local foldername]"  exit 0fiU=$1if [ "$2" == "" ]; then  echo "no 2. param path to share given (without trailing slash)"  exit 0fiPATH_TO_SHARE="$2"if [ "$3" == "" ]; then  echo "no 3. param local foldername given"  exit 0fiLOCAL_FOLDER_NAME="$3"set -exadduser $Uadduser $U sftponlysudo chown root /home/$Usudo chmod go-w /home/$Usudo mkdir /home/$U/writablesudo chown $U:sftponly /home/$U/writablesudo chmod ug+rwX /home/$U/writablemkdir -p "/home/$U/$LOCAL_FOLDER_NAME/"mount --bind "$PATH_TO_SHARE/" "/home/$U/$LOCAL_FOLDER_NAME/"echo "$PATH_TO_SHARE/ /home/$U/$LOCAL_FOLDER_NAME/ none defaults,bind 0 0">>/etc/fstab

Я полагаю, что ChrootDirectory /home/%u можно заменить ChrootDirectory %h.