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