我想授予某人在我的Ubuntunetworking服务器上托pipe一些简单文件的权限。 这是一个IRC日志logging机器人。 我想给他们无密码的ssh / scp / rsync / sftp访问。 但是我想限制他们能做的事情,我不想给他们一个完整的ssh shell。 我也希望能够限制他们可以占用的磁盘空间,所以他们不能使用总共200MB以上的磁盘空间。
不需要,但可能是不错的奖励选项:限制他们可以上传什么types的文件? (Mimetypes可能?)他们上传文件时logging? 限制他们的带宽?
我有什么select?
在Ubuntu / Debian上,您可以安装scponlyshell以将其限制为仅限scp / sftp。 只需安装软件包并将其shell更改为/usr/bin/scponly :
sudo aptitude安装scponly sudo usermod -s / usr / bin / scponly USERNAME
磁盘空间问题可能最好用文件系统配额来解决。 不幸的是,我对他们没有什么经验。
如果你想得到更好的(限制文件types等),你可能需要编写自己的脚本来validation从客户端传来的命令。 最简单的脚本将是一个执行类似于这个testing的shell脚本:
如果[[$ SSH_ORIGINAL_COMMAND =“scp -f * txt”]]
然后
exec $ SSH_ORIGINAL_COMMAND
科幻
这将允许下载.txt文件。 快速testing表明文件名在发送时不作为scp命令的一部分传递。 所以在这种情况下可能是不可能的。
该脚本将被设置为用户密钥的强制命令。 (authorized_keys中的“command =“blah”''字段。)它也可以设置为sshd_config中匹配组的“ForceCommand”选项,如下所示:
匹配组scponly ForceCommand / usr / local / sbin / scpwrapper
然后将用户限制在“scponly”组中。
编辑:通过请求,这是我用来执行rsync-only访问的脚本:
#!/斌/庆典
#
#确认rsync命令似乎是合法的rsnapshot命令。
#需要> = bash 3.x
#
Ben Beuchler
#6/4/07
#rsync需要在“服务器”模式下运行。
re_server ='rsync --server'
#匹配-x和--word选项
re_options ='+ - {1,2} [[:alpha:] - ] +'
#匹配合法path
re_paths ='+ [ - [:alnum:] _。/] +'
#构build完整的正则expression式
R = “^ $ {re_server}($ {re_options})+($ {re_paths}){2} $”
echo $ SSH_ORIGINAL_COMMAND >> ssh_log
如果[[$ SSH_ORIGINAL_COMMAND =〜$ r]]
然后
exec $ SSH_ORIGINAL_COMMAND
其他
回声“无效的rsync命令。”
科幻
使用该脚本作为强制命令(或者通过〜/ .ssh / authorized_keys中的“command =”或者使用sshd_config中的“匹配”模块,如上所述),它将拒绝除rsync命令之外的所有内容。 稍微调整一下就可以只接受特定的rsync命令。
一个可能的解决scheme是使用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
我之前在这方面看到过这个成功的实现,虽然我自己也没做过。
SSH提供了一种创build密钥对的机制,可以将其限制为一个命令或一组命令。 请参考linuxjournal网站上的这篇文章 ,了解如何创build用于脚本和cron作业的专用ssh密钥。 这也可以应用于使用户能够无密码地访问服务器并远程运行特定的命令。
这个stackoverflow问题也有一些很好的例子,如何做同样的事情,在lj文章中讨论。 具体来说,您正在使用authorized_keys文件来添加允许访问的密钥,但限制这些密钥我包括在authorized_keys文件中的一个字段中的命令。
我无法让bash脚本正常工作和清理rsyncinput,也许我错过了一些东西,而是发现了一个名为authprogs的perl程序
这也是一个更复杂的方式,但它进一步,并允许你也加强对IP。