是否可以在仍然允许SSH访问的同时阻止SCP?


13

使用Solaris和Linux服务器以及OpenSSH,是否可以阻止用户使用“ scp”复制文件,同时仍然允许使用“ ssh”访问shell?

我意识到很难防止'ssh $ server“猫文件”'类型的文件访问,但是我需要了解有关停止启动程序的“ scp”的信息。

如果失败,有没有办法可靠地通过服务器日志记录所有SCP访问syslog


如果您想关闭ssh但不关闭scp,则可以使用以下命令:sublimation.org/scponly/wiki/index.php/Main_Page 太糟糕了,您希望以相反的方式使用它:-\

我有同样的问题,但出于其他原因。就我而言,我想关闭服务器上的SFTPD和SCPD。原因是我们确实允许文件传输,但是我们希望用户通过我们的复制节点进行传输。这是由于我们如何分隔链接上的负载。因此,根据此循环,关闭SFTPD很容易,但是如果我理解正确,那么关闭SCPD几乎是不可能的吗?

Answers:


12

虽然您可以将其编辑/etc/ssh/sshd_config为如下所示:

ForceCommand           /bin/sh
PermitOpen             0.0.0.0
AllowTcpForwarding     no
PermitTunnel           no
# Subsystem sftp       /usr/lib/openssh/sftp-server
PermitUserEnvironment  no

我将改为确定用户可能将其用于什么。因为如果只有少数命令希望它们可以访问,那么我将删除它们甚至调用普通sshshell的功能。

AllowUsers             root
PermitRootLogin        forced-commands-only

PermitUserEnvironment  no

AllowTcpForwarding     no
PermitTunnel           no

# Subsystem sftp       /usr/lib/openssh/sftp-server
Subsystem smb-reload   /usr/bin/smbcontrol smbd reload-config
Subsystem status       /opt/local/bin/status.sh

ssh root@example -s smb-reload

如果您确实确实需要能够运行普通的Shell,那么您真正希望的最大就是降低它们的速度,并使其更加困难。


8

正如其他人指出的那样,您不能阻止scp(嗯,您可以:rm /usr/bin/scp,但这并不能真正带您到任何地方)。

最好的办法是将用户的外壳程序更改为受限外壳程序(rbash),然后再运行某些命令。

请记住,如果他们可以读取文件,则可以将其复制/粘贴到屏幕之外。二进制文件?xxd / uuencode / mmencode都可以解决此问题。

我还建议您使用流程会计来帮助您跟踪活动。


进程记帐有一点帮助,但是历史进程记帐确实没有用(例如,仅记录命令运行的基本名称)。我想听听实际上有用的流程会计取得的任何现代成功。
carlito

1
如何使用修补的受限外壳(也将所有命令记录到某处的管道)记录下来?集中式.bash_history想法。
MikeyB

实际上,在服务器端,您必须删除/ usr / lib / openssh / sftp-server,但是我认为sshd具有内置的sftp服务器。
布拉德·吉尔伯特

@Brad:客户端指定的任何命令仍通过外壳运行;因此,如果sftp-server不在默认PATH中(不是),则将外壳更改为受限外壳足以将其禁用,则不必删除二进制文件。
MikeyB

6

当您仍然允许传输文件的字面无限的附加机制时,通过停止“ scp”一无所获。禁止使用scp但允许其他机制来复制文件是对审核员说谎的一种方法。审核员经常要求撒谎。通常,我看到审核员与经理合作进行伪造的修复,以便他们可以声明“已禁用scp文件传输命令,以便无法使用scp从服务器复制文件”之类的内容。

现在,合理的日志记录机制将是不错的。也许经过审核最终可以在Linux上运行。也许Solaris最终添加了某种机制,或者可以安全使用dtrace。希望操作系统在每次访问文件时都记录日志是合理的。当然,“阅读”和“复制”没有区别。但这可以使审核员满意,并为系统提供显着的安全性。您的日志可能太嘈杂,以至于数据无用,甚至您不得不被迫保留很短的审核记录。(例如,您不能记录每个read(),并且一个执行令人惊讶的应用程序会使记录每个open()成为灾难)。


5

如果数据包的大小大于1400字节,则可以通过使用IPTables终止会话来实现此目标(对于不重要的文件),具体取决于所需的SSH。这意味着交互式ssh通常可以正常工作,但是只要有东西尝试发送1500字节的数据包-假设标准MTU为1500,例如scp对于大于1499字节的文件,则它将终止连接。

这也将防止您提到的“捕获”攻击。

