En el post de hoy les hablaremos de como podemos tener un entorno LAMP lo más seguro posible. En los próximos días, publicaré también varios post explicando como poder instalar este entorno en las diferentes distribuciones de Linux.
Para su instalación en Debian, Ubuntu o Linux Mint pinchar en este enlace
Hablando de la seguridad, vamos a tratar con varios consejos, como proteger nuestro sistema ante un posible ataque o al menos, intentar ponérselo más complicado a aquel que venga con malas intenciones.
Antes de nada vamos a especificar en que ruta se guardarán los ficheros de configuración que modifiquemos. Lo haremos sobre un entorno Ubuntu 14.04 con Apache 2.4, PHP 5.6 y MySQL 5.7. Dicho esto, las rutas por defecto serían:
Para Debian, Ubuntu y Linux Mint
- Apache -> /etc/apache2/apache2.conf
- PHP -> /etc/php5/apache2/php.ini
- MySQL -> /etc/mysql/my.cnf
Para CentOS, Red Hat y Fedora
- Apache -> /etc/httpd/conf/httpd.conf
- PHP -> /etc/php.ini
- MySQL -> /etc/my.cnf
Ahora pasamos a ver los diferentes consejos
Índice
Ocultar la versión y el Sistema Operativo (Apache)
La directiva ServerTokens controla si el campo del encabezado de respuesta del servidor es enviado de vuelta a los clientes. Por otro lado la directiva ServerSignature configura el pie de página en los documentos generados por el servidor.
Dicho esto, añadiríamos las siguientes directivas a nuestro fichero de configuración:
1 2 3 4 |
# Hide version and OS identity ServerTokens Full ServerSignature Off SecServerSignature XXXX |
Con SecServerSignature especificamos el texto que queremos mostrar en lugar de nuestro aplicativo.
Deshabilitar el listado de directorios y enlaces simbólicos (Apache)
Por defecto, apache permite ver el listado de directorios y ficheros accediendo a la url o ip del sitio, para evitar esto utilizamos la directiva Options en el fichero conf de nuestro site.
1 2 3 4 5 6 7 8 |
<Directory /> # Deshabilitar listado de directorios Options -Indexes # Deshabilitar enlaces simbólicos Options -FollowSymLinks # podemos juntar ambas opciones de la siguiente manera Options -Indexes -FollowSymLinks </Directory> |
Restringir el acceso a ficheros y directorios (Apache)
Otra medida de seguridad, es evitar que cualquiera pueda acceder a una carpeta, fichero o ruta en nuestro servidor. Para ello utilizaremos las siguientes directivas.
Para restringir directorios, podemos hacerlo a todo el mundo, excepto a quienes nosotros decidamos
1 2 3 4 5 6 7 8 |
<Directory /> # Deniega toda peticion Require all denied # Permite un host Require host example.org # O una ip Require ip 127.0.0.1 </Directory> |
Para el caso de un fichero, sería lo mismo, a excepción de que la directiva sería FIle
1 2 3 4 5 6 7 8 |
<File hola.txt> # Deniega toda peticion Require all denied # Permite un host Require host example.org # O una ip Require ip 127.0.0.1 </File> |
Y para el caso de una localización
1 2 3 4 5 6 7 8 |
<Location /admin> # Deniega toda peticion Require all denied # Permite un host Require host example.org # O una ip Require ip 127.0.0.1 </Location> |
Limitar el tamaño de las peticiones (Apache)
Apache por defecto, no establece ningún límite para las peticiones realizadas. Esto podría llevar a un ataque DDos (Denegación de servicio).
Para solucionarlo, podemos aplicar un límite a las peticiones en el fichero de configuración de nuestro apache con la directiva LimitRequestBody en la etiqueta Directory. Podemos establecer un límite entre 0 (sin límite) y 2147483647 (2GB) que deberíamos expresar en bytes.
Por ejemplo, vamos a establecer nuestra directiva, con un valor máximo de petición de 500 Kb, para ello incluiríamos la siguiente configuración
1 2 3 |
<Directory /> LimitRequestBody 512000 </Directory> |
Deshabilitar la ejecución de CGI (Apache)
CGI (Common Gateway Interface), es un método por el cual un servidor web puede interactuar con programas externos, de tal forma que sería el método más sencillo de poder mostrar contenido dinámico en un sitio web. Si tenemos algún directorio donde no queramos permitir esta ejecución, podemos deshabilitarlo con la siguiente directiva
1 2 3 4 |
<Directory /public_html/cgi-bin> Options ExecCGI SetHandler cgi-script </Directory> |
Uso de mod_security y mod_evasive (Apache)
Mod_Security hace de firewall para nuestras aplicaciones web, además de monitorizar el tráfico en tiempo real, ayudándonos a defendernos de ataques, puede ayudarnos a prevenir varios de ellos.
Para instalarlo, lanzaremos los siguientes comandos
En el caso de Debian, Ubuntu o Linux Mint
1 2 3 |
sudo apt-get install libapache2-modsecurity sudo a2enmod mod-security sudo /etc/init.d/apache2 restart |
En el caso de CentOS, Red Hat o Fedora
1 2 |
sudo yum -y install mod_security # apache 2.2 y mod24_security para apache 2.4 sudo /etc/init.d/httpd restart |
Mod_evasive previene ataques DDos y ataque por fuerza bruta. Para su detección utiliza tres métodos:
- Controla el número de peticiones realizadas a una misma página en un rango corto de tiempo
- Comprueba si cualquier proceso trata de realizar más de 50 peticiones concurrentes
- Comprueba si una ip que se encuentra en la lista negra, está realizando peticiones
Para instalarlo, lanzaremos los siguientes comandos
En el caso de Debian, Ubuntu o Linux Mint
1 2 3 |
sudo apt-get install libapache2-mod-evasive sudo a2enmod mod-evasive sudo /etc/init.d/apache2 restart |
En el caso de CentOS, Red Hat o Fedora
1 2 |
sudo yum -y install mod_evasive sudo /etc/init.d/httpd restart |
Instalando un certificado SSL (Apache)
La instalación de un protocolo seguro, indica que nuestros datos navegan por la red encriptados, evitando así la mirada de ojos inquietos. Debido a su extensa explicación y por no hacer muy largo este post, lo haremos en un próximo post, el cual incluiré un enlace desde aquí al mismo una vez esté publicado.
Restringir la información mostrada en PHP (PHP)
Por defecto, la instalación de PHP muestra la versión instalada a todo aquel que quiera verla, esto incluiría la versión de PHP en una cabecera de la siguiente forma:
1 |
X-Powered-By: PHP/5.6.30 |
Para evitar esto, podemos modificar la directiva expose_php de la siguiente forma
1 |
expose_php = Off |
Deshabilitar ejecución de código remota (PHP)
Por defecto, php permite la ejecución de código en el servidor a través de web o de una conexión ftp. Para evitar esto, podemos añadir las siguientes directivas
1 2 |
allow_url_fopen=Off allow_url_include=Off |
Deshabilitar funciones peligrosas de PHP (PHP)
Podemos deshabilitar algunas directivas que consideremos peligrosas para nuestro sistema, por poder ejecutar código en nuestro servidor o por poder ver cierta información sensible, estos comandos los añadiríamos en la directiva disable_functions de la siguiente forma
1 |
disable_functions =exec,shell_exec,passthru,system,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,proc_open,pcntl_exec |
Limitar el acceso de PHP al sistema (PHP)
Podemos utilizar la directiva open_basedir, para especificar una ruta en la que permitamos a php poder ejecutarse
1 |
open_basedir="/var/www/html" |
Habilitar límites en PHP (PHP)
Podemos permitir un tamaño o tiempo máximo que podrá tener una determinada acción, por ejemplo, las siguientes directivas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# establecemos un tiempo máximo de ejecución en segundos max_execution_time = 30 # Tiempo máximo que puede durar una petición (en segundos) max_input_time = 60 # Tamaño máximo de subida de fichero upload_max_filesize = 2M # Máximo de ficheros a subir a la vez max_file_uploads = 1 # permitir un máximo de datos de POST permitidos, # debe ser mayor que upload_max_filesize post_max_size = 4M # Restringir el número de variables permitidas max_input_vars=1000 |
Restringir el acceso remoto a MySQL (MySQL)
Podemos restringir el acceso a nuestro MySQL a una ip en concreto, evitando posibles accesos indeseados por parte de terceros, para ello utilizamos la siguiente directiva
1 |
bind-address=127.0.0.1 |
Deshabilitar el uso de Ficheros locales (MySQL)
A través de MySQL, podemos ver ficheros existentes en el servidor, por ejemplo podríamos ver el contenido de los ficheros /etc/passwd o /etc/shadow y, esto es un terrible fallo de seguridad. Para solucionarlo utilizaríamos la siguiente directiva en nuestro fichero de configuración
1 2 |
[mysqld] local-infile=0 |
Asegurar nuestra instalación de DDBB (MySQL)
Podemos instalar la instalación segura de MySQL lanzando el siguiente comando una vez instalado MySQL
1 |
mysql_secure_installation |
Esto nos configurará mysql de una forma segura, tal y como nosotros le especifiquemos
Aplicar el bit de inmutabilidad a los ficheros de configuración
Aplicando el bit de inmutabilidad, evitamos que dichos ficheros puedan ser editados, esto nos prevendrá ante un posible atacante o ante alguien que intente modificar dichos ficheros
Para aplicarlo lanzaríamos el siguiente comando
1 |
chattr +i filepath |
En caso de que quisiéramos quitarlo, lo haríamos colocando un – en lugar de un + delante de la i
1 |
chattr -i filepath |
Esto es todo por ahora, como ven estos sólo son algunos consejos con los que poder hacer un poco más seguro su sistema. Como siempre, gracias por leernos y si tienen dudas, quieren expresar su opinión o necesitan ayuda con algo comenten.