LAMP stack para Ubuntu Server 18.04

Este será un manual básico para una instalación correcta de nuestro servidor Apache, una base de datos MySQL, PHP y el gestor administrador phpMyAdmin dentro de nuestro servidor GNU/Linux.

Lo primero será actualizar los repositorios de paquetes e instalar el servidor apache2. Hemos de utilizar sudo para realizar estas operaciones ya que requiere de privilegios de superusuario.

$ sudo apt update
$ sudo apt install apache2

Una vez instalado apache, en un navegador ponemos la IP del servidor en un navegador. En caso de no saber la IP del servidor utilizaremos el siguiente comando para ver la IP privada (osea de la red local), para averiguearlo:

$ ip addr show enp0s3 | grep inet | awk ​ ‘{ print $2; }’​ | sed ‘s/\/.*$//’

(*NOTA: cambiaremos la parte de “enp0s3” por nuestra interfaz de red, que podemos conocerla a través del comando “ifconfig”).

Y si queremos saber nuestra IP pública, instalaremos la herramienta curl:

$ sudo apt install curl

Y hacemos un curl contra esta web en la terminal para determinar nuestra IP pública:

$ curl http://icanhazip.com

Y ahora para verificar que se instaló correctamente apache, en el navegador pondremos http://localhost/, http://127.0.0.1 o la IP privada, y nos devolvera la siguiente imagen.

localh.png
Configuración del cortafuegos

Si tenemos el cortafuegos UFW activado, debemos de establecer unas reglas para que el tráfico HTTP y HTTPS sea permitido en nuestro servidor. Para ello en la terminal escribimos lo siguiente para ver el perfil de aplocaciones de UFW.

$ sudo ufw app list

Nos devolverá algo similar a las siguientes líneas:

Aplicaciones disponibles:
    Apache
    Apache Full
    Apache Secure
    CUPS

Podemos ver más detalles si solicitamos el perfil de Apache Full y además como se encuentran los puertos para el servidor.

$ sudo ufw app info ​ “Apache Full”

Nos devolverá:

Perfil: Apache
Título: Web Server
Descripción: Apache v2 is the next generation of the omnipresent
Apache web
server.
Puerto:
80,443/tcp

Ahora permitiremos el tráfico de entrada en este perfil:

$ sudo ufw allow ​ in​ ​ “Apache Full”

 

Instalar MySQL

Una vez instalado nuestro servidor, procedemos con la instalación del sistema de administración de la base de datos MySQL que se encargará de almacenar la información de nuestra página web.

Para ello, en un terminal escribimos:

$ sudo apt install mysql-server

Cuando finalice la instalación de MySQL ejecutamos un script de seguridad ya preinstalado con la base de datos que nos permite mejorar los siguientes parámetros básicos:

  • Permitir que el usuario root no puede entrar remotamente.
  • Eliminar los accesos anónimos.
  • Establecer una contraseña para el usuario root.
  • Eliminar la base de datos test (de la cual tiene acceso todo el mundo, usuarios registrados y anónimos).
  • Eliminar cualquier privilegios a usuarios para acceso a base de datos que comiencen por “test_“.

Ejecutamos el script:

$ sudo mysql_secure_installation

Nos hará una serie de preguntas que iremos respondiendo acorde con lo que queramos:

Si queremos configurar la validación: “VALIDATE PASSWORD PLUGIN“, le decimos yes.

Selección_009.png

En la siguiente ventana nos pedirá el nivel de fortaleza de la contraseña. Para este caso elegimos “0 = LOW” ya que es para un uso de prueba y tendrá que ser igual o mayor a 8 caracteres, pero debemos de tener en cuenta que en un uso normal debemos utilizar un nivel superior. En caso de utilizar niveles superiores tienen que cumplir los requisitos que nos piden (usar números, mayúsculas, caracteres especiales, y además palabras que no se encuentren en diccionarios).
Pulsamos 0 y enter:

Selección_010.png

Y ahora ingresamos la contraseña que queramos:

Selección_011.png

Nos recomienda por defecto que la contraseña tenga una longitud de 25 caracteres. Si estamos conformes pulsamos “y” para continuar.

Eliminaremos también los usuarios anónimos.

Selección_012.png

Eliminamos el acceso remoto al usuario root.

Selección_013.png

También la base de datos “test“.

Selección_014.png

Y por último reiniciamos los privilegios para que los cambios sean efectivos.

