¿Cómo debo modificar los permisos de los archivos para adaptarlos a Wordpress?

¿Cómo debo modificar los permisos de los archivos para adaptarlos a Wordpress?

He estado utilizando con éxito el método descrito aquí:Mantenido por un solo usuarioy me ha funcionado bien. Este es mi script para todos mis sitios web:

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/

Mantengo todos los sitios en ese servidor y WebAdmin es el usuario general que uso para FTP y también SSH.

Sin embargo, recientemente moví algunos sitios de Wordpress de una empresa de alojamiento a mi servidor y lo anterior no funciona. Al actualizar Wordpress o sus temas/complementos me dio el error:

Para realizar la acción solicitada, WordPress necesita acceder a su servidor web. Ingrese sus credenciales FTP para continuar. Si no recuerda sus credenciales, debe comunicarse con su proveedor de alojamiento web.

Hay varias "soluciones" comoÉsteque son más bien soluciones alternativas y probablemente sean inseguras. Así que utilicé el método más seguro (AFAIK) e hice que www-data fuera el propietario de los sitios de WordPress, manteniendo los sitios que no eran de WordPress como antes. En otras palabras, simplemente corrí

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

en los sitios de WordPress. Por supuesto, esto funcionó, pero se vuelve complicado en lo que respecta al mantenimiento manual del sitio web, porque tengo que iniciar sesión como root para hacerlo. Tampoco podría asignar los sitios web a otra persona para que los mantenga en el futuro. Tenga en cuenta que algunos de mis sitios son híbridos (en parte WordPress y en parte páginas personalizadas).

Así que me pregunto si existe una solución mejor que sea más elegante y más general, es decir, que funcione tanto para sitios de WordPress como para sitios que no son de WordPress.

Una posibilidad es que agregue el usuario WebAdmin al grupo www-data. ¿O quizás www-data para el grupo de usuarios WebAdmin? ¿Cuál tiene más sentido y cuál es más seguro?

Respuesta1

Si tanto el usuario WebAdmindirectamente como el usuario www-dataa través del grupo www-datanecesitan escribir en estos directorios, 750no es suficiente. Lo que soluciona su diseño actual sería:

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

Consideraciones de Seguridad

Sin embargo, en general, esto significa que cada sitio PHP se ejecuta en el mismo usuario y después de esta modificación, cada sitio puede leer y escribir los archivos de cualquier otro sitio. Esto significa que un compromiso en cualquiera de los sitios los compromete a todos.

El uso de un usuario separado y un grupo PHP-FPM para cada sitio dividiría los sitios en compartimentos aislados, mitigando este riesgo. Podrías administrar el sitio con el mismo usuario que lo ejecuta:

/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

Si es absolutamente necesario que el usuario WebAdminlos administre todos, agregaría el usuario al grupo www-datay le otorgaría permisos de escritura al grupo, pero no lo recomendaría.

/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

Grupos PHP-FPM

Como mencioné los grupos PHP FPM, aquí hay un breve ejemplo de configuración. Hay varios tutoriales que explican estos pasos en detalle.

  1. Instale 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 =
    

    La última línea está disminuyendo la seguridad para permitir que WordPress maneje las URL de SEO, las otras son para aumentar la seguridad. Los pmparámetros deben ajustarse a sus necesidades.

  3. Habilite los módulos de Apache mpm_event, proxy& proxy_fcgi.

  4. Agregue el controlador al <VirtualHost>bloque Apache2 del sitio:

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost"
    </FilesMatch>
    <Proxy "fcgi://localhost/">
    </Proxy>
    
  5. Vuelva a cargar o reiniciar los servicios Apache2 y PHP-FPM.

información relacionada