Я искал жизнеспособный ответ на этот вопрос, и большинство ответов включает совет относительно того, почему не сделать это. Однако вот сценарий, и что заставляет:
У меня есть консольное приложение, и в .profile каждого пользователя, существует команда запуска для приложения, и непосредственно после команды, которая запускается, это, существует команда "выхода", которая регистрирует их из системы. Я только хочу, чтобы они смогли получить доступ к этому консольному приложению через интерфейс, обеспеченный им. После запуска приложение дарит пользователю список клиентов, к которым можно получить доступ через приложение с каждым клиентом, имеющим их собственный каталог данных. Пользователи являются предоставленным доступом только клиентам, к которым они будут нуждаться в доступе.
Теперь вот проблема: Если я предоставлю пользователям доступ SSH, то они также смогут войти в систему с помощью клиента SFTP, который предоставит им прямой доступ к каталогам данных для приложения, которое ОЧЕНЬ нежелательно, так как это также предоставит им доступ к каталогам данных, к которым у них не должно быть доступа.
Это было такой простой вещью сделать при использовании комбинации telnet/FTP, но теперь, когда я хочу предоставить пользовательский доступ отовсюду в Интернете, я не смог найти способ закрыть их из SFTP, все еще предоставляя им доступ к оболочке, где они могут запустить приложение.
В случае, если это не очевидно, следующий ответ не предназначен как безопасный метод предотвращения использования SFTP кем-либо, у кого есть доступ оболочки к сервер. Это просто ответ, который объясняет, как отключить его от внешней видимости. Для обсуждения безопасности на уровне пользователя см. Ответы @cpast и @Aleksi Torhamo. Если ваша цель - безопасность, это неправильный ответ. Если ваша цель - простая визуализация службы, то это ваш ответ.
Теперь мы переходим к исходному ответу:
Закомментируйте поддержку sftp в sshd_config (и, конечно, перезапустите sshd
):
# Подсистема sftp / usr / lib / openssh / sftp-server
Не пытайтесь сделать это с помощью .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
Notes:
command=".... "
применяется только для одного ключа, поэтому не ограничивает ssh логин пользователя, использующего пароль или другой ключAllowTcpForwarding
и т.д. в sshd_config
no-port-forwarding
и т.д. в . ssh/authorized_keys
-c 'command-thuser-wanted to-run'
ForceCommand
and command=". ..."
выполняет команду через оболочку пользователя, поэтому они не работают, если оболочка пользователя установлена в значение /bin/false
или /sbin/nologin
Disclaimer:
Я ни в коем случае не эксперт в этом вопросе, поэтому, хотя я могу сказать, что .profile
не безопасен, я не могу обещать, что не будет какой-нибудь "gotcha" с другими методами, о которых я не знаю. Насколько я знаю, они безопасны, но я бы не стал первым, кто ошибается в интернете.
Как уже упоминалось другими, отключения sftp
недостаточно - пользователь с неограниченным доступом ssh
может просматривать любой файл, который их учетная запись имеет разрешения на просмотр, может изменять все, что у них есть разрешение на изменение, и может легко загружать все, что они могут прочитать, на свой компьютер. Единственный способ помешать им сделать это - фактически ограничить им доступ. Также не идеально полагаться на .profile
для ограничения пользователей, поскольку это не то, для чего он предназначен (Edit: как упоминает Алекси в своем ответе, на самом деле просто обойти .profile
; особенность .profile
заключается в том, что он предназначен для удобства, а не безопасности, поэтому он не предназначен для ограничения пользователя. Используйте вещи, предназначенные для обеспечения безопасности, например, указанные ниже, для обеспечения безопасности).
Там есть два основных способа сделать это: вы можете ограничить их с помощью прав доступа к файлам или заставить их выполнять только ваше консольное приложение. Второй способ лучше: назначьте пользователей, которым следует ограничить доступ к консольному приложению, в группу (например, клиентов
); затем в sshd_config
добавьте следующие строки:
Match Group customers
ForceCommand /path/to/app
Это делает так, чтобы все подключения пользователей в этой группе открывали консольное приложение; они не могут запускать что-либо еще, в том числе серверный инструмент sftp
. Это также мешает им делать что-либо else с системой и, в отличие от .profile
, делает это с помощью самого сервера SSH ( .profile
ограничивает их в оболочке , ForceCommand
также предотвращает выполнение других действий, не связанных с запуском оболочки). Также в отличие от .profile
, этот разработан как элемент безопасности; он специально создан, чтобы противостоять злонамеренному пользователю, уклоняющемуся от него.
Альтернатива (вероятно, худшая) будет включать создание нового пользователя для запуска консольного приложения. Затем вы должны ограничить каталоги данных для этого пользователя, установить консольное приложение, принадлежащее этому пользователю, и установить u + s
в программе. Это бит setuid
; это означает, что кто-то, кто запускает консольную программу, делает это с разрешения владельца программы. Таким образом, пользователь сам не имеет доступа к каталогам, он получает его только через программу. Однако вам, вероятно, следует просто использовать ForceCommand
, поскольку это ограничивает весь доступ «просто запустить эту программу».
Можно включить SSH и отключить SFTP как глобально, так и для каждого пользователя / группы.
Мне лично это нужно, потому что Я хочу предоставить доступ к некоторым репозиториям git через SSH, и мне нравится отключать ненужные системы. В этом случае SFTP не требуется.
Вы можете отключить SFTP для всех пользователей несколькими способами.
Демон SFTP, используемый SSH, можно настроить с помощью ] Подсистема
ключевое слово.
Из руководства 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).
...
Несколько примеров:
Соответствие пользователя eva
соответствует пользователю "eva" Соответствие пользователя stephen, maria
соответствует пользователям "stephen" и "maria" Колесо группы соответствий , adams, simpsons
соответствует "wheel", "adams", "simpsons"
groups Если вам нужна дополнительная информация, в руководстве sshd_config (5)
есть загрузки.
Обычно вы получаете оболочку входа пользователя при подключении через SSH, но SSH возможно настроен для принудительного выполнения определенной команды. Команда принудительная для любого SSH соединение, включая SFTP, и, таким образом, у вас может быть возможность принудительно
Форсируемую команду можно настроить с помощью ключевого слова ForceCommand
. Из
sshd_config (5)
manual:
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 <ваша команда>
.
Например:
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