Кажется, что 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"