Как отключить sftp для некоторых пользователей, но оставить ssh включенным?

12

Мой проект требует, чтобы я отключил sftp для некоторых пользователей, но эти пользователи все равно должны подключаться через ssh. Кто-нибудь знает, как это реализовать?

Я видел предложения по изменению файла в /etc/ssh/sshd_config, но я не уверен, что изменить.

Шаобо Ван
источник
Единственный способ сделать это - использовать политику MLS в SELinux и точно ограничить, к каким файлам, каталогам и сокетам пользователь может обращаться, выполнять и т. Д. Я сделал бы это в сочетании с очень строгой политикой iptables, которая использует модуль ownerдля исходящего доступа. Это предполагает, что вы пройдете тестирование пера красной командой. Если каждый, кто получает доступ к вашей системе, всегда подчиняется правилам и никогда не имеет злонамеренных намерений, тогда мой подход будет жестким и чрезмерно сложным.
Аарон

Ответы:

7

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

Способ сделать это - использовать Matchусловный блок *.

Match User bob
Subsystem   sftp  /bin/false

Смотрите sshd_config(5)в Matchразделе для получения дополнительной информации и соответствия на Group.

* Есть несколько способов сделать это.

bahamat
источник
7
Это не работает для меня. Ошибка: Директива «Подсистема» не допускается в блоке Match
chrw
Неправильный ответ, потому что подсистема не разрешена в блоке Match
mikep
6

Это не имеет никакого смысла, это безопасность через бесполезную неизвестность. Любой пользователь, который может использовать SSH, сможет передать любой файл, который он сможет прочитать через сеанс SSH. Вы также сможете писать, если у вас есть для этого разрешения.

Например, вы можете скачать / etc / passwd через ssh следующим способом (сеанс scp / sftp не требуется): ssh foo@bar.com "cat / etc / passwd"> passwdcopy

Если вы можете видеть его на своем экране через SSH, то вы можете легко скопировать его в виде файла.

Это может иметь смысл только в том случае, если у вас есть настраиваемая оболочка с ограничениями, которая применяет политику безопасности.

Однако обратное этому имеет смысл (отключение оболочки ssh, но без включения scp / sftp), потому что вы не можете выполнять произвольные команды через sftp / scp, которые вы можете через оболочку ssh.

PS: я предполагаю, что оболочка SSH, которую вы предоставляете, является стандартной оболочкой, которая допускает произвольное выполнение. Если это не так, то посмотрите следующее: Как отключить подсистему sftp для конкретного пользователя или группы? и посмотрите на параметр конфигурации подсистемы sshd_config.

Натан
источник
4
Match Group nosft
Subsystem   sftp  /bin/false

Я предпочитаю использовать группу для этого.

Это полезно в сочетании с пользователями, которые имеют ограниченные оболочки. Иногда я предоставляю ssh доступ к клиенту, чтобы он мог получить доступ к sql-дампу своей базы данных, установив в своей оболочке скрипт, который выводит свои данные. Отрезать их от scp также кажется разумной идеей. У них нет доступа к запуску catдля передачи файла через ssh.

singlow
источник
3
Directive 'Subsystem' is not allowed within a Match block
Патрик
Неправильный ответ, потому что подсистема не разрешена в блоке Match
mikep
4

Можно включить SFTP глобально и отключить SFTP только для некоторых пользователей.

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

Лично мне это нужно, потому что я хочу предоставить доступ к некоторым git-репозиториям через SSH, и мне нравится отключать ненужные системы. В этом случае 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, и, таким образом, у вас может быть возможность принудительно ввести нужную команду.

Команду force можно настроить с помощью 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
Од
источник
1
Это не отвечает на вопрос ОП, но для меня было очень полезно достичь того, чего я хочу достичь в моем собственном
сценарии
Я не согласна Вопрос OP: «Как отключить sftp для некоторых пользователей, но оставить ssh включенным?», И этот ответ объясняет один из способов сделать это. Рад, что вы нашли это полезным в любом случае!
Од
По вашему собственному признанию, это «не работает, если вы хотите, чтобы ваш пользователь получал обычную подсказку оболочки». так что это не соответствует требованию ОП «держать SSH включенным»
Кидбурла
Неплохо подмечено. Я полагаю, что я смирился с этим решением из-за того, что «оно не имеет смысла, так как вы можете обойти большинство вещей, если у вас есть доступ к оболочке». Но я не нашел пути к тому, что спрашивает ОП, я согласен сейчас.
Од
Вот более полная версия этого ответа: serverfault.com/a/817482
Од
1
Match User bob
MaxSessions 0

Протестировано и работает на CentOS 6.6. Обратите внимание, что подсистема не допускается с Match, по крайней мере, в новых версиях CentOS. На странице man для sshd_config перечислены ограниченные ключевые слова, которые допускаются при условии соответствия.

Джефф
источник
0

Вы можете посмотреть на scponly, чтобы сделать обратное, разрешить только scp / sftp, но не иметь доступа к оболочке.

Я согласен с @Nathan выше, это не имеет большого смысла. Если вы не уверены, попробуйте отредактировать файл / etc / ssh / sshd_config и удалить / закомментировать следующую строку:

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

dmourati
источник
0

не давать домашний каталог для пользователя

usermod username -d /bin/false

Измените Подсистему sftp / usr / libexec / openssh / sftp-server в файле / etc / ssh / sshd_config на Подсистему sftp / dev / null / usr / libexec / openssh / sftp-server

Затем перезапустите SSH

service ssh restart

это работает для меня, Debian.

Yusufmm
источник
-2

В ~/authorized_keyнастройке пользовательского ключа выполните следующие действия:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
Kazek
источник