Назад | Перейти на главную страницу

Скрипт, который проверяет, что Apache (или любая учетная запись) имеет надлежащее разрешение для перехода в каталог.

Кажется, что Apache необходимо как минимум разрешение на чтение и выполнение для всех подкаталогов пути, чтобы обслуживать файлы в каталоге.

Есть ли у кого-нибудь сценарий или однострочный текст, который мог бы это проверить?

Я думал, возможно, bash сценарий, который будет su - apache а затем попытайтесь перейти к каждому каталогу по пути. Я собираюсь попробовать кое-что и опубликую, если у меня что-то работает.

Для Debian:

sudo -u www-data test -r /path/to/file && echo ok

Рассматривать:

#!/bin/bash
# testperms.sh

if [ -r $1 ];
   then echo "Can read file!";
else
   echo "Cannot read file!";
fi

Использование:

 shultzc@lithium:~$ ./testperms.sh /etc/ssl
 Can read file!
 shultzc@lithium:~$ ./testperms.sh /etc/ssl/private
 Cannot read file!

Вы должны уметь адаптировать этот код под свои нужды. В комбинации с sudo его можно легко использовать для проверки доступности файлов в каталогах только с разрешениями + x (например, во многих домашних каталогах), например:

 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!

Последующий find команды должны запускаться от имени пользователя root или, по крайней мере, пользователя, имеющего полный доступ к дереву каталогов. Вам потребуется дополнительная проверка, чтобы проверить доступ к путям, используемым в командах поиска. Это можно сделать, запустив команду от имени целевого пользователя. Сбои при работе от имени пользователя без полномочий root должны обрабатываться соответствующим образом.

Заменить /srv/www с соответствующим каталогом или каталогами для ваших требований. Измените пользователя и группу соответствующим образом для других пользователей. Если пользователь принадлежит к нескольким группам, вам нужно будет добавить дополнительные тесты для дополнительных групп. (Во многих случаях может быть достаточно просто пометить файлы, принадлежащие вторичным группам.)

Для системы, где apache работает как www-data:www-data следующее найдет файлы, которые нельзя прочитать.

find /srv/www ! -type d ! \( -user www-data -perm -400 \) -a ! \( -group www-data -perm -040 \) -a ! -perm -004

Эквивалент для доступных каталогов:

find /srv/www -type d ! \( -user www-data -perm -500 \) -a ! \( -group www-data -perm -050 \) -a ! -perm -005

Для каталогов, которые не нужно указывать, используйте 1 вместо того 5 в приведенном выше. Файлы с известными именами будут доступны, но автоиндексирование не будет.

Вы также можете убедиться, что только несколько файлов или каталогов могут быть записаны. Следующее находит файлы и каталоги, которые тоже можно записывать.

find -L /srv/www \( -user www-data -perm -200 \) -o \( -group www-data -perm -020 \) -a -perm -002

Это то, что у меня получилось (должен запускаться как пользователь, который может 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"