Увімкніть доступ до оболонки SSH, але вимкніть SFTP-доступ


21

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

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

Тепер ось проблема: Якщо я надам користувачам SSH доступ, вони також зможуть увійти за допомогою клієнта SFTP, який надасть їм прямий доступ до каталогів даних для додатка, що ДУЖЕ небажано, оскільки це також дасть вони отримують доступ до каталогів даних, до яких вони не повинні мати доступу.

Це було так просто, що потрібно робити при використанні комбінації telnet / FTP, але тепер, коли я хочу надати користувачам доступ з будь-якої точки Інтернету, я не зміг знайти спосіб вимкнути їх із SFTP, тоді як і надалі їм доступ до оболонки, де вони можуть запускати додаток.


8
Я забуваю деталі, але я думаю, що SSH дозволяє обмежити користувачів виконувати одну команду під час входу. Вони не отримують повного доступу до оболонки, якщо ви налаштували це. Це може бути корисно для вашого випадку використання. (Зрештою, можна емулювати доступ до SFTP за допомогою SSHFS. Просто відключення SFTP не перешкоджатиме помірковано визначеному користувачу потрапляти до будь-якого файлу, до якого має доступ їх обліковий запис користувача.)
David Z

3
Крім того, ви можете розглянути питання про "хротування" своїх користувачів. а для доступу до запасних даних це виглядає як проблема дизайну
Dennis Nolte

2
Використання .profileдля цього звучить як неправильне рішення. Я вважаю, що налаштування користувача на альтернативну оболонку буде мати набагато більше сенсу.
kasperd

3
Не намагайтеся використовувати .profileфокус для обмеження доступу, оскільки це банально обійти. (див. мою відповідь для деталей)
Алексі Торхамо

Відповіді:


22

Редагувати:

Якщо це не очевидно, наступний варіант відповіді не призначений як захищений метод запобігання використанню SFTP будь-ким, хто має доступ до оболонки до сервера. Це лише відповідь, яка пояснює, як відключити його від зовнішньої видимості. Для обговорення безпеки користувачів див. Відповіді від @cpast та @Aleksi Torhamo. Якщо у вашій увазі безпека, ця відповідь не є правильною. Якщо простий сервіс visibiliy - це ваша увага, то це ваша відповідь.

Тепер продовжуємо оригінальну відповідь:


Прокоментуйте підтримку sftp в sshd_config (і звичайно перезапустити sshd):

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


1
Іноді лінія може бутиSubsystem sftp internal-sftp
Кондібас

1
Я маю, Subsystem sftp /usr/libexec/sftp-server але це зробило трюк. Дуже дякую
sosaisapunk

16
Це не звучить правдоподібно. Якщо ви можете виконувати довільні команди на сервері, ви можете виконати програму sftp на стороні сервера. Навіть якщо він не встановлений, ви можете повторно реалізувати його як довгу команду оболонки і змусити клієнта sftp відправити цю команду замість sftp. Цей спосіб може зробити менш зручним використання sftp, але немає жодного способу запобігти користувачеві, який може запускати довільні команди, використовувати ці команди для передачі файлів.
Р ..

1
@sosaisapunk Це неправда. Користувачі можуть запускати будь-яку команду, яку хочуть, використовуючи ssh user@host command, оскільки вона .profileвзагалі не буде запущена, якщо ви це зробите, і, отже, ваша програма взагалі не запуститься. Вони можуть отримати повний доступ до оболонки просто кажучи ssh -t user@host bash. Просто спробуйте, і ви побачите. Підсистема - це лише псевдонім команд; якщо вони раніше могли використовувати sftp, вони все ще можуть використовувати його - і будь-яку іншу команду, яку вони хочуть. Прочитайте мою відповідь нижче.
Алексі Торхамо

1
@sosaisapunk: Справа в тому, що ви можете це зробити за допомогою ssh, але не з тим .profile, що це не призначено для безпеки і його легко обійти. У своїй відповіді я перерахував три різні методи робити це з ssh. Коротше кажучи, просто перенесіть виклик свого додатка .profileна сценарій оболонки і будь-який 1) встановіть сценарій оболонки як оболонку користувача 2) встановіть сценарій оболонки як (правильно підібраний) ForceCommandу sshd_config3) перемкніть на аутентифікацію відкритого ключа та встановіть скрипт оболонки як commandв .ssh/authorized_keys. (Також слід використовувати @name, щоб люди отримували сповіщення про коментарі)
Aleksi Torhamo

28

Як уже згадували інші, відключення sftpне є десь близьким - користувач з необмеженим sshдоступом може переглядати будь-який файл, на який в їх обліковому записі є дозволи на перегляд, може змінювати все, що вони мають дозвіл на зміну, і може легко завантажувати все, що вони можуть прочитати на свій власний. машина. Єдиний спосіб не допустити цього - фактично обмежити їх доступ. Також не ідеально покладатися на .profileобмеження користувачів, оскільки це не для чого (Правка: Як Алексі зазначає у своїй відповіді, насправді тривіально обійти .profile; справа в .profileтому, що це для зручності, а не для безпеки, тому це не так призначений для обмеження користувача. Для забезпечення безпеки використовуйте речі, розроблені для безпеки, як, наприклад, нижче).

