我有一个 Linux 服务器(Ubuntu 16.04),我在其中运行一些模拟。我想授予员工访问此服务器的权限,以便他可以测试他的代码(他将从他的个人计算机远程访问它),但不允许他从服务器下载任何文件到他的系统上。
这些文件非常大(多个 GB),所以我不担心他将文件的全部内容手动复制粘贴到他的计算机中。
那么我如何允许他进行 SSH 访问,但不允许他进行 SCP/WinSCP 访问呢?
答案1
我不确定如果他们真的想移走数据你可以这样做。您也许能够阻止运行scp
或sftp
,但这仍然留下许多其他传输文件的方式。
首先,真正简单的文件传输协议是这样的:
ssh user@hostname 'cat /some/remote/file' > /some/local/path
你可以cat
用几乎任何程序来替换,哎呀,甚至cp somefile /dev/stdout
看起来可行。
评论中提出了在特定时间或传输特定数据量后断开会话的建议。如果您还限制用户可以建立的连接数量,那么从表面上看这似乎是有效的。每天允许 10 个连接,每个连接限制为 1 MB,这将限制它们仅移动 10 MB。如果正常的预期用途需要比不需要的场景少得多的数据传输,那么也许可以使类似的东西起作用。
但如果他们只是将文件发送到其他地方怎么办?在其他地方设置 SSH/FTP/任何服务器并通过该服务器发送文件应该很容易。或者通过 HTTP(S),至少有和 之curl
类的选项,并且设置服务器端应该不难。如果删除已经存在的工具,如果它们在系统上运行的程序在/而不是处理数据时将数据发送出去怎么办?--data @filename
--upload-file
您需要做的是限制有权访问数据的程序可以使用某种沙箱执行的操作。
安排代码在无法访问外部的虚拟机中运行,除了用于上传代码和下载结果的某些接口之外,并对哪些内容被接受为有效上传和有效结果进行适当的控制。或者使用类似的东西seccomp
限制代码可以执行的操作。
答案2
您可以将 /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
并从服务器中删除 scp 并删除对其帐户的 sudo 访问权限。您可以根据需要重新添加 scp。