Selección_015.png

 

Instalar PHP

Necesitaremos instalar PHP en el servidor para que las páginas web sean dinámicas, además para poder conectarla con la base de datos MySQL y poder procesar la información guardada en ella.
Instalamos los paquetes necesarios de PHP:

$ sudo apt install php libapache2-mod-php php-mysql

Por defecto apache buscará en su directorio un fichero llamado “index.html“, pero para probar que PHP está funcionando correctamente debemos darle prelación al servidor para que use el index con la extensión “.php“. Para ello editamos el siguiente fichero:

$ sudo vim /etc/apache2/mods-enabled/dir.conf

Este será el contenido del fichero:

Selección_016.png

Se debe mover “index.php” al principio de la línea, quedando de la siguiente manera:

Selección_017.png

Reiniciamos el servidor para que los cambios sean efectivos:

$ sudo systemctl restart apache2

También podemos ver el estado del servidor para ver que todo funciona correctamente. Para ello:

$ sudo systemctl status apache2

Si todo es correcto, el mensaje será similar al siguiente:

Selección_018.png

Se puede ampliar las funcionalidades de PHP instalando módulos adicionales. Si se quiere ver dichos módulos, se hace con el siguiente comando:

$ apt search php- | less

Selección_019.png

Se puede ir hacia arriba o abajo con las flechas para ver los diferentes módulos.

 

Probar PHP en el servidor web

Para evaluar si el servidor es capaz de ver los ficheros PHP y los procesa correctamente. Se crea un fichero llamado “info.php” dentro del “web root” que se encuentra localizado en /var/www/html.
Creamos el fichero:

$ sudo vim /var/www/html/info.php

Dentro del fichero en blanco escribimos la siguiente línea de PHP:

<?php
phpinfo();
?>

Guardamos el documento, vamos al navegador y entramos en nuestro servidor: http://tu_servidor/info.php y nos mostrara una ventana similar a la siguiente:

Selección_020.png

Esta ventana nos muestra la versión de PHP que estamos utilizando, los módulos instalados y activados y todas las demás especificaciones.

Debemos de borrar el fichero una vez comprado su funcionamiento, ya que este puede resultar una información valiosa para los posibles atacantes. Para ello en la terminal:

$ sudo rm /​ var​ /www/html/info.php

 

Instalación y configuración de phpMyAdmin

Si se quiere administrar e interactuar con la base de datos. se debe hacer a través de la terminal, pero a través de phpMyAdmin esta tarea se hace mucho más cómoda, ya que se podrá manejar a través de una interfaz gráfica por web. Para su instalación se hace de la siguiente manera:

$ sudo apt-get install phpmyadmin php-mbstring php-gettext

Una vez iniciada la instalación se debe de responder a las siguientes cuestiones.

Lo primero, seleccionar con la tecla espacio (tiene que tener el asterisco puesto, como se muestra en la siguiente imagen) el servidor apache2, y aceptamos.

Selección_021.png

Aceptamos la siguiente ventana cuando nos pregunte si queremos usar dbconfig-common para la configuración de la base de datos

Selección_022.png

Ponemos la contraseña y su confirmación para la administración de phpMyAdmin.

Selección_023.pngSelección_024.png

Una vez finalizada la instalación, se agregará un fichero de configuración phpMyAdmin al directorio /etc/apache2/conf-enabled/.
Reiniciamos el servidor:

$ sudo systemctl restart apache2

Una vez reiniciado podemos acceder al panel de administración de phpMyAdmin desde un navegador co la siguiente dirección http://tu_servidor/phpmyadmin y mostrara la siguiente ventana de login:

Selección_025.png

Nos logueamos con la contraseña que hemos utilizado en la instalación de MySQL.

Si por alguna razón no podemos loguearnos con el usuario root, crearemos una nueva cuenta de administración con el intérprete de MySQL de la siguiente manera: En una terminal escribir:

$ sudo mysql –user=root mysql

Y dentro del intérprete:

CREATE​ ​ USER​ ​ ‘admin’​ @ ​ ‘localhost’​ ​ IDENTIFIED​ ​ BY​ ​ ‘tu_contraseña’​ ;

Y luego:

GRANT​ ALL ​ PRIVILEGES​ ​ ON​ *.* ​ TO​ ​ ‘admin’​ @ ​ ‘localhost’​ ​ WITH​ ​ GRANT
OPTION​ ;

