Chmod для веб-приложения PHP

Я пишу веб-приложение. У этого есть:

  • index.php
  • / app – конечно, с .htaccess, но я не говорю об этом
  • / app / session – для сеансов, session_save_path (/ app / session) должен использоваться на моем сервере
  • / app / include – index.php содержит файлы из этого каталога
  • / app / config – только .xml файлы, файлы которых считывают классы из сценариев в include
  • / изображения, стили и т. д.

Мой вопрос:
Каковы правильные настройки chmod для вышеуказанных каталогов? Я знаю, что такое chmod (im работает в Linux), и я знаю, как я могу его изменить, но я не могу найти полезную информацию об этом. Только статьи, такие как «Как я могу изменить chmod на 777 …

И я не знаю, кто является владельцем, группой и другими. Моя страница будет на общем веб-сервере, поэтому я думаю, что владелец – это apache, а группа – это www-data, правильно?

Скажите, пожалуйста, какие у chmod должны быть каталоги (и файлы? Я использую -R для chmod для файлов) для безопасного веб-сайта. В основном речь идет о возможности вторжения в любой скрипт.

В WordPress есть хорошая статья, объясняющая разрешения файлов unix. Прочтите его, и вы поймете его основы. Короче (и не теоретически правильно):

Unix-системы определяют 3 разных «роли»: пользователя, группы и мира. Особенно «мир», похоже, путает людей.

Каждый файл AND и каталог (оба узла и, как таковые, не такие разные в системах Linux) назначаются пользователю и группе. Вы можете видеть пользователя и группу как «владельцев» конкретного файла / каталога (я расскажу о «узлах» дальше, потому что это не имеет большого значения). Разрешения для файлов определяют, кто может делать то, что с узлами. Пример:

Файл index.php присваивается пользователю «aso» и группе «www-data» и имеет способ доступа к файлам 644. Это означает, что пользователь (6) имеет права на чтение и запись, у группы есть только разрешения на чтение (4), как и «мир» (последние 4 из трех цифр).

Теперь сначала вы должны понимать, что каждый пользователь в системе * nix является частью группы. Название группы иногда совпадает с именем пользователя, но A GROUP – ДРУГОЙ ЭЛЕМЕНТ. Таким образом, возможно, что у вас есть пользователь, а также группа с именем «aso».

Файловые permssions строятся из «битмаски» следующим образом: разрешения чтения обозначаются цифрой 4, записываются на 2 и выполняются на 1. Любая комбинация может быть сделана из этого. В примере разрешения на запись и выполнение обозначаются как 3 (write = 2, execute = 1), а разрешения на чтение и выполнение обозначаются как 5 (read = 4, execute = 1).

Давайте посмотрим, что это значит, и я должен быть справедлив, чтобы сказать, что я не могу быть полным в этом вопросе. Пожалуйста, используйте Google, если хотите полную историю.

Если я создаю файл в моей системе * nix, он автоматически назначается мне (мой пользователь) и группе, частью которой является мой пользователь. Имея разрешения 644, это означает, что я (вошедший в систему с моим собственным пользователем) может прочитать файл и может его изменить (написать). Но у меня нет разрешений execute (x). Однако это не имеет значения, поскольку это относится только к исполняемым скриптам (сценарии оболочки, в большинстве случаев с расширением .sh). Группа, к которой принадлежит файл ('www-data'), имеет права на чтение, поэтому не может изменять файл. «Мир» также имеет разрешения на чтение.

Обратите внимание, что пользователь может быть частью нескольких групп, и поскольку такие права доступа к файлам nix ограничены: вы можете назначить права на запись для группы 1 и только разрешения на чтение для группы 2. В традиционных файловых системах это не возможное. Однако файловые системы, такие как reiserFS и Ext3, могут использовать расширенный ACL для выполнения таких вещей. Это еще одна история.

Что это значит? Это проще, чем ожидалось на самом деле, если вы понимаете, что означают назначенные права и какова разница между узлом файла и узлом каталога.

файлы

  • Читать: Способность читать содержимое
  • Запись: возможность изменять (писать и удалять) содержимое
  • Выполнить: Возможность выполнить файл (выполнить скрипт, со всеми возможными последствиями)

Справочники

  • Читайте: Умение читать его содержание. Это означает: список имен узлов, но НЕ содержание узлов, тип и т. Д.
  • Запись: возможность добавления / удаления файлов
  • Выполнить: возможность перечислить содержимое, включая тип, дату последней модификации и т. Д.

Вернемся к вашему делу. Если у вас есть обычная настройка (Linux-сервер с Apache и PHP в качестве модуля), ваши файлы будут назначены вашему ftp-пользователю и группе «www-data» (группа Apache работает от). Вам самим нужно читать и писать разрешения (так как иногда вы хотите изменить файл), но НЕ НУЖДАЕТ разрешения на выполнение (поскольку PHP – или HTML – это не исполняемые файлы). Таким образом, для пользователя вам понадобится 6 (read = 4, write = 2, combit 6). Для пользователя группы вам нужны только разрешения на чтение, так как Apache (или модуль PHP) нужно только прочитать содержимое вашего php-скрипта. Любой другой пользователь в системе не имеет ничего общего с вашими файлами и как таковой не нуждается ни в каких разрешениях (0).

Таким образом, для ВСЕХ ваших скриптов достаточно разрешений 640 (чтение и запись для пользователя, чтение для группы и ни одного для «мира»).

Для каталогов ваш пользователь нуждается во всех разрешениях (чтение = 4, запись = 2, выполнение = 1, всего 7). Зачем? Поскольку он должен читать его содержимое (имена узлов), должен быть в состоянии определить, является ли это файлом или узлом каталога (и другими свойствами) И должен иметь возможность добавлять и удалять файлы (вы хотите иногда добавлять файлы, ты?). Таким образом, мы дадим вашему пользователю 7.

Однако группа («www-data», группа Apache работает) требует только прав на чтение и выполнение. Разрешения на чтение для перечисления содержимого (имена узлов) и выполнения permissins для отображения других свойств (тип узла, время модификации и т. Д.). Он не нуждается в разрешениях на запись, потому что обычно вы не хотите, чтобы PHP (Apache) добавлял / удалял файлы из вашего дерева приложений.

Наконец, «мир», который является любым другим пользователем системы (это НЕ то же самое, что мир в его самом широком смысле), не нуждается в каких-либо разрешениях. Зачем кому-то еще на сервере нужен доступ к вашим файлам?

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


Обобщенный ответ на ваш вопрос, минимальный минимум:

  • Разрешения на файл: 640
  • Разрешения для каталога: 750

Но всегда хороший, достаточно стандартный и достаточно безопасный:

  • Разрешения файла: 644
  • Разрешения для каталога: 755

Я использую 640 на моем сервере. Файлы принадлежат мне, поэтому мне нужно читать и писать. Группа – это www-данные, которые apache может читать. PHP-скриптам не требуется выполнение для запуска (если используется php-модуль apache, который по умолчанию. Мне кажется, что вам нужно выполнить при использовании cgi), только чтение. Никто больше не нуждается в доступе. У меня есть папка uploads, которая дает apache write, но только эту одну папку, и я обычно отказываюсь от доступа с помощью .htaccess, отключает php, чтобы предотвратить загрузку скрипта или выкладывать его за пределы webroot; в зависимости от потребностей проекта.