如何授予某人 ssh 访问权限以远程上传文件?

Ama*_*rus 2 ssh rsync

我想授予某人在我的 Ubuntu 网络服务器上托管一些简单文件的权限。这是针对 IRC 日志记录机器人的。我想给他们无密码的 ssh/scp/rsync/sftp 访问权限。但是我希望能够限制他们可以做什么,换句话说,我不想给他们一个完整的 ssh shell。我还希望能够限制他们可以占用的磁盘空间量,因此他们总共不能使用超过(比如)200MB 的我的磁盘。

不需要但可能很好的奖励选项:限制他们可以上传的文件类型?(可能是 Mime 类型?)当他们上传文件时记录?限制他们的带宽?

我有哪些选择?

Ins*_*yte 7

在 Ubuntu/Debian 上,您可以安装scponlyshell 以将它们限制为仅 scp/sftp。只需安装软件包并将其外壳更改为/usr/bin/scponly

sudo aptitude install scponly
sudo usermod -s /usr/bin/scponly 用户名

磁盘空间问题可能最好通过文件系统配额来解决。不幸的是,我对他们的经验很少。

如果您想变得更高级(限制文件类型等),您可能需要编写自己的脚本来验证从客户端传递的命令。最简单的脚本是一个 shell 脚本,它执行类似于下面的测试:

if [[ $SSH_ORIGINAL_COMMAND = "scp -f *txt" ]]
然后
   执行 $SSH_ORIGINAL_COMMAND
菲

这将允许下载 .txt 文件。快速测试表明文件名在发送时没有作为 scp 命令的一部分传递。所以在这种情况下可能是不可能的。

该脚本将被设置为用户密钥的强制命令。(authorized_keys 中的 ``command="blah"'' 字段。)它也可以设置为 sshd_config 中匹配组的“ForceCommand”选项,如下所示:

匹配组 scponly ForceCommand /usr/local/sbin/scpwrapper

然后将受限制的用户添加到“scponly”组。

编辑:根据要求,这是我用来强制执行 rsync-only 访问的脚本:

#!/bin/bash
# 
# 验证 rsync 命令是否是合法的 rsnapshot 命令。
# 需要 >= bash 3.x
#
#本比彻勒
# 6/4/07

# 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

if [[ $SSH_ORIGINAL_COMMAND =~ $r ]]
然后
        执行 $SSH_ORIGINAL_COMMAND
别的
        echo "无效的 rsync 命令。"
菲

将该脚本用作强制命令(通过 ~/.ssh/authorized_keys 中的“command=”或如上所述在 sshd_config 中使用“Match”块),它将拒绝除 rsync 命令之外的所有内容。稍微调整一下,就可以只接受特定的 rsync 命令。