为用户家中的文件授予 www-data 写入权限,并具有有限的 shell 访问权限?

为用户家中的文件授予 www-data 写入权限,并具有有限的 shell 访问权限?

我可以使用 访问远程服务器ssh,但访问权限受到限制:例如UseR,我的帐户可以在/tmp其主目录中及其主目录中创建文件,但不能在其他地方创建文件;它可以在chmod没有sudo自己的文件的情况下调用,但不能调用chown.

在这种情况下,我首先想授予 Apache用户在主文件夹www-data的子目录中创建文件的权限;UseR但无论我做什么,我都做不到——我总是得到“许可被拒绝”。然后,我想也许我可以给一个文件授予权限,这样www-data就可以在不创建它的情况下写入它 - 我制作了下面的脚本permtest.sh来测试这个概念,并通过 ssh as 运行它UseR,并从 php 脚本运行它,因此它运行为www-data;并获得了一些日志。

这是所涉及的路径元素的细分:

755 drwxr-xr-x 27 root root 4096 Apr 28 11:51 /
1777 drwxrwxrwt 7 root root 4096 May 25 11:22 /tmp
755  drwxr-xr-x 9 root root 4096 Oct 25  2013 /home
755  drwxr-xr-x 9 root root 4096 Apr 29 12:49 /home/users
755  drwxr-xr-x+ 12 no root 4096 Apr 30 17:07 /home/users/GROUP
775  drwxrwxr-x+ 47 UseR group_users 4096 Jun 21 11:20 /home/users/GROUP/UseR
777  drwxrwxrwx+ 3 UseR group_users 4096 Jun 21 11:22 /home/users/GROUP/UseR/tmp

permtest.sh 1首先运行 as UseRthen as ,它在和www-data中启动文件,然后首先运行 as then as ,它尝试附加到文件;最后运行as打印出文件,结果为:/tmp/home/users/GROUP/UseR/tmppermtest.sh 2www-dataUseRpermtest.sh 3UseR

+ cat /tmp/MYtest_UseR.txt
testing write
testing write again
test www-data append
test UseR append
+ cat /home/users/GROUP/UseR/tmp/MYtest_UseR.txt
testing write
testing write again
test UseR append
+ cat /tmp/MYtest_www-data.txt
testing write
testing write again
test www-data append
test UseR append
+ cat /home/users/GROUP/UseR/tmp/MYtest_www-data.txt
test UseR append

所以,事情是这样的:在 中/tmpUseR和都www-data可以在实例化时创建一个具有 777 权限的文件,其他用户可以随后追加到该文件。但这在主文件夹子目录中似乎不可能做到/home/users/GROUP/UseR/tmp;如果运行为www-data,无论是尝试附加到/home/users/GROUP/UseR/tmp/MYtest_UseR.txt拥有的UseR,还是尝试创建/home/users/GROUP/UseR/tmp/MYtest_UseR.txt- 该命令都会失败并显示cannot create ... Permission denied。请注意,这种情况发生在包含权限为 777 的文件夹中/home/users/GROUP/UseR/tmp

所以我的问题是:

  • 上述信息中是否有任何内容可以告诉我先验www-data将无法在用户文件夹中创建文件/home/users/GROUP/UseR/tmp?如果没有,原则上我如何获取此信息(除了运行下面的脚本之外)?
  • 作为受限用户,我有哪些选项可以允许/home/users/GROUP/UseR/tmpto中的文件写入权限www-data,以便它可以修改/追加数据?

permtest.sh:

#!/bin/sh

STAGENUM=${1}
MESELF=$(whoami)
if [ "$STAGENUM" = "" ] ; then
  STAGENUM=1
fi

