PHP seguridad web, securizar aplicación

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:

ataque 405 email sender ataque islamic ghosts team Ataque merdeka

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:

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:

Source   
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:
Source   
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
  • CentOS/RedHat: /etc/httpd/conf/httpd.conf. Directamente modificamos
  • Source   
    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.

    Source   
    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:

    Source   
    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:

    Source   
    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:

    Source   
    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:

    Source   
    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:

    Source   
    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):

    Source   
    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…

    Deja un comentario