Configura e instala “Apache”

Después del hablar de  AlpineLinux era este sistema operativo (GNU/Linux) de tamaño reducido, me puse a generar mi laboratorio Virtual.

Empezamos con la configuración de un servidor web (Apache) que se conectara a los servidores de BBDD (MariaDB/MySQL y PostgreSQL). Nos basaremos para todo esto en una configuración de red similar a la siguiente.

Esquema de red
Red laboratorio de Pentesting/Desarrollo

Servidor WEB (Apache + PHP)

Apache es un servidor WEB realizado con un diseño modular que nos permite añadir funcionalidades como el interprete PHP.  Instalaremos el servidor  Apache junto a los módulos necesarios para poder usar PHP.

Así tendremos nuestro servidor WEB para poder probar los desarrollos de nuestras páginas, instalar páginas para pruebas de pentesting, incluso poner este servidor en producción. Y esto solo en 1 GB de disco.

Tenemos otros servidores WEB como IIS (lo descartamos al ser windows y no libre),  nginx, lighttpd. El uso servidor Apache ha crecido desde su creación con un pequeño bajos en los años 2.007-2.008 a favor de IIS que ha vuelto a revertirse. 

Instalando Apache

Hemos creado una maquina virtual, en nuestro VirtualBox,  con AlpineLinux con tres tarjetas de red:

  1. Adaptador anfitrión para llegar con el navegador de nuestro Host, que configuraremos con una IP fija.
  2. Red interna, que se conectara a los servidores de Bases de Datos que explicaremos en otro POST, se configurara tambien con una IP fija de nuestra red interna.
  3. NAT para conectar a internet y descargarnos los paquetes, luego la desconectaremos para estar aislados de internet salvo que deseemos publicar nuestro servidor.

Procedemos a instalar el servidor apache y el modulo de PHP que en nuestro caso sera la versión 7.

apk add apache2 apache2-utils php7-apache2

Una vez que tenemos instalado nuestro apache, podemos proceder a arrancar el servidor.

rc-service apache2 start  // Inicia el servicio
           O             
/etc/init.d/apache2 start // Igual, es el script de apache

rc-update add apache2  // Se pone en los servicios a arrancar<

Y con esto ya tenemos instalado nuestro servidor WEB, si no realizamos ningún cambio en la configuración, pondremos nuestra pagina en el directorio “/var/www/localhost/htdocs“.

Ahora solo tendremos que ir con nuestro navegador y solicitar la página a la IP fija definida en el adaptador 1 “http://<nuestra IP>” y veremos que tenemos levantado el servidor. ParP escribiremos un fichero “prueba.php

<?php
phpinfo();
?>

y solicitaremos la página “http:<nuestraIP>/prueba.php

Configurando Apache

Y ha llegado el momento de explicar algunas configuraciones que nos pueden interesar:

  1. Host Virtuales
  2. Ficheros .htaccess
  3. Consejos de seguridad

El fichero de configuración los encontraremos en “/etc/apache2/httpd.conf” en otras distribuciones se sustituye por “/etc/apache2/apache2.conf” y para comprobar que la sintaxis de lo que modifiquemos es correcta podemos ejecutar.

httpd -t   // Nos data OK si es correcta la sintexis.
apache2 -t // Para instalaciones realizadas por ejemplo en Debian.

También tendremos un directorio donde estarán los ficheros auxiliares de configuración “/etc/apache2/conf.d” y ficheros “.htaccess” en los directorios de nuestras páginas que permiten descentralizar ciertas configuraciones.

Tenemos que configurar AllowOverride en la configuración del directorio en para evitarlo o permitirlo.

AccessFileName .htaccess  // Nombre del fichero de config. local
AllowOverride None   // Deshabilita el uso de .htaccess
AllowOverride All   // Se usa la configuración de .htaccess

1.- Host Virtuales

Nos permite tener varios paginas, mejor dichos varios dominios, en el mismo servidor de forma que en nuestro fichero “/etc/hosts” de nuestro ordenador cliente definimos la IP de nuestro servidor WEB con los nombres de nuestras aplicaciones WEB y sera el propio apache el que nos lleve a la página correspondiente sin tener cada una en un puerto diferente.

Se podría realizar también virtuales por IP, el servidor WEB tiene varias IPs, pero el ejemplo sera con dominios que es lo más normal.