if [ "$STAGENUM" = "1" ] ; then
  for ix in /tmp /home /home/users /home/users/GROUP /home/users/GROUP/UseR /home/users/GROUP/UseR/tmp ; do
    printf '%s ' `stat -c "%a " ${ix} 2>&1`
    ls -lad ${ix} 2>&1
  done

  set -x
  for ix in /tmp /home/users/GROUP/UseR/tmp ; do
    touch ${ix}/MYtest_${MESELF}.txt 2>&1
    chmod 777 ${ix}/MYtest_${MESELF}.txt 2>&1
    ls -la ${ix}/MYtest_${MESELF}.txt 2>&1
    echo "testing write" > ${ix}/MYtest_${MESELF}.txt 2>&1
    echo "testing write again" | tee -a ${ix}/MYtest_${MESELF}.txt 2>&1
    cat ${ix}/MYtest_${MESELF}.txt 2>&1
    echo rm ${ix}/MYtest_${MESELF}.txt 2>&1 # don't remove now
  done
fi

if [ "$STAGENUM" = "2" ] ; then
  set -x
  echo "test $MESELF append" >> '/tmp/MYtest_UseR.txt' 2>&1
  echo "test $MESELF append" >> '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
  echo "test $MESELF append" >> '/tmp/MYtest_www-data.txt' 2>&1
  echo "test $MESELF append" >> '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
  set +x
  ls -la '/tmp/MYtest_UseR.txt' 2>&1
  ls -la '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
  ls -la '/tmp/MYtest_www-data.txt' 2>&1
  ls -la '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
fi

if [ "$STAGENUM" = "3" ] ; then
  set -x
  cat '/tmp/MYtest_UseR.txt' 2>&1
  cat '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
  cat '/tmp/MYtest_www-data.txt' 2>&1
  cat '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
  set +x
fi

if [ "$STAGENUM" = "4" ] ; then
  rm '/tmp/MYtest_UseR.txt' 2>&1 ;
  rm '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1 ;
  rm '/tmp/MYtest_www-data.txt' 2>&1 ;
  rm '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
fi

答案1

您的 ls 输出显示为+登录文件和目录使用 ACL 的模式。

drwxr-xr-x+ ...

这些可能会限制您的访问。列出 acl 权限

getfacl <file or directory>

并删除它们

setfacl -b <file or directory>

然后再次检查。


来自OP的编辑:确实,就是这样 - 这是我在 ssh shell 中所做的一个片段(首先从一个文件上的其他地方复制权限,然后为www-data另一个文件提供额外的权限) - 然后www-data可以将罚款附加到这些文件:

UseR:~/tmp$ getfacl MYtest_www-data.txt
# file: MYtest_www-data.txt
# owner: UseR
# group: group_users
user::rw-
user:www-data:r-x       #effective:r--
group::r-x          #effective:r--
group:www-data:r-x      #effective:r--
mask::r--
other::r--

UseR:~/tmp$ getfacl /tmp/MYtest_www-data.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/MYtest_www-data.txt
# owner: www-data
# group: www-data
user::rwx
group::rwx
other::rwx

UseR:~/tmp$ getfacl /tmp/MYtest_www-data.txt | setfacl --set-file=- MYtest_www-data.txt
getfacl: Removing leading '/' from absolute path names
UseR:~/tmp$ getfacl MYtest_www-data.txt
# file: MYtest_www-data.txt
# owner: UseR
# group: group_users
user::rwx
group::rwx
other::rwx

UseR:~/tmp$ ls -la MYtest_www-data.txt
-rwxrwxrwx 1 UseR group_users 22 Jun 21 12:44 MYtest_www-data.txt

$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:r-x
group::r-x
group:www-data:r-x
mask::rwx
other::rwx

UseR:~/tmp$ setfacl -m u:www-data:w MYtest_UseR.txt
UseR:~/tmp$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:-w-
group::r-x
group:www-data:r-x
mask::rwx
other::rwx

UseR:~/tmp$ setfacl -m u:www-data:rw MYtest_UseR.txt
UseR:~/tmp$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:rw-
group::r-x
group:www-data:r-x
mask::rwx
other::rwx

相关内容