Dando permissões de gravação para www-data para um arquivo na casa do usuário com acesso limitado ao shell?

0

Eu tenho acesso a um servidor remoto com ssh , mas o acesso é limitado: minha conta, digamos UseR , pode criar arquivos em /tmp e em seu diretório pessoal, mas não em outro lugar; ele pode chamar chmod sem sudo nos próprios arquivos, mas não pode chamar chown .

Nesse contexto, primeiro quis dar às permissões de usuário www-data do Apache para criar arquivos em um subdiretório da pasta base de UseR ; mas não importa o que eu fiz, eu não pude - eu sempre tive "permissão negada". Então, pensei que talvez pudesse apenas dar permissões a um arquivo, então www-data pode escrever nele sem criá-lo - eu fiz o script abaixo permtest.sh para testar esse conceito e executá-lo via ssh como UseR , e de um script php para que ele seja executado como www-data ; e obtivemos alguns logs.

Esta é a divisão dos elementos do caminho envolvidos:

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

Eu executo permtest.sh 1 primeiro como UseR , em seguida, como www-data , que inicia arquivos em /tmp e /home/users/GROUP/UseR/tmp e, em seguida, execute permtest.sh 2 como www-data como UseR , que tenta anexar para arquivos; e finalmente execute permtest.sh 3 as UseR para imprimir os arquivos, cujo resultado é:

+ 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

Assim, as coisas são: em /tmp , UseR e www-data podem criar um arquivo com 777 permissões na instanciação, ao qual o outro usuário pode acrescentar posteriormente. Mas isso parece impossível de fazer no subdiretório da pasta base /home/users/GROUP/UseR/tmp ; se executado como www-data , independentemente de tentar anexar a /home/users/GROUP/UseR/tmp/MYtest_UseR.txt de propriedade de UseR ou de tentar criar /home/users/GROUP/UseR/tmp/MYtest_UseR.txt , o comando falhará com cannot create ... Permission denied . Observe que isso acontece com a pasta contida /home/users/GROUP/UseR/tmp com 777 permissões.

Então minhas perguntas são estas:

  • Existe alguma coisa nas informações acima, que me diria a priori que www-data não será capaz de criar um arquivo na pasta do usuário /home/users/GROUP/UseR/tmp ? Se não, como eu poderia, em princípio, obter essa informação (além de executar o script abaixo)?
  • Quais opções eu tenho, como usuário limitado, para permitir permissões de gravação para um arquivo em /home/users/GROUP/UseR/tmp to www-data , de modo que ele possa modificar / anexar dados?

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
    
por sdaau 21.06.2015 / 12:48

1 resposta

1

Sua saída ls é exibida com um sinal + nos modos em que seus arquivos e diretórios estão usando ACLs.

drwxr-xr-x+ ...

Estes podem restringir seus acessos. Listar as permissões de acl com

getfacl <file or directory>

e remova-os com

setfacl -b <file or directory>

verifique novamente.

EDIT do OP: Na verdade, é isso - aqui está um trecho do que eu fiz no shell ssh (primeiro copiando permissões de outro lugar em um arquivo, depois dando permissões extras para www-data no outro arquivo) - e depois, www-data poderia acrescentar tudo a esses arquivos:

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
    
por 21.06.2015 / 18:51