Para o Debian:
sudo -u www-data test -r /path/to/file && echo ok
Parece que o Apache precisa de pelo menos permissão de leitura e execução para todos os subdiretórios de um caminho para servir os arquivos no diretório.
Alguém tem um script ou uma linha que possa verificar isso?
Eu estava pensando talvez em um script bash
que irá su - apache
e, em seguida, tentar navegar para cada diretório no caminho. Eu vou tentar algumas coisas e vou postar se eu aparecer algo que funcione.
Considere:
#!/bin/bash
# testperms.sh
if [ -r $1 ];
then echo "Can read file!";
else
echo "Cannot read file!";
fi
Uso:
shultzc@lithium:~$ ./testperms.sh /etc/ssl
Can read file!
shultzc@lithium:~$ ./testperms.sh /etc/ssl/private
Cannot read file!
Você deve adaptar o código às suas necessidades. Em combinação com sudo
, ele pode ser usado facilmente para testar a acessibilidade de arquivos dentro de diretórios com somente permissões + x (como muitos diretórios de usuário), por exemplo:
shultzc@lithium:~$ sudo -u www-data ./testperms.sh /home/shultzc/testperms.sh
Can read file!
shultzc@lithium:~$ sudo -u www-data ./testperms.sh /home/shultzc
Cannot read file!
Isto é o que eu tenho (deve ser executado como um usuário que poderia su - <test user>
:
#!/bin/bash
IFS='/'
CWD='/'
for dir in $2; do
# Set directory to test
if [[ $CWD == '/' ]]
then
CWD="/$dir"
else
CWD="${CWD}/${dir}"
fi
# Test if user has access
if !(su - $1 -c "cd $CWD" 2> /dev/null)
then
echo "$CWD - No access for $1"
exit -1
fi
done
echo "Access for $1 all the way through $2"
Os comandos find
a seguir devem ser executados como raiz ou, pelo menos, um usuário com acesso total à árvore de diretórios. Você precisará de uma verificação adicional para verificar o acesso aos caminhos usados nos comandos find. Isso pode ser feito executando o comando como o usuário de destino. Falhas ao executar como um usuário não-root devem ser tratadas apropriadamente.
Substitua /srv/www
pelo diretório ou diretórios apropriados para seus requisitos. Altere o usuário e o grupo adequadamente para outros usuários. Se o usuário pertencer a vários grupos, você precisará adicionar testes adicionais para os grupos secundários. (Em muitos casos, apenas sinalizar arquivos pertencentes aos grupos secundários pode ser suficiente.)
Para um sistema no qual apache
é executado como www-data:www-data
, o seguinte localizará arquivos que não podem ser lidos.
find /srv/www ! -type d ! \( -user www-data -perm -400 \) -a ! \( -group www-data -perm -040 \) -a ! -perm -004
O equivalente para diretórios acessíveis é:
find /srv/www -type d ! \( -user www-data -perm -500 \) -a ! \( -group www-data -perm -050 \) -a ! -perm -005
Para diretórios que não precisam ser listados, use 1
em vez de 5
no exemplo acima. Arquivos com nomes conhecidos estarão acessíveis, mas a geração de índice automático não será.
Você também pode querer garantir que apenas alguns arquivos ou diretórios possam ser gravados. O seguinte encontra arquivos e diretórios que podem ser escritos também.
find -L /srv/www \( -user www-data -perm -200 \) -o \( -group www-data -perm -020 \) -a -perm -002