Я искал жизнеспособный ответ на этот вопрос, и большинство ответов включают совет, почему этого не следует делать. Однако вот сценарий и то, что делает его необходимым:
У меня есть консольное приложение, и в .profile каждого пользователя есть команда запуска для приложения, а сразу после команды, которая запускает его, есть команда «exit», которая выводит их из системы. Я только хочу, чтобы они могли получить доступ к этому консольному приложению через предоставленный им интерфейс. При запуске приложение представляет пользователю список клиентов, к которым можно получить доступ через приложение, причем каждый клиент имеет свой собственный каталог данных. Пользователям предоставляется доступ только к тем клиентам, к которым им потребуется доступ.
Теперь вот проблема: если я дам пользователям доступ по SSH, они также смогут войти в систему с помощью клиента SFTP, который предоставит им прямой доступ к каталогам данных для приложения, что ОЧЕНЬ нежелательно, поскольку это также даст они имеют доступ к каталогам данных, к которым у них не должно быть доступа.
Это было очень просто сделать при использовании комбинации telnet / FTP, но теперь, когда я хочу предоставить пользователям доступ из любого места в Интернете, я не смог найти способ отключить их от SFTP, в то время как по-прежнему разрешая им доступ к оболочке, где они могут запускать приложение.
Как уже упоминалось, отключение sftp
недостаточно - пользователь с неограниченным ssh
Доступ может просматривать любой файл, на просмотр которого у его учетной записи есть разрешения, может изменять все, что у него есть разрешение на изменение, и может легко загружать все, что они могут прочитать, на свой компьютер. Единственный способ помешать им сделать это - фактически ограничить им доступ. Также не идеально полагаться на .profile
чтобы ограничить пользователей, так как это не то, для чего это нужно (Edit: как упоминает Алекси в своем ответе, на самом деле легко обойти .profile
; дело в .profile
заключается в том, что это сделано для удобства, а не для безопасности, поэтому оно не предназначено для ограничения пользователя. Используйте вещи, предназначенные для обеспечения безопасности, например, указанные ниже, для обеспечения безопасности).
Есть два основных способа сделать это: вы можете ограничить их с помощью прав доступа к файлам или заставить их выполнять только ваше консольное приложение. Второй способ лучше: назначьте пользователей, которые должны быть ограничены консольным приложением, в группу (например, customers
); затем в sshd_config
добавьте следующие строки:
Match Group customers
ForceCommand /path/to/app
Это делает так, что все подключения пользователей в этой группе открывают консольное приложение; они не могут запустить ничего другого, в том числе sftp
серверный инструмент. Это также мешает им что-либо делать еще с системой, и в отличие от .profile
, делает это с помощью самого SSH-сервера (.profile
ограничивает их в оболочке, ForceCommand
также предотвращает выполнение других действий, не связанных с запуском оболочки). Также в отличие от .profile
, это разработан как вещь безопасности; он специально создан, чтобы противостоять злоумышленнику, уклоняющемуся от него.
Альтернатива (вероятно, худшая) будет включать создание нового пользователя для запуска консольного приложения. Затем вы ограничите каталоги данных для этого пользователя, установите консольное приложение, принадлежащее этому пользователю, и установите u+s
по программе. Это setuid
немного; это означает, что кто-то, кто запускает консольную программу, делает это с разрешения владельца программы. Таким образом, пользователь сам не имеет доступа к каталогам, он получает его только через программу. Однако вам, вероятно, следует просто использовать ForceCommand
, поскольку это ограничивает все доступ к «просто запустите эту программу».
Если это не очевидно, следующий ответ не предназначен для безопасный метод предотвращения использования SFTP кем-либо, у кого есть доступ к серверу. Это просто ответ, который объясняет, как отключить его от внешней видимости. Для обсуждения безопасности на уровне пользователя см. Ответы @cpast и @Aleksi Torhamo. Если ваша цель - безопасность, это неправильный ответ. Если ваша цель - простая визуализация услуг, то это ваш ответ.
Теперь перейдем к исходному ответу:
Закомментируйте поддержку sftp в sshd_config (и, конечно, перезапустите sshd
):
#Subsystem 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
Ноты:
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
это небезопасно, я не могу обещать, что с другими методами, о которых я не знаю, не будет каких-то проблем. Насколько я знаю, они безопасны, но я не буду первым, кто ошибается в Интернете.
Можно включить 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
соответствует группам "wheel", "adams", "simpsons"Если вам нужна дополнительная информация, в sshd_config(5)
руководство.
Обычно вы получаете оболочку входа пользователя при подключении через SSH, но SSH можно настроить для принудительного выполнения определенной команды. Команда принудительно применяется для любого SSH-соединения, включая SFTP, и поэтому у вас может быть возможность принудительно выполнить команду, которую вы хотите.
Команду принудительного выполнения можно настроить с помощью 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