Y para finalizar:

FLUSH​ ​ PRIVILEGES​ ;

Y salimos del intérprete de MySQL pulsando la combinación de teclas “control + d” o escribiendo:

quit

Entramos de nuevo en el phpMyAdmin y nos logueamos con la cuenta. Una vez dentro nos mostrará la siguiente ventana:

Selección_001.png

 

Habilitar la sobreescriura de .htaccess

El fichero .htaccess nos permite añadir directivas de cada directorio para la seguridad de autenticación y autorización para phpMyAdmin ante posibles atacantes.
Editamos el fichero en:

$ sudo vim /etc/apache2/conf-available/phpmyadmin.conf

Y añadimos una nueva directiva AllowOverride All en el apartado “<Directory /usr/share/phpmyadmin>” dejándolo de la siguiente manera:

Selección_002.png

Para que los cambios sean efectivos, reiniciamos apache:

$ sudo systemctl restart apache2

Y escribimos lo siguiente y guardamos:

AuthType Basic
AuthName ​ “Zona restringida”
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

Las líneas anteriores vienen siendo:

  • AuthType Basic: Especifica el tipo de autenticación, para este caso, la autenticación utiliza un archivo de contraseña.
  • AuthName: Aquí establecemos el mensaje para el cuadro de diálogo de la autenticación.
  • AuthUserFile: Se define la ubicación del fichero de contraseñas.
  • Required valid-user: Especifica que solo los usuarios autenticados pueden tener acceso.

 

Creación del fichero .htpasswd

Anteriormente usamos la directiva AuthUserFile para establecer la ubicación del fichero, ahora crearemos dicho fichero que se encontraba en /etc/phpmyadmin/.htpasswd. Para ello necesitamos un paquete adicional de apache, que en caso de no tenerlo lo instalamos con:

$ sudo apt-get install apache2-utils

Creamos el fichero para un usuario de la siguiente manera:

$ sudo htpasswd -c /etc/phpmyadmin/.htpasswd usuario

Ahora cuando queramos ingresar en la página de phpMyAdmin tendremos la siguiente ventana:

Selección_004.png

Deberemos de ingresar esta autenticación y si esta es correcta, entraríamos en el login de phpMyAdmin.

 

Permisos del directorio web

Para que nuestro directorio web (donde estarán todos los ficheros de nuestra página web) debemos de darle unos permisos especiales, donde no solo el suario root tenga permisos, si no que el grupo de usuarios www-data también los tenga.

Le damos un nuevo propietario al directorio con chown y con el atributo -R para que sea recursivo, y chgrp para cambiar el grupo propietario:

$ sudo chown -R www-data /var/www/
$ sudo chgrp www-data /var/www/

Asignamos los permisos adecuados de lectura, escritura y ejecución para este usuario y grupo, y solo lectura y ejecución para el resto:

$ sudo chmod ug+w /var/www/

Asignamos el sticky bit para el grupo, y que los nuevos archivos y directorios que se creen, arrastren las propiedades de www-data:

$ sudo chmod g+s /var/www/

Ponemos los permisos por defecto para que los nuevos directorios tengan los mismos permisos:

$ sudo setfacl -d -m g::rwx /var/www/

Podemos ver como ha quedado los permisos del árbol de directorios de la web con:

$ getfacl /var/www/

Y nos devolverá:

getfacl: Eliminando «/» inicial en nombres de ruta absolutos
# file: var/www/
# owner: www-data
# group: www-data
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x

O también con:

$ ls -ld /var/www/

Y su resultado:

drwxrwsr-x+ 3 www-data www-data 4096 nov 25 16:14 /var/www/

Y añadimos nuestro usuario a este grupo con el siguiente comando:

$ sudo usermod -a -G www-data usuario

 

Apache hardering

Una vez instalado todo, debemos de implementar unos criterios básicos de seguridad para nuestro servidor apache. Para ello seguiremos estos 3 principios básicos:

  • Mínimo punto de exposición: Han de ejecutarse solo los procesos necesarios para el cumplimiento de sus roles. E.g: Si no usamos un servidor FTP, dejar deshabilitado los servicios para ello.
  • Mínimo privilegio posible: Solo ejecutaremos los procesos con los privilegios necesarios para cada usuario o grupo.
  • Defensa de profundidad: Dicho principio supone que las anteriores medidas son susceptibles de fallar.
    Por lo que esta política implica que si algo falla existen otras medidas de seguridad para comprobar la veracidad y autentificación de usuarios y datos sin comprometer el rendimiento del sistema.

 

