заставить WordPress / PHP соблюдать бит setgid при создании новых файлов и каталогов

444
chr0mag

Я размещаю несколько сайтов WordPress на LEMP VPS.

  • Каждый сайт имеет свою собственную установку Wordpress (находится под /srv/http/domain/wordpress), собственную учетную запись пользователя ( сайт-пользователь ) и свой собственный пул php-fpm, работающий как пользователь сайта .
  • Nginx работает под учетной записью http, и у всех файлов /srv/http/domain/wordpressесть сайт-пользователь: владелец http с разрешениями 0640 (файлы) и 2750 (каталоги).

Таким образом, каждый пользователь имеет полный RW- доступ к своим файлам / каталогам, но не имеет доступа к файлам / каталогам других сайтов. Nginx имеет доступ только для R к файлам / каталогам каждого сайта.

Я использую бит setgid, чтобы заставить новые каталоги, созданные /srv/http/domain/wordpressв, наследовать группу http, чтобы Nginx имел доступ для чтения к ним. Это работает, как и ожидалось, когда файлы создаются через SFTP.

Это мне кажется нормальным, и я могу успешно обновлять плагины, темы и WordPress через интерфейс wp-admin . Тем не менее, каждый раз, когда я выполняю задачу, требующую, чтобы WordPress создавал новые файлы / каталоги - в основном, каждый раз, когда я устанавливаю или обновляю плагин / тему или обновляю сам Wordpress - в результате владельцем файла становится сайт-пользователь: сайт-пользователь . Я хотел бы, чтобы вновь созданные файлы / каталоги учитывали бит setgid и создавали файлы / каталоги с владельцем сайта: владельцем http, чтобы Nginx мог читать эти файлы без моего вмешательства.

Я установил следующее в файле wp-config.php каждого сайта :

  • define( 'FS_CHMOD_DIR', ( 02750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Это заставляет права доступа к тому, что я хочу, но не влияет на владение.

Я читал это и это, но «решение» требует изменения кода PHP, чтобы избежать его использования, move_uploaded_file()что хорошо, если вы пишете свой собственный код PHP, но я не собираюсь начинать изменять файлы WordPress PHP. Я даже не уверен, что это источник моей проблемы.

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

Как контролировать владение файлами, созданными WordPress / PHP?

1
Пожалуйста, прочитайте тег WordPress, который вы включили. Вы задаете не по теме вопрос. См. [По теме] (https://superuser.com/help/on-topic). Вопросы о wordpress.com принадлежат [WebApps.SE]. Вопросы по установке и обслуживанию WordPress принадлежат [WordPress.SE] DavidPostill 6 лет назад 0
Это неловко. Я читаю это как проблему файловой системы / разрешений. Возможно сделать с веб-сервером. Сейчас я снова открываюсь, поговорив с @DavidPostill о том, как действовать дальше, если это не по теме, переместите его на соответствующий сайт. Journeyman Geek 6 лет назад 0
Я делал подобные вещи с Apache, и в основном вам нужно настроить Nginx на владение группой `http`. Подробнее [подробности здесь] (https://serverfault.com/questions/433265/how-do-i-change-the-nginx-user). JakeGould 6 лет назад 0
@JakeGould - рабочие потоки Nginx работают под http: http user / group, как указано в оригинальном сообщении. Проблема заключается в создании файлов, вновь созданных Wordpress (фактически PHP), для владения http-группами, чтобы Nginx мог их читать. chr0mag 6 лет назад 0
@DavidPostill - Извинения Дэвид. На самом деле я не думаю, что это проблема, связанная с Wordpress, но больше касается PHP и того, как настроить ваш стек LEMP в целом, включая права доступа к файлам Linux. chr0mag 6 лет назад 0

1 ответ на вопрос

1
chr0mag

Я нашел пару решений для этого:

  1. Новые файлы, созданные в Wordpress (на самом деле PHP), определяются пользователем групповыми директивами в конфигурационном файле пула php-fpm, в котором выполняется PHP. Таким образом, чтобы заставить вновь созданные файлы принадлежать сайту-пользователю: владение http, как я изначально надеялся, вы можете просто установить user = site-user и group = http в вашем файле конфигурации php-fpm для вашего сайта . Это работает в том, что вновь созданные файлы имеют владельца группы, которую я искал. Однако с точки зрения безопасности это частично противоречит цели создания отдельных пулов php-fpm для каждого сайта, поскольку любой пользователь сайта может потенциально создавать файлы PHP, которые будут иметь доступ для чтения к файлам / каталогам другого сайта.

  2. Проще и безопаснее, чем вышеописанный # 1, это иметь все файлы / каталоги сайта, принадлежащие site-user: site-user (вместо site-user: http, как я изначально планировал), а затем добавить пользователя http в сайт-пользователь группы . С разрешениями 640 (файлы) и 750 (папки) на всех сайтах это фактически дает nginx доступ только для чтения к файлам каждого сайта по мере необходимости, но при этом запрещает любому пользователю читать файлы любого другого сайта, кроме своих собственных.

Вариант № 2, описанный выше, не требует использования бита setgid, что упрощает работу, но требует добавления следующего в ваш файл wp-config.php :

  • define( 'FS_CHMOD_DIR', ( 0750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Без вышеприведенных строк WordPress / PHP создаст общедоступные файлы (644) и папки (755).

Отличный вопрос с автоответчиком !!! JakeGould 6 лет назад 0

Похожие вопросы