使用Solaris和Linux服务器以及OpenSSH,是否可以阻止用户使用“ scp”复制文件,同时仍然允许使用“ ssh”访问shell?
我意识到很难防止'ssh $ server“猫文件”'类型的文件访问,但是我需要了解有关停止启动程序的“ scp”的信息。
如果失败,有没有办法可靠地通过服务器日志记录所有SCP访问syslog
?
使用Solaris和Linux服务器以及OpenSSH,是否可以阻止用户使用“ scp”复制文件,同时仍然允许使用“ ssh”访问shell?
我意识到很难防止'ssh $ server“猫文件”'类型的文件访问,但是我需要了解有关停止启动程序的“ scp”的信息。
如果失败,有没有办法可靠地通过服务器日志记录所有SCP访问syslog
?
Answers:
虽然您可以将其编辑/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
我将改为确定用户可能将其用于什么。因为如果只有少数命令希望它们可以访问,那么我将删除它们甚至调用普通ssh
shell的功能。
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,那么您真正希望的最大就是降低它们的速度,并使其更加困难。
正如其他人指出的那样,您不能阻止scp(嗯,您可以:rm /usr/bin/scp
,但这并不能真正带您到任何地方)。
最好的办法是将用户的外壳程序更改为受限外壳程序(rbash),然后再运行某些命令。
请记住,如果他们可以读取文件,则可以将其复制/粘贴到屏幕之外。二进制文件?xxd / uuencode / mmencode都可以解决此问题。
我还建议您使用流程会计来帮助您跟踪活动。
当您仍然允许传输文件的字面无限的附加机制时,通过停止“ scp”一无所获。禁止使用scp但允许其他机制来复制文件是对审核员说谎的一种方法。审核员经常要求撒谎。通常,我看到审核员与经理合作进行伪造的修复,以便他们可以声明“已禁用scp文件传输命令,以便无法使用scp从服务器复制文件”之类的内容。
现在,合理的日志记录机制将是不错的。也许经过审核最终可以在Linux上运行。也许Solaris最终添加了某种机制,或者可以安全使用dtrace。希望操作系统在每次访问文件时都记录日志是合理的。当然,“阅读”和“复制”没有区别。但这可以使审核员满意,并为系统提供显着的安全性。您的日志可能太嘈杂,以至于数据无用,甚至您不得不被迫保留很短的审核记录。(例如,您不能记录每个read(),并且一个执行令人惊讶的应用程序会使记录每个open()成为灾难)。
如果数据包的大小大于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
号, scp
并且ssh
在相同的端口上运行并使用相同的协议。如果您打开一个ssh
会话,甚至可以使用诸如之类的选项与以后的scp呼叫共享连接ControlMaster
。
如果您不希望人们从计算机上复制特定文件,则不应授予他们对计算机的任何外壳访问权限。
在不删除太多系统实用程序的情况下阻止文件传输,以致使机器完全无法使用是不可能的。您必须摆脱所有能够将文件内容显示到stdout的东西,以及所有能够将其stdin写入stdout的东西,而当您删除所有这些东西时,剩下的东西太少了,根本没有必要允许shell访问完全没有
因此,我将专注于您的日志记录替代方案:
实际上,每个发行版中都包含一个名为“脚本”的程序,该程序应该易于安装在没有该脚本的程序上。它是一个会话记录器,可以记录外壳程序的所有输入和输出,还可以选择包含定时数据,以便可以对其进行重放,就像您在观察用户的肩上一样。(无论如何,有95%的情况会在涉及ncurses时偶尔使输出气泡化,但不是很常见。)
它的手册页包含有关将其设置为系统登录shell的说明。确保日志存储在用户不能删除的地方(仅附加文件系统属性(可通过chattr设置)对此很有用。ACL或inotify脚本也可以)
这仍然不能阻止用户将文件复制到系统外,但是可以让您查看哪些用户以及何时进行了哪些操作。绕行可能不是不可能,但是绕过几乎可以肯定会出现在日志中,因此您至少知道某人的行为是不好的,即使他们设法完全隐藏了它的真实内容。
我相信您可以在服务器上卸载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