Peter Mortensen Asked: 2009-06-20 10:30:51 +0800 CST2009-06-20 10:30:51 +0800 CST 2009-06-20 10:30:51 +0800 CST 是否可以在仍然允许 SSH 访问的同时阻止 SCP? 772 使用 Solaris 和 Linux 服务器以及 OpenSSH,是否可以防止用户使用“scp”复制文件,同时仍然允许使用“ssh”进行 shell 访问? 我意识到 'ssh $server "cat file" ' 类型的文件访问更难防止,但我需要了解如何为初学者停止“scp”。 如果做不到这一点,有没有办法可靠地记录服务器端的所有 SCP 访问syslog? linux solaris unix ssh 14 个回答 Voted Brad Gilbert 2009-06-20T12:20:44+08:002009-06-20T12:20:44+08:00 虽然你可以编辑你/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,那么你最希望的就是减慢它们的速度,让它变得更加困难。 MikeyB 2009-06-20T11:10:44+08:002009-06-20T11:10:44+08:00 正如其他人所指出的,您不能阻止 scp (好吧,您可以:rm /usr/bin/scp,但这并不能真正让您到达任何地方)。 您可以做的最好的事情是将用户的 shell 更改为受限 shell (rbash),然后才运行某些命令。 请记住,如果他们可以读取文件,他们可以将它们复制/粘贴到屏幕之外。二进制文件?xxd/uuencode/mmencode 都可以解决这个问题。 我还建议使用流程会计来帮助您跟踪活动。 carlito 2009-06-29T22:10:43+08:002009-06-29T22:10:43+08:00 当您仍然允许几乎无限的附加文件传输机制时,停止“scp”将一无所获。禁止 scp 但允许其他复制文件的机制是对审计员撒谎的一种方法。审计师经常要求被骗。通常我会看到审核员与经理合作进行虚假修复,以便他们可以声明“scp 文件传输命令已被禁用,因此无法使用 scp 从服务器复制文件”之类的内容。 现在一个合理的日志记录机制会很好。也许 auditd 最终可以在 Linux 上运行。也许 Solaris 最终添加了一些机制或者 dtrace 可以安全使用。每次访问文件时都希望操作系统记录日志是合理的。当然,“阅读”和“复制”没有区别。但这可以使审计员满意,并为系统提供显着的安全性。您的日志可能非常嘈杂,以至于数据毫无用处,甚至您被迫保留非常短的审计跟踪。(例如,你不能记录每一个 read() - 一个应用程序做一些令人惊讶的事情会使记录每一个 open() 成为一场灾难)。 David Go 2010-12-31T16:31:42+08:002010-12-31T16:31:42+08:00 根据需要 SSH 的目的,如果数据包大小大于 1400 字节,您可以通过使用 IPTables 终止会话来实现此目标(对于非平凡的文件)。这意味着交互式 ssh 将主要工作,但一旦有东西试图发送一个 1500 字节的数据包 - 假设标准 MTU 为 1500,对于大于 1499 字节的文件,scp 应该会终止连接。 这也将防止您提到的“猫”攻击。 不幸的是,这意味着如果屏幕需要绘制超过 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. 聪明的黑客可以通过在他的机器上设置小于 1400 的 MTU(或强制 mtu 或类似)来解决这些限制。此外,虽然您不能将其限制为某些用户,但您可以通过适当地修改 iptables 行来通过 IP 来限制它! 干杯,大卫去 Todd Gamblin 2009-06-20T10:35:17+08:002009-06-20T10:35:17+08:00 不 scp,并且ssh在相同的端口上运行并使用相同的协议。如果您打开一个ssh会话,您甚至可以使用诸如ControlMaster. 如果您不希望人们从机器上复制特定文件,则不应授予他们对机器的任何 shell 访问权限。 supercheetah 2009-06-21T05:44:50+08:002009-06-21T05:44:50+08:00 您最好的选择不是锁定 scp,而是使用带有 ACL 的文件系统来防止读取访问。您可能可以对 SELinux 做一些事情来阻止某些应用程序从某些文件中读取。 Tomas 2018-10-25T17:36:33+08:002018-10-25T17:36:33+08:00 我相信您可以在服务器上卸载 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 [email protected] reply 0 lost connection xuancong84 2020-11-28T05:08:48+08:002020-11-28T05:08:48+08:00 @Tomas 提供的解决方案非常有效,删除/重命名/usr/bin/scp确实可以防止传入和传出scp文件传输。但是,您还必须阻止从服务器到客户端以及从客户端到服务器的所有其他端口。否则,您的 hackish 用户可以nc -l <PORT>在一侧运行并运行nc <TARGET-IP> <PORT>以建立 TCP/IP 连接并直接传输数据。 即使这样,您仍然需要禁用 X11 转发,否则,高级黑客用户可以构建 X11 应用程序并通过 X11 隧道传输数据。 Jehiah 2009-06-20T10:37:29+08:002009-06-20T10:37:29+08:00 有一种方法可以使用“scponly”作为 shell 来禁用交互式 ssh 并允许 scp,但我不知道存在任何以相反方式工作的东西。 您也许可以探索破解 scponly shell 以完成相反的操作。 samoz 2009-06-20T10:37:36+08:002009-06-20T10:37:36+08:00 经过一番谷歌搜索后,这实际上是不可能的。 看看这个讨论:http://www.mydatabasesupport.com/forums/unix-admin/387261-how-restrict-ssh-users-block-scp-sftp.html
虽然你可以编辑你
/etc/ssh/sshd_config
的看起来像这样:相反,我会确定用户可能将其用于什么。因为如果您只希望他们访问几个命令,我会改为删除他们甚至调用普通
ssh
shell 的能力。如果你发现你确实需要能够运行一个普通的 shell,那么你最希望的就是减慢它们的速度,让它变得更加困难。
正如其他人所指出的,您不能阻止 scp (好吧,您可以:
rm /usr/bin/scp
,但这并不能真正让您到达任何地方)。您可以做的最好的事情是将用户的 shell 更改为受限 shell (rbash),然后才运行某些命令。
请记住,如果他们可以读取文件,他们可以将它们复制/粘贴到屏幕之外。二进制文件?xxd/uuencode/mmencode 都可以解决这个问题。
我还建议使用流程会计来帮助您跟踪活动。
当您仍然允许几乎无限的附加文件传输机制时,停止“scp”将一无所获。禁止 scp 但允许其他复制文件的机制是对审计员撒谎的一种方法。审计师经常要求被骗。通常我会看到审核员与经理合作进行虚假修复,以便他们可以声明“scp 文件传输命令已被禁用,因此无法使用 scp 从服务器复制文件”之类的内容。
现在一个合理的日志记录机制会很好。也许 auditd 最终可以在 Linux 上运行。也许 Solaris 最终添加了一些机制或者 dtrace 可以安全使用。每次访问文件时都希望操作系统记录日志是合理的。当然,“阅读”和“复制”没有区别。但这可以使审计员满意,并为系统提供显着的安全性。您的日志可能非常嘈杂,以至于数据毫无用处,甚至您被迫保留非常短的审计跟踪。(例如,你不能记录每一个 read() - 一个应用程序做一些令人惊讶的事情会使记录每一个 open() 成为一场灾难)。
根据需要 SSH 的目的,如果数据包大小大于 1400 字节,您可以通过使用 IPTables 终止会话来实现此目标(对于非平凡的文件)。这意味着交互式 ssh 将主要工作,但一旦有东西试图发送一个 1500 字节的数据包 - 假设标准 MTU 为 1500,对于大于 1499 字节的文件,scp 应该会终止连接。
这也将防止您提到的“猫”攻击。
不幸的是,这意味着如果屏幕需要绘制超过 1400 个字符,或者如果您需要对长文件进行分类或列出长目录,您可能会在使用文本编辑器编辑某些文件时遇到问题。
在最简单的情况下,执行此操作的命令可能类似于
我们可以通过将数据包长度检查与 ipt_recent 相结合来使这项工作更好,这样您就可以在设定的时间范围内允许有限数量的大于 1400 字节的数据包(比如每 5 秒 8 个数据包)——这将允许高达 12k 的数据包滑动通过,但可能会为您提供编辑文件等所需的交互性。当然,您可以调整数据包的数量。
这可能看起来像
上面的规则示例仅防止 scp 上传,例如
scp myfile.data remote.host:~
. 要额外防止 scp 下载,例如scp remote.host:~/myfile.data /local/path
,重复上述规则但替换--dport
为--sport
.聪明的黑客可以通过在他的机器上设置小于 1400 的 MTU(或强制 mtu 或类似)来解决这些限制。此外,虽然您不能将其限制为某些用户,但您可以通过适当地修改 iptables 行来通过 IP 来限制它!
干杯,大卫去
不
scp
,并且ssh
在相同的端口上运行并使用相同的协议。如果您打开一个ssh
会话,您甚至可以使用诸如ControlMaster
.如果您不希望人们从机器上复制特定文件,则不应授予他们对机器的任何 shell 访问权限。
您最好的选择不是锁定 scp,而是使用带有 ACL 的文件系统来防止读取访问。您可能可以对 SELinux 做一些事情来阻止某些应用程序从某些文件中读取。
我相信您可以在服务器上卸载 openssh-clients (或等效项)。
我认为 scp 客户端在复制数据时会在服务器上调用 scp ,所以如果你摆脱了服务器上的 scp ,那么你应该没问题。
@Tomas 提供的解决方案非常有效,删除/重命名
/usr/bin/scp
确实可以防止传入和传出scp
文件传输。但是,您还必须阻止从服务器到客户端以及从客户端到服务器的所有其他端口。否则,您的 hackish 用户可以nc -l <PORT>
在一侧运行并运行nc <TARGET-IP> <PORT>
以建立 TCP/IP 连接并直接传输数据。即使这样,您仍然需要禁用 X11 转发,否则,高级黑客用户可以构建 X11 应用程序并通过 X11 隧道传输数据。
有一种方法可以使用“scponly”作为 shell 来禁用交互式 ssh 并允许 scp,但我不知道存在任何以相反方式工作的东西。
您也许可以探索破解 scponly shell 以完成相反的操作。
经过一番谷歌搜索后,这实际上是不可能的。
看看这个讨论:http://www.mydatabasesupport.com/forums/unix-admin/387261-how-restrict-ssh-users-block-scp-sftp.html