Назад | Перейти на главную страницу

Включить доступ к оболочке SSH, но отключить доступ SFTP

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

У меня есть консольное приложение, и в .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 для пользователя, использующего пароль или другой ключ
  • Вы также можете ограничить перенаправление портов и т. Д. (Перенаправление портов, перенаправление 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 соответствует пользователям "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