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

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

我看到了在/etc/ssh/sshd_config更改文件的build议,但是我不确定要更改什么。

这没有任何意义,它是通过无用的默默无闻的安全。 任何可以通过SSH访问的用户都可以通过SSH会话传输任何能够读取的文件。 如果您有权这样做,您也可以写信。

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

如果你可以通过SSH在你的屏幕上看到它,那么你可以很容易地将它作为一个文件复制。

唯一的方法是,如果你有一个自定义的受限制的shell来执行一个安全策略。

然而,反过来这是有道理的(禁用ssh shell,但是启用scp / sftp),因为你不能通过sftp / scp执行任意命令,你可以通过ssh shell。

PS:我假设你所授予的SSH shell是一个允许任意执行的标准shell。 如果不是这种情况,请参阅: 如何禁用特定用户或组的sftp子系统? 并查看sshd_config的子系统configuration选项。

一般来说,这是其他人列出的安全措施。 然而,我认为,你的任务的重点是教你,你可以有条件configuration部分根据各种标准。

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

 Match User bob Subsystem sftp /bin/false 

有关详细信息,请参阅“ Match部分下的sshd_config(5) ,并在“ Group匹配。

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

 Match Group nosft Subsystem sftp /bin/false 

我宁愿为此使用一个组。

它与限制shell的用户结合使用非常有用。 我有时会给ssh访问一个客户端,以便他们可以通过将shell设置为转储数据的脚本来访问其数据库的sql转储。 从scp上切断它们似乎也是一个聪明的想法。 他们没有权限运行cat来通过SSH传输文件。

 Match User bob MaxSessions 0 

testing并在CentOS 6.6上工作。 请注意,至less在较新的CentOS版本上,子系统不允许匹配。 sshd_config的联机帮助页列出了匹配条件允许的有限关键字。

你可以看看scponly做相反的事情,只允许scp / sftp但不能访问shell。

我同意上面的@Nathan,这并没有太多的意义。 如果你死定了,试着编辑你的/ etc / ssh / sshd_config文件,并删除/注释掉下面一行:

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

不给用户的主目录

 usermod username -d /bin/false 

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

然后重新启动ssh

 service ssh restart 

它适合我,debian。

可以在全局启用SFTPfunction,仅对某些用户禁用SFTPfunction。

如果你想让你的用户得到一个正常的shell提示符,这是行不通的。 这也不是有意义的,因为如果你有shell的话,你可以绕过大部分的东西。 只有当你只想访问一个特定的程序时,它才会起作用。

我个人需要这个,因为我想通过SSH访问一些git仓库,我喜欢禁用不需要的系统。 在这种情况下,SFTP是不需要的。

匹配

要匹配一组用户,您可以使用Match关键字configurationSSH。 从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匹配“轮”,“亚当斯”,“辛普森”组

如果您想了解更多信息,请参见sshd_config(5)手册中的负载。

强制命令

通常,当你通过SSH连接时,你会得到用户的loginshell,但是SSH可以被configuration为强制执行某个命令。 该命令被强制用于任何SSH连接,包括SFTP,因此您可以select强制执行所需的命令。

强制命令可以使用ForceCommand关键字进行configuration。 从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 

~/authorized_keyconfiguration用户密钥如下:

 command="/bin/bash" ssh-rsa AAAAB3Nz.........