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

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

У меня есть консольное приложение, и в .profile каждого пользователя, существует команда запуска для приложения, и непосредственно после команды, которая запускается, это, существует команда "выхода", которая регистрирует их из системы. Я только хочу, чтобы они смогли получить доступ к этому консольному приложению через интерфейс, обеспеченный им. После запуска приложение дарит пользователю список клиентов, к которым можно получить доступ через приложение с каждым клиентом, имеющим их собственный каталог данных. Пользователи являются предоставленным доступом только клиентам, к которым они будут нуждаться в доступе.

Теперь вот проблема: Если я предоставлю пользователям доступ SSH, то они также смогут войти в систему с помощью клиента SFTP, который предоставит им прямой доступ к каталогам данных для приложения, которое ОЧЕНЬ нежелательно, так как это также предоставит им доступ к каталогам данных, к которым у них не должно быть доступа.

Это было такой простой вещью сделать при использовании комбинации telnet/FTP, но теперь, когда я хочу предоставить пользовательский доступ отовсюду в Интернете, я не смог найти способ закрыть их из SFTP, все еще предоставляя им доступ к оболочке, где они могут запустить приложение.

21
задан 19 December 2014 в 23:26
4 ответа

Изменить:

В случае, если это не очевидно, следующий ответ не предназначен как безопасный метод предотвращения использования SFTP кем-либо, у кого есть доступ оболочки к сервер. Это просто ответ, который объясняет, как отключить его от внешней видимости. Для обсуждения безопасности на уровне пользователя см. Ответы @cpast и @Aleksi Torhamo. Если ваша цель - безопасность, это неправильный ответ. Если ваша цель - простая визуализация службы, то это ваш ответ.

Теперь мы переходим к исходному ответу:


Закомментируйте поддержку sftp в sshd_config (и, конечно, перезапустите sshd ):

# Подсистема sftp / usr / lib / openssh / sftp-server

22
ответ дан 2 December 2019 в 20:02

Не пытайтесь сделать это с помощью .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
  • Use passwordless login and command="..." в .ssh/authorized_keys
  • Change the user's shell to something which restrictions what the user can do

Notes:

  • command=".... " применяется только для одного ключа, поэтому не ограничивает ssh логин пользователя, использующего пароль или другой ключ
  • Вы также можете захотеть ограничить переадресацию портов и т.д. (переадресация портов, x11 переадресация, переадресация агентов и выделение pty - это те, о которых я слышал).
    • AllowTcpForwarding и т.д. в sshd_config
    • no-port-forwarding и т.д. в . ssh/authorized_keys
  • Если у вас запущены другие демоны (например, FTP), вы должны убедиться, что они не впускают пользователя (Некоторые демоны принимают это решение, основываясь на оболочке пользователя, так что если вы измените это, вы можете захотеть перепроверить это)
  • Вы можете изменить оболочку пользователя на скрипт, который делает то, что вы хотите; он либо выполняется без аргументов, либо как скрипт -c 'command-thuser-wanted to-run'
  • Both ForceCommand and command=". ..." выполняет команду через оболочку пользователя, поэтому они не работают, если оболочка пользователя установлена в значение /bin/false или /sbin/nologin

Disclaimer: Я ни в коем случае не эксперт в этом вопросе, поэтому, хотя я могу сказать, что .profile не безопасен, я не могу обещать, что не будет какой-нибудь "gotcha" с другими методами, о которых я не знаю. Насколько я знаю, они безопасны, но я бы не стал первым, кто ошибается в интернете.

.
15
ответ дан 2 December 2019 в 20:02

Как уже упоминалось другими, отключения 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 , поскольку это ограничивает весь доступ «просто запустить эту программу».

28
ответ дан 2 December 2019 в 20:02

Можно включить 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
1
ответ дан 2 December 2019 в 20:02

Теги

Похожие вопросы