如何为某些用户禁用sftp,但保持ssh启用?


12

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

我在看到了更改文件的建议/etc/ssh/sshd_config,但不确定如何更改。


我可以想象的唯一方法是在SELinux中使用MLS策略,并严格限制一个人可以访问,执行等的文件,目录和套接字。我将结合使用高度限制的iptables策略来实现owner出站访问的模块。假设您将由一支红队进行笔测试。如果每个访问您系统的人都始终遵守规则,并且从来没有恶意,那么我的方法将是繁重的工作并且过于复杂。
亚伦

Answers:


7

通常,由于其他人列出的原因,这样做是不安全的做法。但是,我认为,分配的重点是要告诉您可以基于各种条件来有条件配置部分。

做到这一点的方法是使用Match条件块*。

Match User bob
Subsystem   sftp  /bin/false

有关更多信息,请参见sshd_config(5)Match部分下方的内容,并在上进行匹配Group

*有多种方法可以做到这一点。


7
它对我不起作用。错误:匹配块中不允许使用指令“子系统”
chrw 2013年

错误的答案,因为在“比赛”区块中不允许子系统
mikep '19

6

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

作为示例,您可以使用以下方法(不需要scp / sftp会话)通过ssh下载/ etc / passwd:ssh foo@bar.com“ cat / etc / passwd”> passwdcopy

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

唯一有意义的方法是,如果您具有实施安全策略的自定义受限外壳。

但是,这样做的反义是有道理的(禁用ssh shell但启用了scp / sftp),因为您无法通过ssh shell通过sftp / scp执行任意命令。

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


4
Match Group nosft
Subsystem   sftp  /bin/false

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

与具有受限制的shell的用户一起使用时很有用。有时我给ssh访问客户端,以便他们可以通过将shell设置为转储数据的脚本来访问数据库的sql-dump。从scp中删除它们似乎也是一个聪明的主意。他们无权运行cat通过ssh传输文件的权限。


3
Directive 'Subsystem' is not allowed within a Match block
Patryk 2014年

错误的答案,因为在“比赛”区块中不允许子系统
mikep '19

4

可以全局启用SFTP,并且仅对某些用户禁用SFTP。

如果您希望用户获得常规的shell提示,则此方法不起作用。这也没有任何意义,因为如果您具有shell访问权限,则可以绕开大多数内容。 仅当您只想授予对特定程序的访问权限时,它才起作用。

我个人需要这样做,因为我想允许通过SSH访问某些git存储库,而且我想禁用不需要的系统。在这种情况下,不需要SFTP。

匹配

要匹配一组用户,可以使用Match关键字配置SSH 。从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 与“ 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

1
这不回答OP的问题,但它非常有帮助,我达到我想要在我自己的使用情况达到什么
Kidburla

我不同意 OP的问题是“如何对某些用户禁用sftp,但保持ssh启用?”,此答案说明了一种实现方法。很高兴您发现它仍然很有帮助!
奥德

自行承认,“如果您希望用户获得常规的shell提示,则该命令将不起作用”。因此,这不符合OP的“启用ssh已启用”的要求
Kidburla

那是个很好的观点。我猜我之所以对这种解决方案感到满意,是因为“也没有什么意义,因为如果您具有shell访问权限,则可以绕开大多数内容。” 但是,我现在同意,但我没有找到准确解决OP要求的方法。
奥德

下面是这个答案的更完整版本:serverfault.com/a/817482
奥德省

1
Match User bob
MaxSessions 0

经过测试并在CentOS 6.6上工作。请注意,至少在较新的CentOS版本上,“匹配”不允许使用子系统。sshd_config的手册页列出了Match条件所允许的受限关键字。


0

您可以反过来看看,只允许scp / sftp而不允许shell访问。

我同意上面的@Nathan,这没有任何意义。如果您已死定,请尝试编辑/ etc / ssh / sshd_config文件并删除/注释以下行:

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


0

不给用户主目录

usermod username -d /bin/false

将文件/ etc / ssh / sshd_config中的Subsystem sftp / usr / libexec / openssh / sftp-server更改为Subsystem sftp / dev / null / usr / libexec / openssh / sftp-server

然后重启ssh

service ssh restart

它对我有用,debian。


-2

~/authorized_key配置用户密钥中,如下所示:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.