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 WebAdmin
directamente como el usuario www-data
a través del grupo www-data
necesitan escribir en estos directorios, 750
no 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 WebAdmin
los administre todos, agregaría el usuario al grupo www-data
y 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.
Instale PHP-FPM.
/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
pm
parámetros deben ajustarse a sus necesidades.Habilite los módulos de Apache
mpm_event
,proxy
&proxy_fcgi
.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>
Vuelva a cargar o reiniciar los servicios Apache2 y PHP-FPM.