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

124

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

Я создал пользователя по имени 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@server
bob@server's password: 
Write failed: Broken pipe
Couldn'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 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob
Оли
источник
2
Я верю, что ChrootDirectory /home/%uможно заменить ChrootDirectory %h.
Франк Дернонкур

Ответы:

120

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

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

И БАМ, вы можете войти и написать /writable.

Оли
источник
3
Спасибо, действительно полезно. Две проблемы, хотя. 1.) Хотя я не могу писать, я все равно могу просматривать всю файловую систему. 2.) Изменение оболочки на / bin / false полностью предотвращает SFTP. Я делаю что-то неправильно?
kim3er
1
Спасибо! Многие другие статьи на эту тему пропускают эту деталь, а некоторые делают так, чтобы сервер не мог принимать соединения ssh (что отстой, когда вы на EC2 и ... это единственный способ).
Том Харрисон-младший
4
kim3er: это потому, что вам нужно установить оболочку пользователя в / sbin / nologin - / bin / false отключает любой вид доступа.
8
Я также хотел бы отметить, что все папки, которые ведут к вашей папке chroot, должны принадлежать root. В этом примере /homeтакже должен принадлежать root.
Шики
2
14 апреля мне также пришлось сменить Subsystem sftp /usr/lib/openssh/sftp-serverлинию, чтобы Subsystem sftp internal-sftp -f AUTH -l VERBOSEэто сработало.
15:44
57

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

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

    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. Измените расположение подсистемы в / etc / ssh / sshd_config:

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

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

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
josircg
источник
3
это не похоже на работу. в вашем примере пользователь johnзаблокирован для /home/johnкаталога. вы предоставили 755разрешения для каталога. поэтому владелец прочитал (4), записал (2) и выполнил (1), а группа прочитала (4) и выполнила (1). Вы также устанавливаете владельца и группу как root, так что johnпринадлежит другим. он также прочитал и выполнил (4 + 1 = 5) тогда. так что вы заперли Джона в каталог, где у него нет прав на запись. как это исправить? изменение привилегий 757или даже 777прерывание входа в систему. изменение группы или владельца на джона также нарушает вход в систему.
Даниэль
Также обратите внимание: в / etc / ssh / sshd_config конфиги читаются по порядку. Поэтому, если у вас есть правило для пользователей в целом, и вы хотите перезаписать одно из них, просто поместите пользовательское правило поверх.
rwenz3l
Я хочу изменить каталог SFTP в домашней папке другого пользователя. У меня есть userx в /home/userx/sftproot/uploadsи sftpuser в / home / sftpuse. Я установил, что chroot /home/usex/sftprootдолжен принадлежать root: root и chmod 755. Он /home/usex/sftproot/uploadsсоздан sftpuser: sftpuser. Я получаю ту же ошибку, что и первоначальный вопрос выше. Нужно ли, чтобы chroot и все родительские папки принадлежали root: root, чтобы sftp работал?
Примоз Рим
6

Я провел весь день, пытаясь получить сетевую папку на моей малине. Я хотел заблокировать пользователя, чтобы он не мог перемещаться по всей файловой системе, не иметь доступа по 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/структура каталогов - это то, что заставило меня работать с чистым доступным для записи решением ssh для chroot .

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

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

Посмотрев на вышеупомянутые решения (и многие другие в сети, которые даже использовали 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папку, я смог заставить все работать, не вмешиваясь в групповые разрешения.

mihai.ile
источник
1

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

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

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

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

ChrootDirectory %h

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

user109764
источник