Algunas veces debemos administrar aplicaciones PHP que para nuestra sorpresa han sido hackeadas, han sustituido la página de inicio, añadido código en la cabecera de la página, insertado código malicioso entre los ficheros de la aplicación (por ejemplo para enviar email spam), etc…
Dejo algunas imágenes:
Este tipo de ataques es más probable sufrirlos si nuestra aplicación es algo relativamente popular, WordPress, Joomla, Drupal, etc…
El plan de mejora de seguridad incluye los procesos:
- Modificar la configuración de Apache, la idea es reducir al máximo la información publicada.
- Modificar la configuración de PHP, veremos algunos parámetros muy interesantes.
- Modificación de la propiedad de los ficheros de DocumentRoot que componen la aplicación
- Denegar la ejecución de ciertos programas desde el usuario que ejecuta Apache.
Vamos por partes:
Modificar la configuración de Apache
La idea es ofrecer la información mínima a un posible atacante, vamos a modificar algo de configuración:
ServerTokens
Esta directiva configura que información será devuleta en la cabecera por el servidor Apache. Los valores puedes ser: Full | OS | Minimal | Minor | Major | Prod.
El valor por defecto es full que indica la versión de Apache, sobre que sistema operativo está corriendo, módulos, versiones… una maravilla para cualquier atacante vamos.
El valor recomendado es Prod, que solo indica que el servidor Web es Apache, por tanto debemos fijar:
ServerTokens Prod
Dependiendo del Sistema Operativo, esta directiva se debe incluir en un fichero u otro:
- Ubuntu: /etc/apache2/conf.d/security
- CentOS/RedHat: /etc/httpd/conf/httpd.conf
Más información en:
http://httpd.apache.org/docs/2.2/mod/core.html#servertokens
User, Group
Estas directivas permiten modificar el usuario y grupo con el que Apache será ejecutado. Hay que tener en cuenta que cualquier cambio en estas directivas implica un cambio de propiedad o al menos modificación de permisos en los ficheros incluidos en el directorio documentRoot.
Dependiendo del Sistema Operativo, estas modificaciones se realizan en lugares diferentes:
- Ubuntu: /etc/apache2/envvars. Es necesario modificar las entradas:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
User apache
Group apache
Más información en:
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#user
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#group
Modificar la configuracion de PHP
La configuración de PHP se encuentra en el fichero php.ini, que dependiendo del Sistema Operativo puede encontrase en:
- Ubuntu: /etc/php5/apache2/php.ini
- CentOS/RedHat: /etc/php.ini
La directivas que nos interesan son:
expose_php
Esta directiva expone la versión de PHP instalado, por defecto en on, debemos ponerla a off.
expose_php = Off
Más informacion en:
http://php.net/manual/es/ini.core.php#ini.expose-php
allow_url_fopen
Básicamente evita abrir un fichero del SO pasándolo como parte de la URL. Esta directiva hay que tratarla con cuidado porque podría afectar al funcionamiento de la aplicación.
Lo ideal sería desactivarla:
allow_url_fopen = Off
Más información en:
http://php.net/manual/es/filesystem.configuration.php#ini.allow-url-fopen
open_basedir
Esta directiva define que directorios o ficheros serán accesibles para PHP, es muy potente. La idea es mantener una lista de directorios/ficheros a los que PHP puede acceder, separados por «:».
Definir algo como:
open_basedir = /tmp:/var/www/html/
Cualquier otro acceso a un directorio no definido generará un error.
Más información en:
http://php.net/manual/es/ini.core.php#ini.open-basedir
disable_functions
Mediante esta directiva podemos deshabilitar el uso de funciones peligrosas. Debemos tratarla con cuidado porque la aplicación podría dejar de funcionar.
Un valor aceptable que mejora la seguridad puede ser:
disable_functions = disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,system,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,pcntl_exec
Más información en:
http://php.net/manual/es/ini.core.php#ini.disable-functions
Modificación de la propiedad de los ficheros de DocumentRoot
Si todo lo anterior falla, todavía pueden inyectar código malicioso. La mejor forma de evitar esto es no permitir la escritura en el DocumentRoot por Apache, para esto debemos conocer con que usuario se está ejecutando y actuar en consecuencia.
Si por ejemplo está ejecutándose con el usuario www-data y el DocumentRoot es /var/www/html, ejecutamos:
chmod ug-w /var/www/html -R
Hay que ir con cuidado con este tipo de acciones, es posible que PHP necesite escribir en el DocumentRoot, por ejemplo si tenemos instalado algún plugin de cache en WordPress.
Si queremos permitir de nuevo la escritura de Apache en DocumentRoot debemos deshacer el cambio:
chmod ug+w /var/www/html -R
Denegar la ejecución de ciertos programas desde el usuario que ejecuta Apache
De forma adicional es posible denegar la ejecución de ciertos programas desde el usuario Apache. Para esto podemos utilizar la funcionalidad ACL de LInux que permite añadir/denegar permisos de forma precisa.
Por ejemplo para denegar el acceso a bash y sh para el usuario www-data (el que se utiliza para ejecutar Apache):
setfacl -m u:www-data:--- /bin/sh
setfacl -m u:www-data:--- /bin/bash
Para más información sobre ACL mira esta entrada Trabajo con Access Control List (ACL) en Linux
Mucha suerte…