Є два основні способи зробити це: ви можете обмежити їх через дозволи файлів або змусити їх виконувати лише ваш консольний додаток. Другий спосіб кращий: призначте групу користувачів, які повинні бути обмежені консольним додатком (наприклад customers); потім sshd_configдодайте наступні рядки:

Match Group customers
ForceCommand /path/to/app

Для цього потрібно зробити так, щоб усі з'єднання користувачів цієї групи відкривали консольний додаток; вони не можуть запустити нічого іншого, включаючи sftpсерверний інструмент. Це також заважає їм робити що-небудь інше з системою, і на відміну від .profileцього, використовуючи сам сервер SSH ( .profileобмежує їх в оболонці, ForceCommandтакож запобігає виконанню інших речей, які не передбачають запуск оболонки). Також на відміну від .profileцього, це розроблено як річ безпеки; він спеціально створений для того, щоб протистояти шкідливому користувачеві його ухилення.

(Ймовірно, нижча) альтернатива передбачає створення нового користувача для запуску консольного додатка. Потім ви обмежите каталоги даних цим користувачем, встановіть консольний додаток, який належить цьому користувачеві, і встановіть u+sпрограму. Це setuidбіт; це означає, що хтось, хто запускає консольну програму, робить це з дозволами власника програми. Таким чином, користувач сам не має доступу до каталогів, вони отримують його лише через програму. Однак вам, мабуть, варто просто скористатися ForceCommand, оскільки це обмежує весь доступ до "просто запустити цю програму".


4
Я хотів би додати, що ForceCommandне заважає переадресації портів SSH.
nyuszika7h

1
Власне, покладатися на .profileбільш ніж "не ідеально"; його легко обійти (детальніше див. мою відповідь) і, таким чином, не забезпечується ніякого захисту, лише помилкове почуття безпеки.
Алексі Торхамо

@AleksiTorhamo Ах. Я підозрював, що ви можете його обійти, але не був певний, як (я, як правило, підозрюю, що речі, не призначені для безпеки, є обхідними). Дякую за деталі про те, як!
cpast

15

Не намагайтеся це робити, .profileоскільки це не забезпечує ніякої безпеки і абсолютно нічого не обмежує!

Це не має значення , що ви поклали в .profile, так як ви можете обійти це, просто даючи команду для запуску в командному рядку SSH, наприклад: ssh user@host command. Ви все одно можете отримати звичайний доступ до оболонки, зробивши це ssh -t user@host bash.

Вимкнення підсистеми sftp, як це було зазначено в іншій відповіді, зовсім не допомагає. Підсистеми по суті є лише псевдонімами команд, і ви все одно можете нормально використовувати sftp sftp -s /path/to/sftp-executable user@host.

Як сказали cpast та деякі коментатори, вам слід використовувати належні механізми обмеження доступу. Це є,

  • Використання ForceCommandвsshd_config
  • Використовуйте безпарольний логін і command="..."в.ssh/authorized_keys
  • Змініть оболонку користувача на щось, що обмежує те, що може робити користувач

Примітки:

  • command="..." застосовується лише для одного ключа, тому він не обмежує вхід для ssh для користувача, використовуючи пароль або інший ключ
  • Ви також можете обмежити переадресацію портів і т. Д. (Переадресація портів, перенаправлення x11, переадресація агента та розподіл pty - це ті, про які я чув)
    • AllowTcpForwarding тощо в sshd_config
    • no-port-forwarding тощо в .ssh/authorized_keys
  • Якщо у вас запущені інші демони (наприклад, FTP), ви повинні переконатися, що вони не впускають користувача (Деякі демони приймають це рішення на основі оболонки користувача, тому, якщо ви зміните це, ви можете повторно перевірити це)
  • Ви можете змінити оболонку користувача на сценарій, який виконує те, що ви хочете; це або працювати без аргументів, або подібнеscript -c 'command-the-user-wanted-to-run'
  • Обидва ForceCommandі command="..."виконують команду через оболонку користувача, тому вони не працюють, якщо для оболонки користувача встановлено наприклад. /bin/falseабо/sbin/nologin

Відмова: Я не є експертом у цьому питанні будь-якими способами, тому, хоча можу сказати, що .profileріч не є безпечною, я не можу пообіцяти, що не існує певного "хатча" з іншими методами, про які я не знаю о. Наскільки я знаю, вони безпечні, але я б не був першим, хто помилявся в Інтернеті.


1
Здається, що принаймні для ForceCommandі примусового безкористувального входу command=в систему, в authorized_keysтой час як він був обхідний раніше, це пов’язано з помилкою на сервері: він призначений для захисту від зловмисного користувача, а користувач, який обходить його, вважає серйозною вразливістю на сервері SSH (і, таким чином, є пріоритетним виправленням). Як ви .profileзазначаєте, проект може бути обійдений: оскільки це не вважається функцією безпеки, користувач, який обходить його, ідеально добре з точки зору розробника оболонки.
cpast

