Um script que verifica se o Apache (ou qualquer conta) tem permissão adequada para navegar para um diretório

1

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.

    
por Belmin Fernandez 04.03.2012 / 22:20

4 respostas

6

Para o Debian:

sudo -u www-data test -r /path/to/file && echo ok
    
por 04.03.2012 / 23:06
1

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!
    
por 04.03.2012 / 22:51
0

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"
    
por 04.03.2012 / 22:57
0

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
    
por 05.03.2012 / 04:37