Forma segura para que el servidor web escriba archivos

2

He creado un webhook en github que llama a mi servidor web para actualizar archivos en la raíz web. He asegurado la parte de envío usando un token en github para que solo las solicitudes de github puedan ejecutar el script. Mi pregunta es, ya que el script se ejecutará como servidor web (www-data), ¿cuál es la mejor manera de otorgarle permisos de escritura al webroot? ¿Es una buena idea dar al usuario del servidor web permisos de escritura en el webroot? Cuales son las alternativas?

Ravi
fuente
Como puede leer en varias fuentes, GIT no es la mejor herramienta para la implementación real. En cuanto a cómo desea que funcione su implementación, depende de usted. Puede otorgarle al usuario permisos permanentes o temporales. Es posible que tenga un script con un conjunto de s bits que realmente se llama o una serie de otras configuraciones. ¿Qué hace realmente su aplicación web? ¿Acepta la entrada del usuario? Cuántas personas lo usan, etc., que podrían ser relevantes y también el tipo de seguridad que desea.
Seth

Respuestas:

1

Primero escriba un script que realice los pasos exactos de implementación necesarios. Luego otorgue www-datalos derechos para ejecutar ese script específico a través de sudo. Por ejemplo, usando la siguiente regla de sudoers:

www-data ALL=(someuser) /path/to/deploy.sh

(Reemplace "alguien" con la cuenta que realmente posee los archivos de la aplicación web).

El manejador de webhook entonces ejecutaría:

sudo -u someuser /path/to/deploy.sh

De esta manera, su servidor web puede realizar actualizaciones exactamente como está programado pero aún no tiene acceso innecesario para eliminar archivos o instalar malware en el sitio.

Gravedad
fuente
He deshabilitado todas las funciones de ejecución de shell para PHP (mi script webhook), por lo que necesitaría cambiar eso, además creo que en lugar de hacer cambios en el archivo sudoers puedo crear el ejecutable con SUID.
Ravi
Los scripts de Shell no pueden ser SUID, por lo que tendría que ser un programa compilado, y hay muchas más posibilidades de cometer errores allí. Además, si ha deshabilitado todas las funciones de ejecución de shell, ¿cómo realizará la implementación de todos modos?
Grawity
No estoy seguro de si estoy haciendo esto demasiado complejo, pero el script de implementación puede escuchar en un socket al que el webhook pasa los datos. Esto evita suid y ejecución de parte de PHP.
Ravi
¡Entonces todo el hilo se vuelve irrelevante, porque su webhook no escribe ningún archivo en primer lugar!
Grawity