Как мне изменить права доступа к файлам для поддержки Wordpress?

Как мне изменить права доступа к файлам для поддержки Wordpress?

Я успешно использую метод, описанный здесь:Поддерживается одним пользователеми он хорошо работает для меня. Это мой скрипт для всех моих веб-сайтов:

sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/
sudo chown www-data:www-data /var/www/example.com/Uploads/
sudo chmod -R 755 /var/www/example.com/Uploads/

Я обслуживаю все сайты на этом сервере, а WebAdmin — это общий пользователь, которого я использую для FTP, а также для SSH.

Однако я недавно перенес несколько сайтов Wordpress с хостинговой компании на свой сервер, и вышеперечисленное не работает. Обновление Wordpress или его тем/плагинов дало мне ошибку:

Для выполнения запрошенного действия WordPress необходимо получить доступ к вашему веб-серверу. Введите ваши учетные данные FTP для продолжения. Если вы не помните свои учетные данные, вам следует обратиться к вашему веб-хостеру.

Есть несколько «исправлений», таких какВот этоткоторые больше похожи на обходные пути и, вероятно, небезопасны. Поэтому я использовал самый безопасный (AFAIK) метод и сделал www-data владельцем сайтов WordPress, оставив не-WordPress сайты как прежде. Другими словами, я просто запустил

sudo chown -R www-data /var/www/wp_example.com/

на сайтах WordPress. Это, конечно, работало, но это становится головной болью, когда дело касается ручного управления сайтом, потому что для этого мне нужно войти в систему как root. Я также не смогу назначить веб-сайт(ы) кому-то другому для управления в будущем. Обратите внимание, что некоторые из моих сайтов являются гибридными (частично WordPress и частично пользовательские страницы).

Поэтому мне интересно, есть ли лучшее решение, более элегантное и более общее, то есть, которое будет работать как для сайтов на WordPress, так и для сайтов, не основанных на WordPress.

Одна из возможностей — добавить пользователя WebAdmin в группу www-data. Или, может быть, www-data в группу пользователей WebAdmin? Что имеет больше смысла и что более безопасно?

решение1

Если и пользователь WebAdminнапрямую, и пользователь www-dataчерез группу www-dataдолжны писать в эти каталоги, этого 750недостаточно. Что исправит ваш текущий дизайн:

sudo chmod -R 770 /var/www/example.com/

Соображения безопасности

Однако в целом это означает, что каждый сайт PHP работает на одном и том же пользователе, и после этой модификации каждый сайт может читать и писать файлы любого другого сайта. Это означает, что компрометация любого из сайтов компрометирует их все.

Использование отдельного пользователя и пула PHP-FPM для каждого сайта разделит сайты на изолированные отсеки, что снизит этот риск. Вы можете администрировать сайт с тем же пользователем, который его запускает:

/var/www$ ls -l
drwxr-x--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxr-x--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxr-x--- 2 example-org www-data 4096 Aug 30 7:00 example.org

Если вам абсолютно необходимо, чтобы пользователь WebAdminуправлял всеми этими файлами, вы можете добавить пользователя в группу www-dataи предоставить ей права на запись, но я бы не рекомендовал этого делать.

/var/www$ ls -l
drwxrwx--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxrwx--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxrwx--- 2 example-org www-data 4096 Aug 30 7:00 example.org

PHP-FPM пулы

Поскольку я упомянул PHP FPM pools, вот краткий пример конфигурации. Существует несколько руководств, подробно объясняющих эти шаги.

  1. Установите PHP-FPM.

  2. /etc/php/8.2/fpm/pool.d/example-com.conf:

    [example-com]
    user = example-com
    group = example-com
    
    listen = /run/php/example-com.sock
    chdir = /var/www/example.com
    
    listen.owner = www-data
    listen.group = www-data
    
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    
    php_admin_value[disable_functions] = exec,passthru,shell_exec
    php_admin_flag[allow_url_fopen] = off
    php_admin_value[cgi.fix_pathinfo] = 1
    
    security.limit_extensions =
    

    Последняя строка уменьшает безопасность, чтобы WordPress мог обрабатывать SEO URL, остальные — для повышения безопасности. Параметры pmдолжны быть настроены в соответствии с вашими потребностями.

  3. Включить модули Apache mpm_event, proxy& proxy_fcgi.

  4. Добавьте обработчик в <VirtualHost>блок Apache2 для сайта:

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost"
    </FilesMatch>
    <Proxy "fcgi://localhost/">
    </Proxy>
    
  5. Перезагрузите или перезапустите службы Apache2 и PHP-FPM.

Связанный контент