Як я можу залучати користувачів SSH лише для sftp?


123

Я хочу надати клієнту доступ до мого сервера, але хочу обмежити цих користувачів їх домашніми каталогами. Я буду прив’язувати-монтувати в будь-які файли, які я хочу, щоб вони могли бачити.

Я створив користувача, який зателефонував, 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.
Франк Дернонкурт

Відповіді:


119

Весь цей біль завдяки ряду питань безпеки, як описано тут . В основному, каталог 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.04 я також повинен був змінити Subsystem sftp /usr/lib/openssh/sftp-serverлінію, Subsystem sftp internal-sftp -f AUTH -l VERBOSEперш ніж це працювало.
партовіче

57

Щоб chroot 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 може померти повторно, якщо розмістити його після рядка підсистеми):

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

3
це, здається, не працює. у вашому прикладі користувач johnзаблокований у /home/johnкаталозі. Ви надали 755дозволи до каталогу. тому власник прочитав (4), записав (2) та виконав (1), а група прочитала (4) та виконала (1). Ви також встановили власника та групу як root, тому johnналежить іншим. він також читав і виконує (4 + 1 = 5) тоді. тож ви замкнули Джона в каталог, де він не має пільг на запис. як це виправити? змінивши привілеї 757або навіть 777розірвав логін. зміна групи або власника на john також порушує вхід.
Даніель

також зауважте: в / etc / ssh / sshd_config конфігури читаються в порядку. Тож якщо у вас є загальне правило для користувачів, і ви хочете перезаписати одне з них, просто покладіть правило, яке стосується користувача.
rwenz3l

Я хочу хронізувати каталог SFTP в домашній папці іншого користувача. У мене є userx at /home/userx/sftproot/uploadsі sftpuser в / home / sftpuse. Я встановив chroot на, /home/usex/sftprootщоб він був власником root: root і chmod 755. Визначення /home/usex/sftproot/uploadsє chown-ed від sftpuser: sftpuser. Я отримую ту ж помилку, що і початкове запитання вище. Чи потрібно мати chroot та всі батьківські папки root: root, щоб sftp працював?
Primoz Rome

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/структура каталогу - це те, що змусило мене працювати в тому, щоб мати чисте рішення для запису 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папку, я зміг зробити так, щоб все працювало, не возившись з груповими дозволами.


1

Я дотримувався цієї статті, але це не спрацювало. Він почав працювати після того, як я вніс цю зміну (пропонується у відповідях вище):

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

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

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

ChrootDirectory %h

Я виявив це завдяки цьому посиланню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.