Deshabilitar las cabeceras HTTP

Las cabeceras HTTP proporcionan información que puede ser valiosa para un atacante, como el software que ejecuta el servidor, versión de apache, etc.
Para ello editamos el fichero:

$ sudo nano /etc/apache2/apache2.conf

Y añadimos al final del fichero estas dos líneas y guardamos:

ServerSignature Off
ServerTokens Prod

Podemos ver la diferencia entre las cabeceras antes y después de quitarlas:

Selección_026.png


Deshabilitar módulos innecesarios

Quitar o deshabilitar módulos que no usaremos nos dará dos ventajas. Primero, que habrá menos vectores de ataque, y segundo, tendremos un menor consumo de recursos de nuestro servidor.
Alguno de los módulos que vienen activado por defecto y necesitamos son: mod_imap, mod_include, mod_info, mod_userdir, mod_status o mod_autoindex.

Para poder ver que módulos tenemos activados e instalados, se hace con el siguiente comando:

$ apache2ctl -M

Si queremos deshabilitar el módulo:

$ a2dismod nombre_módulo

Y para habilitarlo:

$ a2enmod nombre_módulo

 

Permisos de logs y configuraciones

Tras instalar apache, por defecto otros usuarios tienen permisos de lectura de los logs y de varias configuraciones, por lo que debemos de eliminar estos privilegios de la siguiente manera. Para los logs:

$ sudo chmod -R go-r /var/​ log​ /apache2

Y para configuraciones:

$ sudo chmod -R go-r /etc/apache2

 

Deshabilitar el listado de direcciones

Desde el navegador se puede solicitar al servidor que muestre un listado de directorios y ficheros al público que el administrador no desee que se publiquen. Esto se puede deshabilitar en el fichero virtual host que se encuentra en /etc/apache2/sites-enabled.
Si entramos en nuestro localhost podemos ver el listado de los directorios:

Selección_007.png

Lo primero es hacer una copia de seguridad del fichero y trabajar sobre este:

$ sudo cp /etc/apache2/sites-enabled/000-default.conf
/etc/apache2/sites-enabled/000-default.conf.BACKUP

Editamos el fichero 000-default.conf y añadimos las siguientes líneas:

<Directory /var/www/html>
    Options -Indexes
</Directory>

Si volvemos acceder, comprobamos que no podemos acceder:

Selección_008.png
Deshabilitar los includes, CGI y FollowSymLinks

Debemos de deshabilitar los includes, son scripts que permiten a la página web añadir contenido dinámico sin tener que servir a una página entera a través del CGI (Common Gatewaty Interface) u otra tecnología que genere contenido dinámico, además de no permitir el uso de enlaces simbólicos.

Para ello, al igual que en el caso anterior, editamos el fichero de virtual host y añadimos la siguiente línea Options -Includes -ExecCGI -FollowSymLinks quedando de resultado:

<Directory /var/www/html>
    Options -Indexes -Includes -ExecCGI -FollowSymLinks
</Directory>

Guardamos y reiniciamos el servidor apache:

$ sudo service apache2 restart

Prevención de ataque SYN flood

Podemos hacer frente a ataques de inundación, en concreto los que intenta colapsar el servidor a nivel TCP/IP. Este tipo de ataques se consiguen derrumbando la estructura de datos TCB (Transmission Control Block) dentro de TCP que se dedica a guardar los datos de cada conexión. Este ataque se logra cuando el atacante envía paquetes con flags SYN al servidor, este contesta con SYN-ACK pero el atacante no envía el ACK final, por lo que quedan muchas conexiones abiertas pero estas nunca se cierran.
Para poder mitigar este tipo de ataques basta con poner en la terminal:

$ sudo sysctl net.ipv4.tcp_syncookies=1

Estas son algunas de las configuraciones que tendremos. Aunque existen otras a mayores como la protección X-XSS, deshabilitar los métodos PUT, DELETE, OPTIONS, TRACE o PROPFIND, limitar las concurrencias de conexiones, restringir IPs, tamaño de peticiones XML, tamaño de peticiones, valores máximos de espera o incluso restringir tipos o extensiones de ficheros.

 

Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s