不幸的是,这意味着您可能无法使用文本编辑器编辑某些文件,如果屏幕需要绘制多于1400个字符,或者需要放置一个长文件或列出一个长目录,则可能会遇到问题。

在最简单的情况下,执行此操作的命令可能类似于

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff -j DROP

通过将数据包长度检查与ipt_recent结合使用,我们可以使此工作更好,这样您就可以在设定的时间范围内允许数量有限的数据包,然后大于1400字节(例如,每5秒8个数据包)-这将允许最大12k的数据包滑移通过,但可以为您提供编辑文件等所需的交互性。当然,您可以调整数据包的数量。

这可能看起来像

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --set 
iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --update --seconds 5 --hitcount 8 \
         -j REJECT --reject-with tcp-reset

上面的规则示例仅可防止scp上传scp myfile.data remote.host:~。为了另外防止SCP下载,如scp remote.host:~/myfile.data /local/path,重复上面的规则,但替换--dport--sport

聪明的黑客可以通过在计算机上设置MTU小于1400(或强制MTU或类似值)来解决这些限制。同样,虽然您不能将其限制为某些用户,但是可以通过适当地修改iptables行来通过IP限制它!

干杯,David Go



1

号, scp并且ssh在相同的端口上运行并使用相同的协议。如果您打开一个ssh会话,甚至可以使用诸如之类的选项与以后的scp呼叫共享连接ControlMaster

如果您不希望人们从计算机上复制特定文件,则不应授予他们对计算机的任何外壳访问权限。


是的,显而易见的答案是锁定系统而不放弃访问权限。但实际上,我公司的审计师说,尽管我们严重限制了ssh访问并拥有一个强大的RBAC系统,但我们仍需要防止文件从服务器中复制和/或记录尝试。

2
@Jason:然后您需要记录文件访问。即使您禁用了scp,也将如何阻止某人运行:ssh服务器'cat / path / to / file'>复制?
derobert

0

有一种方法可以使用“ scponly”作为外壳来禁用交互式ssh并允许scp,但是我不知道存在任何相反的方法。

您也许可以探索如何破解外壳程序以完成相反的工作。


0

经过一番谷歌搜索实际上是不可能的。

查看此讨论:http://www.mydatabasesupport.com/forums/unix-admin/387261-how-restrict-ssh-users-block-scp-sftp.html


该链接已死。
rox0r

0

物有所值,商业产品CryptoAuditor声称能够通过MITM设置连接并使用深度数据包检查来控制SSH上的文件传输。显然,没有解决方案可以防止复制+粘贴,uuencode / decode,FISH等问题。可喜的是它是透明的(除了可能的证书错误);SSH连接的任一端都没有要安装的代理软件,也没有要配置的门户/代理。

我没有用过产品,所以YMMV。


0

在不删除太多系统实用程序的情况下阻止文件传输,以致使机器完全无法使用是不可能的。您必须摆脱所有能够将文件内容显示到stdout的东西,以及所有能够将其stdin写入stdout的东西,而当您删除所有这些东西时,剩下的东西太少了,根本没有必要允许shell访问完全没有

因此,我将专注于您的日志记录替代方案:

实际上,每个发行版中都包含一个名为“脚本”的程序,该程序应该易于安装在没有该脚本的程序上。它是一个会话记录器,可以记录外壳程序的所有输入和输出,还可以选择包含定时数据,以便可以对其进行重放,就像您在观察用户的肩上一样。(无论如何,有95%的情况会在涉及ncurses时偶尔使输出气泡化,但不是很常见。)

它的手册页包含有关将其设置为系统登录shell的说明。确保日志存储在用户不能删除的地方(仅附加文件系统属性(可通过chattr设置)对此很有用。ACL或inotify脚本也可以)

这仍然不能阻止用户将文件复制到系统外,但是可以让您查看哪些用户以及何时进行了哪些操作。绕行可能不是不可能,但是绕过几乎可以肯定会出现在日志中,因此您至少知道某人的行为是不好的,即使他们设法完全隐藏了它的真实内容。


0

我相信您可以在服务器上卸载openssh-clients(或等效文件)。

我认为scp客户端在复制数据时会在服务器上调用scp,因此,如果您摆脱了服务器上的scp,则应该可以。

$ scp bla server:/tmp/
...
debug1: Sending environment.
debug1: Sending env LC_ALL = en_US.utf8
debug1: Sending env LANG = en_US.utf8
debug1: Sending env XMODIFIERS = @im=ibus
debug1: Sending env LANGUAGE = en_US.utf8
debug1: Sending command: scp -v -t /tmp/
bash: scp: command not found
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
lost connection
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.