1
@cpast: Так, я думав про існування таких функцій, як переадресація портів. Я маю на увазі, якщо ви не знали, що ssh дозволяє переадресацію портів і використовувався лише ForceCommandдля обмеження доступу, і у вас демон, який слухає з'єднання лише локально і не виконує автентифікацію, користувач ssh все одно може отримати доступ до демона. Перераховані я функції є такими, наприклад. Рішення для git-хостингу зазвичай вимикаються, і я не бачив жодних додаткових «злісних» на мапах, але я не знайшов жодного офіційного типу «саме так ви ForceCommandбезпечно використовуєте » -документ ще немає.
Алексі Торхамо

Справді ~/.profile, користувач може редагувати і не корисний для безпеки, але чи можете ви зробити техніку cpast значущою, ввівши її /etc/profile? Ви можете перевірити UID, щоб обмежити його потрібними користувачами.
пташенята

1
@chicks: Ні, це точно така ж проблема. Проблема не в тому, що файл редагується користувачем; Проблема полягає в тому, що обидва файли можна повністю обійти. Файли використовуються лише для оболонок для входу, які ви отримуєте, якщо просто скажете ssh user@host, але якщо ви скажете ssh виконати команду - тобто. ssh user@host command- ви більше не отримуєте оболонку входу, і файли взагалі не торкаються. Таким чином, ви можете тривіально обходити будь-які обмеження, які хтось намагався створити за допомогою файлів, просто надавши додатковий аргумент ssh.
Алексі Торхамо

2
@chicks: Також я щойно зрозумів, що ви посилаєтесь на cpast; метод у відповіді cpast не використовує .profile, він використовує sshd_configі повинен бути безпечним. Він згадує .profileлише метод, який ви не повинні використовувати для цього.
Алексі Торхамо

1

Можна включити SSH та відключити SFTP як у всьому світі, так і за користувачем / групою.

Мені особисто це потрібно, тому що я хочу надати доступ до деяких сховищ git через SSH, і мені подобається відключати системи, які не потрібні. У такому випадку SFTP не потрібен.

В усьому світі

Ви можете відключити SFTP для всіх користувачів кількома способами.

Відсутня підсистема

Демон SFTP, використовуваний SSH, може бути налаштований за допомогою Subsystemключового слова. З sshd_config(5)посібника:

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

Останній рядок говорить про те, що його повинно вистачити, щоб не визначати жодну підсистему для "sftp".

Неправдива брехня

Ви також можете відключити SFTP, встановивши демон SFTP, який використовується SSH, на щось непридатне. Наприклад, налаштуйте підсистему "sftp" на /bin/false:

Subsystem sftp /bin/false

Коли щось намагатиметься увійти через SFTP, демон SSH намагатиметься породити "sftp демон" /bin/false. /bin/falseПрограма робить тільки одну річ, і це повертає код помилки. Спроба з'єднання SFTP фактично заперечується.

На кожного користувача / групу

Також можна відключити SFTP на користувача, групу чи пару інших критеріїв.

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

Узгодження

Щоб відповідати набору користувачів, ви можете налаштувати SSH з Matchключовим словом. З sshd_config(5)посібника:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Кілька прикладів:

  • Match User eva відповідає користувачеві "eva"
  • Match User stephen,maria відповідає користувачам "stephen" та "maria"
  • Match Group wheel,adams,simpsons відповідає групам "колесо", "Адамс", "Сімпсон"

Якщо ви хочете отримати додаткову інформацію, у sshd_config(5)посібнику є вантажі .

Примусова команда

Зазвичай ви отримуєте оболонку входу користувача під час підключення через SSH, але SSH може бути налаштований так, щоб форсувати певну команду. Команда вимушена для будь-якого з'єднання SSH, включаючи SFTP, і, таким чином, у вас може бути можливість застосувати потрібну команду.

Команду for force можна налаштувати за допомогою ForceCommandключового слова. З sshd_config(5)посібника:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Таким чином, ви можете примусити обмежену команду, яку ви хочете використовувати ForceCommand <your command>. Наприклад:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Приклад

У моєму випадку, коли я хочу надати доступ до git, мені потрібен лише користувач, щоб мати доступ до нього git-shell. Це розділ, який відключає SFTP для моїх користувачів git, а також деякі параметри безпеки:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

У моєму випадку я хотів дозволити доступ до MySQL (забороняючи доступ до SFTP та вікон терміналів SSH) для певного дозволеного ключа (тобто, жодних змін у файлі sshd_config). Мені вдалося це зробити за допомогою наступних параметрів ~ / .ssh / pooblasti_keys для конкретного ключа: command = "/ usr / bin / echo" Доступний лише доступ до MySQL. " = "127.0.0.1:3306"
Martin_ATS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.