Securizando PHP a nivel servidor

Introducción

Hoy en día los administradores de sistemas nos solemos centrar mucho en el tema de seguridad. Como es evidente tratamos de cerrar los posibles caminos que puedan venir los ataques para curarnos ante el cliente. Como muchas veces no podemos controlar los scripts/programaciones de cada cliente tenemos que buscar ciertas formas que nos ayuden.

Recordamos que la mayor parte de las intrusiones o defacement en las webs suelen venir por CMS desactualizados. Así que siempre recomendamos que se actualice siempre que se pueda porque suelen tener correcciones de seguridad.

En nuestro caso vamos a trabajar con un poco de seguridad sobre nuestro php a nivel de servidor.

Las normas que vamos a seguir son:

1) Otorgar la menor información posible al atacante.

2) Deshabilitar funciones en PHP que permitan la ejecución de comandos o procesos en el servidor.

Actualizaciones:

27/04/2017: Añadido open_basedir, Securizar Sesiones, Nuevas funciones a deshabilitar.

Securizando PHP configuración del servidor

Dependiendo del tipo de configuración que tengamos para ejecutar php las cosas pueden cambiar, pero lo que vamos a modificar siempre será el fichero php.ini. Dicho fichero por defecto se encuentra:

“/etc/php5/apache2/php.ini”

Los parámetros que vamos a cambiar son los siguientes:

display_errors = Off

Este parámetro muestra los errores por pantalla en el caso de que haya un problema con un script en PHP. Por lo tanto es recomendable que no se muestre a través del navegador.

log_errors = On

Este parámetro nos permite guardar los logs en el fichero que hayamos definido en la configuración. Es decir que seguiremos registrando los errores pero a nivel interno en el servidor.

allow_url_fopen = Off

Permite poder hacer require, include y file_get_contents de scripts a través de FTP y HTTP. Lo que quiere decir que si por ejemplo pueden escribir en nuestro dominio puede agregar scripts remotos maliciosos en nuestro alojamiento, pudiendo afectar a otros dominios o servidor.

Esto tiene que ir acompañado con la directiva “allow_url_include” para poder realizar algún mal en el servidor.

allow_url_include = Off

Esto por defecto está desactivado, pero permite hacer include o require de archivos remotos por FTP o HTTP.

safe_mode = On

NOTA: Este parámetro solo se debe aplicar si se dispone de una versión PHP 5.3.x o inferior ya que en versiones de PHP 5.4.x este parámetro ha desaparecido.

Permitía controlar las ejecuciones de los ficheros como lo hace el php a través de CGI. Como hoy en día se usa a nivel de sistemas este parámetro termino por desaparecer.

magic_quotes_gpc = Off

NOTA: Este parámetro solo se debe aplicar si se dispone de una versión PHP 5.3.x o inferior ya que en versiones de PHP 5.4.x este parámetro ha desaparecido.

Evita ciertos tipos de ataque de “Inyección SQL” ya que permitía el escape de ciertos caracteres especiales. Para versiones inferiores, si no tenemos la posibilidad de actualizar, sería recomendable deshabilitarlo.

register_globals = Off

NOTA: Este parámetro solo se debe aplicar si se dispone de una versión PHP 5.3.x o inferior ya que en versiones de PHP 5.4.x este parámetro ha desaparecido.

Permitía que algunos formularios se generara los nombres de las variables con los campos que se pasaban. Esto es recomendable que se controle a nivel programación.

expose_php = Off

Cuando el servidor no está ejecutando los archivos php correctamente nos muestra el código como aparece en el archivo. Por lo tanto pueden ver como hemos programado nuestros scripts y explotar algún fallo que se pueda ver.

# Usando open_basedir en PHP

Esta función nos permite acotar el ámbito de ejecución de nuestros scripts en PHP. Es decir que no pueda ejecutar algo que esté fuera de su virtualhost o que interfiera con otros usuarios.

Restringir el acceso de ficheros

open_basedir = "/home/johndoe/"

Si queremos agregar varias rutas, lo podemos hacer en la misma línea:

open_basedir = "/home/johndoe:/var/lib/php/tmp_upload:/var/lib/php/session"

# Securizar sesiones en PHP

Con esto tendremos un identificador único para nuestras sesiones y aparte de ello una seguridad extra añadida. Hay que tener en cuenta la variable “session.referer_check” ya que debemos de poner el dominio que estamos protegiendo. Recordamos que esto siempre y cuando tenga su propio php.ini.

session.use_strict_mode = 1
session.cookie_httponly = 1
session.use_cookies = 1
session.use_only_cookies = 1
session.use_trans_sid = 0
session.name = custom_session_id
session.cookie_secure = 1
session.referer_check = dominio.tld

# Deshabilitando funciones en PHP

Cuando administramos un servidor tenemos la capacidad de otorgar a los usuarios su propio php.ini. Pues bien en este punto es donde podemos hacernos fuertes para que todas las nuevas webs puedan estar protegidas. Hay que tener en cuenta que estas funciones pueden hacer que webs funcionaran antes dejen de funcionar así que hay que hacer estos cambios con cuidado.

Si queremos ver si una web no funciona generalmente estos errores aparece en los logs como si estuviera deshabilitada la función por configuración.

disable_functions = ini_set,php_uname,getmyuid,getmypid,passthru,leak,listen,diskfreespace,tmpfile,link,ignore_user_abord,shell_exec,dl,set_time_limit,exec,system,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,phpinfo,popen,curl_exec,curl_multi_exec,parse_ini_file,allow_url_fopen,allow_url_include,pcntl_exec,chgrp,chmod,chown,lchgrp,lchown,putenv

Para finalizar y no por ello menos importante tenemos que deshabilitar aquellas funciones que pueden perjudicar al sistema. Esto es debido a que permiten ejecutar comandos importantes o en el caso de phpinfo obtener información sobre php y sus módulos.

Existen otras funciones que ya viene instalados en Ubuntu 16.04 que hemos considerado meter también:

disable_funcions = pcntl_alarm,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,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

Por lo tanto lo ideal sería usar las dos líneas que os hemos dado en este apartado.

Lo recomendable sería dejarlas deshabilitadas salvo que por casos especiales algunas de estas funciones se tengan que usar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *