如何为某些用户禁用 SFTP,但保持 SSH 启用?

如何为某些用户禁用 SFTP,但保持 SSH 启用?

我的项目需要我为某些用户禁用 SFTP,但这些用户仍然需要通过 SSH 连接。有人知道如何实现吗?

我已看到更改文件的建议/etc/ssh/sshd_config,但我不确定要更改什么。

答案1

这毫无意义,这是通过无用的隐蔽性来实现安全性。任何可以使用 SSH 的用户都能够通过 SSH 会话传输他们能够读取的任何文件。如果您有权限,您还可以写入。

例如,您可以使用以下方法通过 ssh 下载 /etc/passwd(无需 scp/sftp 会话):ssh[电子邮件保护]“cat /etc/passwd”>passwdcopy

如果您可以通过 SSH 在屏幕上看到它,那么您可以轻松地将其复制为文件。

只有当您拥有一个强制实施安全策略的自定义受限 shell 时,这种情况才有意义。

但是,反过来做是有意义的(禁用 ssh shell 但保持 scp/sftp 启用),因为您无法通过 sftp/scp 执行可以通过 ssh shell 执行的任意命令。

PS:我假设您授予的 SSH shell 是允许任意执行的标准 shell。如果不是,请参见以下内容:如何为特定用户或组禁用 sftp 子系统?并查看 sshd_config 的子系统配置选项。

答案2

Match Group nosft
Subsystem   sftp  /bin/false

我更喜欢为此使用一个组。

它与 shell 受限的用户结合使用非常有用。我有时会向客户端授予 ssh 访问权限,以便他们可以通过将 shell 设置为转储数据的脚本来访问其数据库的 sql-dump。切断他们与 scp 的联系似乎也是一个聪明的主意。他们无权cat通过 ssh 传输文件。

答案3

可以全局启用 SFTP,并仅为部分用户禁用 SFTP。

如果您希望用户获得常规 shell 提示符,则此方法不起作用。这也没有意义,因为如果你有 shell 访问权限,你就可以规避大多数东西。 仅当您只想授予特定程序访问权限时它才会起作用。

我个人需要这个,因为我想通过 SSH 授予对某些 git 存储库的访问权限,并且我喜欢禁用不需要的系统。在这种情况下,不需要 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 连接时,您会获得用户的登录 shell,但可以配置 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。这是为我的 git 用户禁用 SFTP 的部分,以及一些安全选项:

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

答案4

你可以看看scponly要执行相反的操作,仅允许 scp/sftp 但不允许 shell 访问。

我同意上面的@Nathan,这没什么意义。如果你坚持不下来,试着编辑你的/etc/ssh/sshd_config文件并删除/注释掉以下行:

子系统 sftp /usr/libexec/openssh/sftp-server

相关内容