Crearemos dos servidores virtuales: sqli.lab y docker.lab que tendrán por ejemplo un proyecto de practicas de SQL-Inyection y la otra un interface WEB para la gestión del servidor docker. 

Lo primero sera definir en el fichero “/etc/hosts” de los equipos que accedan al servidor web los dominios con la IP del servidor (en mi caso 192.168.56.20) ya que no son dominios públicos sino locales a nuestra red.

192.168.56.20   sqli.lab docker.lab

Y lo mismo en el fichero hosts de nuestro servidor WEB, para que apache lo resuelva.

Configuración en httpd.conf

Nos aseguraremos que en el fichero “/etc/apache2/httpd.conf” esta la directiva “IncludeOptional /etc/apache2/conf.d/*.conf” normalmente al final del fichero y que permitirá leer configuraciones del directorio conf.d

Deberemos dar permisos al directorio raíz donde se alojaran las páginas cambiando del DocumentRoot, así como   los permisos de este.

Creamos ficheros VirtualHost (sqli.conf y docker.conf)

Crearemos un fichero para cada VirtualHost en el directorio “conf.d“,en estos ficheros tendremos los cambios que deseemos cambiar del principal “httpd.conf” teniendo en cada fichero las propias características de cada uno de los virtuales.

La configuración de cada uno de los ficheros, cada una en sus fichero (sqli.conf y docker.conf) correspondiente.

<VirtualHost *:80>   // Virtual escuchando por el puerto 80
    DocumentRoot "directorio de los ficheros"
    ServerName "Nombre de dominio" // Propietario apache:apache
     ..
</VirtualHost>

Creamos los directorios donde almacenaremos las paginas y pondremos el usuario y grupo con el que se ejecute el apache, en nuestro caso es “apache”, esto se puede ver en el fichero httpd.conf en la directivas “User y Group

Algunas de las configuraciones que podremos poner en VirtualHost y que sobrescribirán a las definidas, si estan definidad, a las del fichero http.conf.

  • DocumentRoot indica el directorio donde se alojan los ficheros (OBLIGATORIO)
  • <Directory> …. </Directory>  Directivas de configuración del directorio, aqui por ejemplo podremos permitir o no el uso del .htaccess.
  • ServerName El dominio (OBLIGATORIO)
  • Alias /image/ /home/apache/imagenes Nos permite localizar las imagenes en un directorio común y no en el propio del VirtualHost .

Con los fichero configurados reiniciamos el servidor

rc-service apache restart

2.- Ficheros .htaccess

Se sitúan en el directorio al que le queremos cambiar la configuración por defecto, tanto de httpd.conf como el fichero que describe el VirtualHost, siempre que nos lo permita la directiva “AllowOverride“. Estos cambios no necesitan reiniciar el servidor.

Un uso simple es cambiar la prioridad de la lectura de los ficheros index del directorio, normalmente esta en index.html pero al tener PHP nos puede interesar que sea index.php.

DirectoryIndex index.php index.html

Otro uso típico es solicitar autorización ya sea a un directorio o a un fichero. Estas autorizaciones pueden ser de IPs o en nuestro caso solicitaremos un usuario/clave.

Para definir los usuarios y las claves que se encontraran en el fichero .htpasswd usaremos la utilidad htpasswd que se encuentra en las utilidades de apache.

htpasswd -c <fichero> <Usuario>  // crea fichero con usuario
htpasswd -mb <fichero> <usuario> <clave> // Añade un nuevo usuario

3.- Consejos de seguridad

  • El servidor deberá ejecutarse con un usuario distinto a root, en  nuestro caso como se vio antes es el usuario apache.
  • Precaución con poner enlaces a ficheros del sistema, por ejemplo a /etc/passwd, ya que podremos acceder a ellos desde la web si tenemos permiso de enlaces. (FollowSymLinks)
  • Reducir el baner de información que da el servidor según la directiva “ServerTokens
# ServerTokens Full
Server: Apache/2.4.34 (Unix) PHP/7.2.10

# ServerTokens OS
Server: Apache/2.4.34 (Unix)

# ServerTokens Minimal
Server: Apache/2.4.34

# ServerTokens Prod
Server: Apache
  • Evitar mostrar archivos de los directorios con la directiva “Options -Indexes