В доступе отказано, несмотря на соответствующие разрешения с использованием PHP - PullRequest
14 голосов
/ 04 августа 2011

Я пытаюсь прочитать файл на PHP и получаю сообщение об ошибке «Отказано в доступе», хотя у всех есть доступ на чтение к файлу.

Код PHP:

$config=file_get_contents('/opt/jenkins/home/config.xml');

Ошибка:

Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...]

Разрешение файловой системы:

Существует символическая ссылка, указывающая /opt/jenkins/home/ на /var/lib/jenkins, и каждый имеет разрешение на чтение символической ссылки, фактической папки и файла.

$ ls -lh /opt/jenkins/
lrwxrwxrwx 1 sysadmin sysadmin   16 2011-08-04 08:12 home -> /var/lib/jenkins

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

$ ls -lh /var/lib/jenkins/config.xml
-rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml

Конфигурация Apache

Настроен на следующие символические ссылки (Options All). Добавление директивы Directory для /var/lib/jenkins/ не имеет значения.

<Directory /opt/jenkins/home/>
        Options All
        AllowOverride All
        Order Allow,Deny
        Allow from All
</Directory>

Дополнительная информация

Использую ли я путь через символическую ссылку ("/opt/jenkins/home/config.xml") или реальный путь ("/var/lib/jenkins/config.xml"), у меня та же проблема.

apache2 version=2.2.14-5ubuntu8.4
php version=5.3.2-1ubuntu4.9

Есть идеи, почему я получаю ошибку?

Ответы [ 4 ]

12 голосов
/ 04 августа 2011

Для работы вашего каталога требуется разрешение execute. Похоже, он не выполняет world, и, поскольку jenkins, вероятно, не пользователь apache, а пользователь apache не входит в группу adm, он не будет работать:

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

За пример:

netcoder@netcoder:~$ mkdir foo
netcoder@netcoder:~$ echo hello > foo/bar
netcoder@netcoder:~$ chmod 777 foo/bar
netcoder@netcoder:~$ ls -lsah foo/bar 
4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar
netcoder@netcoder:~$ chmod 444 foo/
netcoder@netcoder:~$ ls -lsah | grep foo
4.0K dr--r--r--  2 netcoder netcoder 4.0K 2011-08-04 08:22 foo
netcoder@netcoder:~$ cat foo/bar 
cat: foo/bar: Permission denied

Даже если foo/bar имеет разрешение 0777, если каталог не имеет разрешения на выполнение, чтение его содержимого запрещено.

Вам потребуется установить разрешение как для целевого каталога, так и для символической ссылки.

7 голосов
/ 04 августа 2011

Вам необходим бит выполнения, установленный во всех каталогах в иерархии вплоть до этого файла.

chmod o+x /var/lib/jenkins

должен добиться цели.

(Примечание: ls -lhd /var/lib/jenkins немного лучшечем ls -lh ...|grep jenkins)

3 голосов
/ 27 июня 2018

Множество современных устройств (digital ocean, rackspace и т. Д.) Поставляются с SELinux (Security Enhanced Linux) для совместимых с RedHat ОС (например, CentOS).Это бросает еще один рывок в дела, которые вы должны иметь в виду.Вы можете установить свои разрешения идеально , и он по-прежнему будет говорить, что разрешение отклонено.Вам необходимо определить доступный для записи контекст для SELinux:

sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite -R

0 голосов
/ 14 августа 2014

Скорее всего, ваш пользователь apache не имеет права читать или получать доступ к веб-файлам

  1. Проверьте, какой пользователь работает под Apache:

    $ ps aux | grep [a]pache
    root     40283  0.0  0.2 472548 21116 ?        Ss   14:38   0:00 /usr/sbin/apache2 -k start
    www-data 40287  0.0  0.1 472760  8800 ?        S    14:38   0:00 /usr/sbin/apache2 -k start
    www-data 40288  0.0  0.1 472760  8540 ?        S    14:38   0:00 /usr/sbin/apache2 -k start
    www-data 40289  0.0  0.1 472776  8540 ?        S    14:38   0:00 /usr/sbin/apache2 -k start
    
  2. Проверьте путь владения вашими веб-файлами:

    $ namei -mol /home/john/app2/
    f: /home/john/app2/
    drwxr-xr-x root root  /
    drwxr-xr-x root root  home
    drwx------ john john  john         # <== Ahaa, no access for apache user!
    drwxr-xr-x john john  john app2
    
  3. Отрегулируйте разрешения соответственно:

Что ж, на этом шаге я оставлю на ваше усмотрение , вы можете либо (a) сделать пользователя apache 'john' в этом примере . Или вы можете (b) переместить веб-папку в место вне home. Где доступ может быть предоставлен группе или даже другим, не нарушая передовой опыт в области безопасности.

а. Сделайте apache user john (ТОЛЬКО ДЛЯ САЙТОВ DEV или если вы знаете, что делаете)

sudo vi /etc/apache2/envars 
# replace 
export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data
# with
export APACHE_RUN_USER=john 
export APACHE_RUN_GROUP=john

б. Переместите эту папку из дома ... что она там делает?

sudo mv /home/john/app2 /var/www/

Не забудьте изменить сайт в соответствии с этим каталогом и перезапустить сервер apache.

Вот несколько ссылок:

https://wiki.apache.org/httpd/13PermissionDenied

http://wiki.apache.org/httpd/FileSystemPermissions

...