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

13 linux solaris unix ssh

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

我意识到 'ssh $server "cat file" ' 类型的文件访问更难阻止,但我需要了解如何为初学者停止“scp”。

否则,有没有办法通过 可靠地记录服务器端的所有 SCP 访问syslog

Bra*_*ert 13

虽然你可以编辑你/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
Run Code Online (Sandbox Code Playgroud)

相反,我会确定用户可能会使用它做什么。因为如果您只希望他们访问几个命令,我会取消他们甚至调用普通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
Run Code Online (Sandbox Code Playgroud)

ssh root@example -s smb-reload
Run Code Online (Sandbox Code Playgroud)

如果你发现你真的需要能够运行一个普通的 shell,你真正能希望的最多就是减慢它们的速度,让它变得更加困难。


Mik*_*eyB 8

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

您能做的最好的事情是将用户的 shell 更改为受限 shell (rbash),然后才运行某些命令。

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

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


car*_*ito 6

当您仍然允许几乎无限的附加文件传输机制时,停止“scp”将一无所获。禁止 scp 但允许其他复制文件的机制是一种对审计员撒谎的方法。审计师经常要求被骗。通常我看到审计员与经理合作进行虚假修复,以便他们可以声明诸如“scp 文件传输命令已被禁用,因此无法使用 scp 从服务器复制文件”之类的内容。

现在一个合理的日志记录机制会很好。也许 auditd 终于可以在 Linux 上运行了。也许 Solaris 终于添加了一些机制,或者可以安全地使用 dtrace。希望操作系统在每次访问文件时都进行记录是合理的。当然,“阅读”和“复制”没有区别。但这可以让审计员满意,并为系统提供重要的安全性。您的日志可能非常嘈杂,以至于数据毫无用处,甚至您不得不保留短得可笑的审计跟踪。(例如,您不能记录每个 read() - 并且一个执行令人惊讶的事情的应用程序可能会使记录每个 open() 成为一场灾难)。


小智 5

根据需要 SSH 的目的,如果数据包大小大于 1400 字节,您可以通过使用 IPTables 终止会话来实现此目标(对于非平凡的)文件。这意味着交互式 ssh 将主要工作,但是一旦某些东西尝试发送 1500 字节的数据包 - 就像假设标准 MTU 为 1500,scp 应该用于大于 1499 字节的文件,它将终止连接。

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

不幸的是,这意味着如果屏幕需要绘制超过 1400 个字符,或者如果您需要 cat 一个长文件或做一个长目录列表,您可能会在使用文本编辑器编辑某些文件时遇到问题。

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

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff -j DROP
Run Code Online (Sandbox Code Playgroud)

我们可以通过将数据包长度检查与 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
Run Code Online (Sandbox Code Playgroud)

上面的规则示例仅防止 scp 上传,例如scp myfile.data remote.host:~. 要额外防止 scp 下载,如scp remote.host:~/myfile.data /local/path,请重复上述规则,但替换--dport--sport.

一个有见识的黑客可以通过在他的机器上设置小于 1400 的 MTU(或强制 mtu 或类似的值)来解决这些限制。此外,虽然您不能将其限制为某些用户,但您可以通过适当修改 iptables 行来按 IP 进行限制!!

干杯,大卫去


小智 2

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

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

  • @Jason:那么你需要记录文件访问。即使您禁用了 scp,您如何阻止某人运行: ssh server 'cat /path/to/file' > copy ? (2认同)