Включить доступ к 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
Другие вопросы по тегам