22 ноября 2013 г.

Ubuntu, PHP и права на доступ к файлам

Столкнулся со следующей проблемой:

- на моей VPS при попытке выполнения скрипта PHP команда fopen в момент создания файла выдала ошибку уровня Warning:

Warning: fopen() [function.fopen]: failed to open stream: Permission denied in index_test.php on line 21

То есть, переводя на русский - не хватает прав для создания (записи) файла.


Причина проста - хотя для решения пришлось порыться.



Итак, причина кроется в следующем:


- сервер Apache (и модуль PHP) выполняются от имени пользователя www-data

- но папки виртуального хоста (сайта для конкретного домена) создавались в ssh из-под пользователя root

То есть, владельцем папки и всех файлов внутри является root, а права на папку установлены как 755 (то есть, писать в неё может только владелец).


Некоторые советуют в таких случаях ставить права 777 на папку и всё что внутри - но это неправильно, так как при этом уменьшается безопасность сайта.


Итого, самым простым решением оказалось сменить владельца папки и всего что внутри на www-data, при этом права доступа по прежнему остались 755.



Сам же поиск и решение выглядел так (работал по ssh, не под root'ом):


1. Заходим в нужную нам папку, где лежит виртуальный хост.


2. Даём команду

ls -l
чтобы посмотреть владельца и группу. Получаем что-то вроде

total 8
drwxr-xr-x 2 root root 4096 Nov 22 11:05 public
drwxr-xr-x 5 root root 4096 Nov 22 11:49 sys


Выделенный полужирным (первый root) - это владелец. Второй root - это группа пользователей, назначенная для данных папок/файлов.

3. Смотрим, от имени какого пользователя исполняется Apache. Это можно сделать, дав команду

ps aux
а затем поискав в списке всех процессор Apache. Но чтобы искать было проще, даём команду
ps aux | grep -iE '(https|php|apache)'

Если точнее - это цепочка команда. Вторая (grep) отфильтрует вывод, и покажет то, что нам нужно. Так как в разных версиях Linux / UNIX процессы могут называться по разному, мы ищем сразу все подходящие.


В результате получим примерно такое:



www-data 26158  0.0  1.6  36256  8364 S 10:11   0:00 /usr/sbin/apache2 -k start
www-data 26817  0.0  1.6  36308  8348 S 11:32   0:00 /usr/sbin/apache2 -k start
www-data 26831  0.0  1.4  36256  7576 S 11:38   0:00 /usr/sbin/apache2 -k start

(Первый запуск может быть от имени root, мы же ищем запуски основных процессов apache).

В первой колонке - пользователь, от имени которого запущен процесс. Видим, что это www-data.

4. Меняем пользователя нужным нам папкам и файлам. Для этого используем команду
chown

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

sudo chown -R www-data *

Расшифрую по пунктам:
- sudo - выполннить от имени root (т.к. владелец root, а я работаю по ssh не под root'ом)
- chown -R - сменить владельца, причём рекурсивно для всех вложенных ресурсов
- www-data - имя нового владельца
- * - для всех папок/файлов, что находятся там, где я отдаю команду (ну и -R выполняет это рекурсивно вглубь)

Если надо - перед сменой владельца почитайте подробнее о команде chown.

2 комментария :

  1. Анонимный5 мая 2014 г., 23:58

    Привет!
    А если линукс как рабочая станция. У меня есть пользователь user, под которым я создаю сайт в папке /var/www/site1. Для того, чтобы апач+пхп "нормально воспринимали" я должен сделать смену пользователя на www-data, но потом я же не смогу редактировать свои файлы. Что думаете по этому поводу, запускать апач от имени user?

    ОтветитьУдалить
    Ответы
    1. Есть альтернативный вариант - он чуть сложнее. Его суть - использовать группы пользователей. Надо создать группу - скажем, www-data (или с другим именем), и в неё включить юзеров www-data и user (ну и других, каких надо; отмечу, что один пользователь может входить сразу в несколько групп).

      Затем для нужной папки/папок надо поменять группу И настроить правильные права доступа для группы (так как теперь наши права для данной папки будут определяться именно через права доступа группы, владельцем же может остаться даже root).

      Про основы работы с группами можно прочитать здесь - http://help.ubuntu.ru/wiki/%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B

      Удалить