我想授权某人在我的 Ubuntu 网络服务器上托管一些简单文件。这是为 IRC 日志机器人准备的。我想给他们无密码的 ssh/scp/rsync/sftp 访问权限。但是我想限制他们可以做什么,换句话说,我不想给他们一个完整的 ssh shell。我还想限制他们可以占用的磁盘空间量,这样他们总共不能使用超过(比如说)200MB 的磁盘空间。
虽然不是必需的但可能很有用的附加选项:限制他们可以上传的文件类型?(可能是 Mime 类型?)上传文件时记录日志?限制带宽?
我有什么选择?
答案1
在 Ubuntu/Debian 上,你可以安装scponly
shell 以将它们限制为仅使用 scp/sftp。只需安装软件包并将其 shell 更改为/usr/bin/scponly
:
sudo aptitude 安装 scponly sudo usermod -s /usr/bin/scponly 用户名
磁盘空间问题可能最好通过文件系统配额来解决。不幸的是,我对此没有什么经验。
如果您想要更高级的功能(限制文件类型等),您可能需要编写自己的脚本来验证从客户端传递的命令。最简单的脚本是执行类似以下测试的 shell 脚本:
如果 [[ $SSH_ORIGINAL_COMMAND = "scp -f *txt" ]] 然后 执行$SSH_ORIGINAL_COMMAND 菲
这将允许下载 .txt 文件。快速测试表明,文件名在发送时不会作为 scp 命令的一部分传递。因此,在这种情况下可能是不可能的。
该脚本将被设置为用户密钥的强制命令。(authorized_keys 中的“command="blah"”字段。)它还可以设置为 sshd_config 中 Match 组的“ForceCommand”选项,如下所示:
匹配组 scponly ForceCommand /usr/local/sbin/scpwrapper
然后将需要限制的用户添加到“scponly”组。
编辑:根据要求,这是我用来强制执行仅 rsync 访问的脚本:
/bin/bash #!/bin/bash # # 验证 rsync 命令是否是合法的 rsnapshot 命令。 # 需要 >= bash 3.x # # 本·比希勒 # 2007年6月4日 # rsync 需要以“服务器”模式运行。 re_server ='rsync --server' # 匹配 -x 和 --word 选项 re_options=' +-{1,2}[[:alpha:]-]+' # 匹配合法路径 re_paths=' +[-[:alnum:]_./]+' # 构建完整的正则表达式 r="^${re_server}(${re_options})+(${re_paths}){2}$" 回显 $SSH_ORIGINAL_COMMAND >> ssh_log 如果 [[ $SSH_ORIGINAL_COMMAND =~ $r ]] 然后 执行$SSH_ORIGINAL_COMMAND 别的 回显“无效的 rsync 命令。” 菲
将该脚本用作强制命令(通过 ~/.ssh/authorized_keys 中的“command=”或使用 sshd_config 中的“Match”块,如上所述),它将拒绝除 rsync 命令之外的所有内容。只需稍加调整,就可以让它只接受特定的 rsync 命令。
答案2
一个可能的解决方案是使用 ssh 虚拟 shell 将它们 chroot-jail 起来。
http://www.ssh.com/support/documentation/online/ssh/adminguide-zos/53/ssh-dummy-shell.html
http://en.wikipedia.org/wiki/Chroot_jail
虽然我自己没有这样做过,但我以前曾见过在这种情况下成功实施这种方法。
答案3
SSH 提供了一种创建密钥对的机制,该机制可以限制为单个命令或一组命令。请参阅此文章Linux杂志网站好文章介绍了如何创建专用 ssh 密钥以用于脚本和 cron 作业等。这还可以应用于让用户能够无密码访问服务器并远程运行特定命令。
这stackoverflow 问题还提供了有关如何执行 lj 文章中讨论的相同操作的一些很好的例子。具体来说,您使用 authorized_keys 文件添加允许访问的密钥,但通过在 authorized_keys 文件的某个字段中包含命令来限制这些密钥。
答案4
我无法让 bash 脚本运行并正确清理 rsync 输入,也许我错过了什么,相反,我发现了一个名为授权程序
这以更复杂的方式实现了相同的功能,但它更进一步,还允许您加强对 IP 的防御。