pipe理Linux目录权限和SFTP

早上好; 我有一个RHEL 5.7 Web服务器configuration为只允许特定组的SSH / SFTP。 我希望内容pipe理员将内容上传到各自的目录,并且不pipe上传方法或应用程序如何,该内容都会inheritance目录的用户/组所有权。 例如:

  • John用于SSH / SFTP权限“web”组和目录权限的“finance” ,并通过SFTP上传到目录“webstuff”
  • 目录“webstuff”具有“2760”(rwxrws —)权限,以及“apache:finance”的所有权。

如果John将更新上载到“webstuff”中的现有文件,则文件的所有权保留在“apache:finance” 。 如果John将新file upload到“webstuff” ,则文件的所有权为“john:finance”

我的愿望是将任何来自John的file upload到“webstuff”,以转换到目录的所有者。 我已经尝试setuid和setgid都设置,但用户所有权没有采取。 我已经在ServerFault上看到了使用ACL或者用于SFTP的chroot监狱,但是我还没有configuration和testing它们,我不知道它们是否是一个可行的解决scheme(它们可能是,我只是不知道,因为我从来没有做过)。 任何想法和援助将不胜感激。

问题是,sftp作为用户的id运行 – 首先,sftp客户端ssh作为给定用户进入目标主机,然后运行sftp-server。 由于sftp-server是以普通用户身份运行的,因此无法“放弃”文件(更改文件所有者)。

但是,如果您可以使用scp,并为每个用户分配一个密钥对,则可以解决此问题。 这涉及到用户的密钥添加到根目录的〜/ .ssh / authorized_keys文件中,使用“command =”参数来强制它运行一个脚本来清理和修改服务器端scp程序的参数。 我之前使用这种技术来设置一个匿名scp dropbox,允许任何人提交文件,并确保没有人能够检索提交的文件,并防止覆盖。

如果你愿意接受这个技术,请告诉我,我会用一个快速的配方更新这个post。

编辑:根据评论,这是我最初用来build立一个匿名收件箱的配方。 但它也应该为此目的而工作。

如果您希望John写入将文件上载到/var/www/webstuff ,并将用户ID为apache任何文件写入它,则:

1)生成一个SSH密钥对:

 ssh-keygen -t rsa -f john-scp-key 

2)编辑公钥文件“john-scp-key.pub”,并在开始处插入“command =”语句如下:

 command="/usr/local/bin/strictscp ^/var/www/webstuff" ssh-rsa AAAA..... (reset of key follows) 

3)将john-scp-key.pub的内容添加到john-scp-key.pub ~apache/.ssh/authorized_keys文件(如果该文件不存在,则创build该文件,确保.ssh目录和authorized_keys都由apache拥有,而不是无论是集团还是世界都可写)

4)创build脚本/usr/local/bin/strictscp ,如下所示:

 #!/bin/sh read cmd arg1 arg2 <<EOT $SSH_ORIGINAL_COMMAND EOT if [ "$cmd" = scp -a "$arg1" = -t ] && echo "$arg2" |grep "$1" >/dev/null 2>&1 then eval $cmd $arg1 $arg2 fi 

5)现在把私钥文件john-scp-key给John,让他把文件复制到你的web服务器上,如下所示:

 scp -i john-scp-key some_file.html apache@yourserver:/var/www/webstuff/ 

这种方式是当你使用scp将文件复制到服务器时,scp客户端使用ssh在服务器上执行“scp -t / path / name”。 使用密钥对时,可以覆盖执行的命令,并在使用该密钥时强制执行特定的命令。 请求的原始命令及其参数位于环境variables“$ SSH_ORIGINAL_COMMAND”中。 所以我们把COMMAND=指向一个脚本来检查允许的参数(在这种情况下,它validation了第三个参数是我们想写的东西的特定目录),所以这个键只是为了它的预期目的,用于在服务器上运行任意命令。

您可以通过检查目标文件是否存在来进一步lockingstrictscp脚本,也可以在最后添加一个chgrp命令来设置文件的组所有权(假设apache是该组的成员)。

希望这有助于 – 如果你有任何问题,让我知道,我会看看如果我能进一步改善这个答案。