Я искал жизнеспособный ответ на этот вопрос, и большинство ответов содержат советы о том, почему не следует этого делать. Тем не менее, вот сценарий, и что делает это необходимым:
У меня есть консольное приложение, и в .profile каждого пользователя есть команда запуска для приложения, и непосредственно после команды, которая его запускает, есть команда «exit», которая выводит их из системы. Я только хочу, чтобы они могли получить доступ к этому консольному приложению через предоставленный им интерфейс. После запуска приложение предоставляет пользователю список клиентов, к которым можно получить доступ через приложение, причем каждый клиент имеет свой собственный каталог данных. Пользователям предоставляется доступ только к тем клиентам, к которым им потребуется доступ.
Теперь вот проблема: если я предоставлю пользователям доступ по SSH, они также смогут войти в систему с помощью SFTP-клиента, что даст им прямой доступ к каталогам данных для приложения, что ОЧЕНЬ нежелательно, так как это также даст им доступ к каталогам данных, к которым у них не должно быть доступа.
Это было так просто сделать при использовании комбинации telnet / FTP, но теперь, когда я хочу предоставить пользователям доступ из любого места в Интернете, я не смог найти способ отключить их от SFTP, хотя по-прежнему позволяя им получить доступ к оболочке, где они могут запустить приложение.
.profile
для этого звучит как неправильное решение. Я полагаю, что установка пользователя с альтернативной оболочкой имела бы гораздо больше смысла..profile
хитрость, чтобы ограничить доступ, поскольку это тривиально, чтобы обойти. (подробности см. в моем ответе)Ответы:
Редактировать:
В случае, если это не очевидно, следующий ответ не предназначен как безопасный метод предотвращения использования SFTP кем-либо, имеющим доступ к серверу. Это просто ответ, который объясняет, как отключить его от внешней видимости. Обсуждение безопасности на уровне пользователя смотрите в ответах @cpast и @Aleksi Torhamo. Если безопасность находится в центре вашего внимания, этот ответ не является правильным. Если ваше внимание сосредоточено на простом обслуживании, то это ваш ответ.
Теперь перейдем к исходному ответу:
Закомментируйте поддержку sftp в sshd_config (и, конечно, перезапустите
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
источник
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Но это добилось цели. Большое спасибоssh user@host command
, поскольку.profile
, если вы это сделаете, она вообще не будет запускаться, и, следовательно, ваше приложение вообще не запустится. Они могут получить полный доступ к оболочке, просто сказавssh -t user@host bash
. Просто попробуйте, и вы увидите. Подсистема - это просто псевдоним команды; если бы они могли использовать sftp раньше, они все равно могли бы использовать его - и любую другую команду, которую они хотят. Прочитайте мой ответ ниже..profile
поскольку он не предназначен для безопасности и его легко обойти. В своем ответе я перечислил три разных способа сделать это с помощью ssh. Короче говоря, просто переместите вызов вашего приложения из.profile
сценария оболочки и либо 1) установите сценарий оболочки в качестве оболочки пользователя 2) установите сценарий оболочки как (правильно подобранный)ForceCommand
вsshd_config
3) переключитесь на аутентификацию с открытым ключом и установите скрипт оболочки какcommand
в.ssh/authorized_keys
. (Кроме того, вы должны использовать @name, чтобы люди получали уведомления о комментариях)Как уже упоминали другие, отключение
sftp
далеко не достаточно - пользователь с неограниченнымssh
доступом может просматривать любой файл, доступ к которому имеет его учетная запись, может изменять все, что он имеет право изменять, и может легко загружать все, что он может читать, для своих собственных машина. Единственный способ помешать им сделать это - фактически ограничить их доступ. Также не стоит полагаться на.profile
ограничение пользователей, поскольку это не то, для чего это (Правка: как упоминает Алекси в своем ответе, на самом деле тривиально обойтись.profile
; суть в том,.profile
что это для удобства, а не безопасности, поэтому это не так. предназначен для ограничения пользователей. Используйте средства, разработанные для обеспечения безопасности (например, приведенные ниже, для обеспечения безопасности).Есть два основных способа сделать это: вы можете ограничить их с помощью прав доступа к файлу или заставить их выполнять только ваше консольное приложение. Второй способ лучше: назначить группу пользователей, которые должны быть ограничены консольным приложением (например
customers
); затемsshd_config
добавьте следующие строки:Это делает так, чтобы все соединения от пользователей в этой группе открывали консольное приложение; они не могут запускать что-либо еще, включая
sftp
инструмент сервера. Это также мешает им делать что - либо еще с системой, и, в отличие от этого.profile
, делает это с использованием самого SSH-сервера (.profile
ограничивает их в оболочке, аForceCommand
также предотвращает другие действия, не связанные с запуском оболочки). Также в отличие от.profile
этого, это разработано как вещь безопасности; это специально сделано, чтобы противостоять злоумышленнику, уклоняющемуся от него.Альтернатива (вероятно, низшая) может включать создание нового пользователя для запуска консольного приложения. Затем вы ограничите каталоги данных этим пользователем, установите консольное приложение, принадлежащее этому пользователю, и включите
u+s
программу. Этоsetuid
бит; это означает, что тот, кто запускает консольную программу, делает это с разрешениями владельца программы. Таким образом, пользователь сам не имеет доступа к каталогам, он получает его только через программу. Тем не менее, вы, вероятно, должны просто использоватьForceCommand
, поскольку это ограничивает весь доступ к «просто запустить эту программу».источник
ForceCommand
это не мешает переадресации портов SSH..profile
нечто большее, чем «не идеально»; его легко обойти (подробности см. в моем ответе) и, таким образом, он не обеспечивает никакой защиты, только ложное чувство безопасности.Не пытайтесь делать это,
.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 вход в систему для пользователя, использующего пароль или другой ключAllowTcpForwarding
и т. д. вsshd_config
no-port-forwarding
и т. д. в.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
иcommand="..."
запускают команду через пользовательскую оболочку, чтобы они не работали, если для пользовательской оболочки установлено, например,./bin/false
или/sbin/nologin
Отказ от ответственности: я ни в коем случае не являюсь экспертом в этом вопросе, поэтому, хотя я могу сказать,
.profile
что это небезопасно, я не могу обещать, что с другими методами, которых я не знаю, нет никакой «ошибки» около. Насколько я знаю, они в безопасности, но я не был бы первым, кто ошибся в Интернете.источник
ForceCommand
и заставил беспарольный вход сcommand=
вauthorized_keys
, в то время как он был обойден до того , что происходит из - за ошибки на сервере: он предназначен , чтобы быть защищенными от злоумышленника, и пользователя в обходе он считается серьезной уязвимостью в SSH-сервере (и, таким образом, является приоритетом). Как вы.profile
указали, по замыслу это обходится: так как это не считается функцией безопасности, пользователь, обходя ее, совершенно нормально с точки зрения разработчика оболочки.ForceCommand
для ограничения доступа, и у вас был демон, который только прослушивает соединения локально и не выполняет аутентификацию, пользователь ssh мог бы по-прежнему обращаться к демону. Функции, которые я перечислил, являются такими, например. Решения для git-хостинга обычно отключаются, и я не видел никаких дополнительных «зловещих» решений на страницах man-страниц, но я еще не нашел никакого официального документа «это то, как вы используетеForceCommand
безопасно» - также.~/.profile
это редактируемый пользователем и не полезный для безопасности, но могли бы вы сделать метод cpast значимым, вставив его в/etc/profile
? Вы можете проверить UID, чтобы ограничить его нужным пользователям.ssh user@host
, но если вы скажете ssh запустить команду - т.е.ssh user@host command
- вы больше не получаете оболочку входа в систему и файлы не затрагиваются вообще. Таким образом, вы можете просто обойти ограничения, которые кто-то пытался создать с помощью файлов, просто предоставив дополнительный аргумент ssh..profile
, он используетsshd_config
и должен быть безопасным. Он упоминает только.profile
как метод, который вы не должны использовать для этого.Можно включить SSH и отключить SFTP как глобально, так и для каждого пользователя / группы.
Лично мне это нужно, потому что я хочу предоставить доступ к некоторым git-репозиториям через SSH, и мне нравится отключать ненужные системы. В этом случае SFTP не нужен.
глобально
Вы можете отключить SFTP для всех пользователей несколькими способами.
Недостающая подсистема
SFTP-демон, используемый SSH, можно настроить через
Subsystem
ключевое слово. Изsshd_config(5)
руководства:Последняя строка предполагает, что этого должно быть достаточно, чтобы не определять подсистему для «sftp».
Ложная ложь
Вы также можете отключить SFTP, установив демон SFTP, используемый SSH, на что-то непригодное. Например, настройте подсистему "sftp" на
/bin/false
:Когда что-то пытается войти через SFTP, демон SSH пытается запустить «демон sftp»
/bin/false
./bin/false
Программа делает только одну вещь, и это возвращает код ошибки. Попытка подключения SFTP фактически отклонена.На пользователя / группу
Также возможно отключить SFTP для пользователя, группы или нескольких других критериев.
Это не работает, если вы хотите, чтобы ваш пользователь получал обычную подсказку оболочки. Это также не имеет смысла, так как вы можете обойти большинство вещей, если у вас есть доступ к оболочке. Это будет работать, только если вы хотите предоставить доступ к определенной программе.
согласование
Чтобы соответствовать группе пользователей, вы можете настроить SSH с
Match
ключевым словом. Изsshd_config(5)
руководства:Пара примеров:
Match User eva
соответствует пользователю "eva"Match User stephen,maria
соответствует пользователям "Стивен" и "Мария"Match Group wheel,adams,simpsons
соответствует группам "колесо", "адамс", "симпсоны"Если вы хотите получить больше информации, в
sshd_config(5)
руководстве есть грузы .Принудительная команда
Обычно вы получаете пользовательскую оболочку входа в систему при подключении через SSH, но SSH может быть настроен для принудительного выполнения определенной команды. Команда принудительна для любого соединения SSH, включая SFTP, и, таким образом, у вас может быть возможность принудительно ввести нужную команду.
Команду force можно настроить с помощью
ForceCommand
ключевого слова. Изsshd_config(5)
руководства:Таким образом, вы можете использовать ограниченную команду, которую хотите использовать
ForceCommand <your command>
. Например:пример
В моем случае, когда я хочу дать доступ к git, мне нужен только доступ к пользователю
git-shell
. Это раздел, который отключает SFTP для моих пользователей git, а также некоторые параметры безопасности:источник