Apache

De La Wiki de KiVi

Esta entrada solo llega a ser un pequeño manual básico del servicio Apache, ya que explicar todo su funcionamiento llevaría a todo un libro, en este caso, aprovecharemos los servicios de WordPress y Nextcloud para explicar el caso práctico, por lo que se considera un seguimiento de las entradas anteriores.

Primero, ¿qué es Apache?

Su nombre se debe a que alguien quería que tuviese la connotación de algo que es firme y enérgico pero no agresivo, y la tribu Apache fue la última en rendirse al que pronto se convertiría en gobierno de Estados Unidos, y en esos momentos la preocupación de su grupo era que llegasen las empresas y «civilizasen» el paisaje que habían creado los primeros ingenieros de internet.

El servidor Apache es desarrollado y mantenido por una comunidad de usuarios bajo la supervisión de la Apache Software Foundation dentro del proyecto HTTP Server (httpd).

Apache presenta entre otras características altamente configurables, bases de datos de autenticación y negociado de contenido, pero fue criticado por la falta de una interfaz gráfica que ayude en su configuración.

Apache tiene amplia aceptación en la red: desde 1996, Apache es el servidor HTTP más usado. Jugó un papel fundamental en el desarrollo de la World Wide Web y alcanzó su máxima cuota de mercado en 2005, siendo el servidor empleado en el 70% de los sitios web en el mundo. Sin embargo, ha sufrido un descenso en su cuota de mercado en los últimos años (estadísticas históricas y de uso diario proporcionadas por Netcraft​). En 2009, se convirtió en el primer servidor web que alojó más de 100 millones de sitios web.

La mayoría de las vulnerabilidades de la seguridad descubiertas y resueltas tan solo pueden ser aprovechadas por usuarios locales y no remotamente. Sin embargo, algunas se pueden accionar remotamente en ciertas situaciones, o explotar por los usuarios locales maliciosos en las disposiciones de recibimiento compartidas que utilizan PHP como módulo de Apache.

Instalando el servicio apache

En la entrada Servidor LAMP en Fedora ya expliqué cómo hacer la instalación del servicio y los directorios que genera.

Explicando la configuración

Como es habitual, todo fichero de configuración se encuntra en:

/etc/httpd/conf/httpd.conf

El archivo de configuración principal referencia a otros ficheros importantes por medio de “includes”:

  • ports.conf → define los puertos a través de los que el sevidor
  • apache trabaja
  • envvars → define variables de entorno fundamentales para
  • el servidor
  • mod-available/.conf → configuraciones de módulos disponibles sites-vailable/.conf → configuraciones de hosts virtuales
  • conf-availble/*.conf → archivos de configuración extra

Directivas fundamentales de la configuración

En apache existen muchas directivas aplicables a la configuración, de las más fundamentales son:

  • ServerRoot – Indica el directorio raíz de los archivos de configuración.
  • User – Determina la cuenta de usuario del proceso Apache.
  • Group – Determina el grupo de servicio propietario de los procesos Apache.
  • ErrorLog – Archivo de registro de errores.
  • CustomLog – Archivo de registro de accesos.
  • Include – Indica un archivo de configuración anexo que se integrará en el archivo apache2.conf.
  • Listen – Indica el puerto en el que escucha el servidor.
  • DocumentRoot – Indica el directorio que contiene los archivos html.

Directivas condicionales

Se aplica si una condición se cumple:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Gestionando el servicio

Una vez instalado el paquete, el servicio está configurado para iniciar en cada inicio, pero se puede iniciar o parar:

sudo systemctl star/stop/restart httpd #inicia, para o reinicia el servicio

Se puede ejecutar el servicio con los parámetros:

sudo httpd -t #valida la sintaxis de la configuración y avisa si hay errores
sudo httpd -k stop #para el servicio
sudo httpd -k start #Inicia el servicio

Directorio por defecto

En las distribuciones más comunes, cuando instalas el servicio web, el directorio por defecto es:

/var/www/html

Y se puede alojar de manera sencilla el resto de contenido dentro de este directorio, mientas los atributos sean los correctos:

chmod -R 775 * /var/www/html
chown -R apache:apache /var/www/hmtl

Hosts Virtuales

Mediante esta directiva podemos albergar varios sitios distintos de diferentes configuraciones, hasta el hecho de especificar la ubicación del servidor.

Hay dos técnicas de implementación de hosts virtuales:

  • VirtualHost por dirección IP – El servidor dispone de varias IPs y responde de diferente forma según la interfaz a la que llegue cada petición HTTP.
  • VirtualHost por nombre de host – existen tantos sitios virtuales como VirtualHost haya definidos. Suele ser el modo más habitual:

Ejemplos:

Dentro de cada Virtual Host hay varios parámetros de configuración que son importantes:

  • ServerName → especifica el dominio correspondiente
  • DocumentRoot → especifica la ubicación de los archivos de dicho sitio web
  • ServerAlias → permite especificar otros dominios redirigidos a este
  • ServerAdmin → email del administrador del sitio, de cara a notificaciones
  • Redirect → nos permite redirigir una url a otra dentro del servidor

Un ejemplo, digamos que, aparte de nuestro dominio, hemos contratado otro y queremos que cargue otra página, es decir, tengo mainkivi.info en el Virtualhost por defecto y quiero acceder a kikevilchez.com pero organizado desde mi mismo servidor, pues tengo que tener un fichero:

sudo vi /etc/httpd/conf.d/kikevilchez.com

Y le podemos poner:

<VirtualHost *:80>

   ServerName kikevilchez.com

   DocumentRoot /var/www/kikevilchez.com

DocumentIndex index.php

ServerAdmin info@kikevilchez.com

RewriteEngine on

</VirtualHost>

Con esto, todas las peticiones a kikevilchez.com por la puerta 80 ( puerto por defecto en apache ), cargarán el contenido del directorio /var/www/kikevilchez.com y también, solo el fichero index.php.

Alias, contenedor y directivas

Los Alias se utiliza para especificar el nombre del directorio web a la ruta correspondiente, por ejemplo:

Alias /wordpress /usr/share/wordpress

Con lo que en el navegador, al acceder a:

https://192.168.1.241/wordpress

En realidad accedes al directorio del Alias.

Podemos especificar el directorio que contiene un servicio web específico bajo:

<Directory /ruta/directorio>
  directiva 1
  directiva 2
</Directory>

Esto ya lo entramos cuando instalamos WordPress o nextcloud:

Restricción de acceso

Apache permite la restricción de acceso a hosts a las diferentes áreas del servidor

El módulo que hay que activar es access_mod o access_compat_mod.

Las directivas se especifican con reglas allow, deny, por ejemplo

<Directory /var/www/html>
Order Deny,Allow
Deny from All
Allow from 192.168.1.0/255.255.255.0
</Directory>

En este ejemplo se denegaría el acceso a la página web a todos los equipos que no sean de la red local 192.168.1.0/24.


Acceso a un sitio web por contraseña

Mediante esta configuración podemos «bloquear» el acceso a un directorio web obligando al visitante poner un usuario y contraseña, este procedimiento

Lo primero es ejecutar el comando htpasswd que permite crear la base de datos de cuentas y trabajar con ella, por ejemplo:

sudo htpasswd -c /etc/htpasswd enrique

Esto crea al usuario enrique y le pide contraseña, el resultado se guarda en /etc/httpasswd.

Para  eliminar el usuario ejecutamos:

sudo htpasswd -D /etc/htpasswd enrique

Para listarlos es muy sencillo, solo lee el fichero. Antes de continuar es necesario tener los módulos: auth_basic, authn_file y authz_user, aunque suelen venir por defecto en la instalación de las instalaciones como ya expliqué en la entrada anterior. Lo siguiente es añadir las siguientes directivas:

AuthType basic 
AuthUserFile /etc/htpasswd 
AuthName "Se necesita comprobar su identidad" 
Require valid-user

Comprobamos la configuración:

sudo httpd -t

Y, si todo es correcto y no hay errores, podemos reiniciar el servicio.

sudo systemctl restart httpd

Si cargamos el directorio o sitio web donde hemos aplicado las directivas, debería pedir usuario y contraseña.

Proxy Inverso en Apache

Solo para este tipo de configuraciones se debería dedicar una entrada entera debido a su complejidad, ya que tiene diferentes funciones esta directiva.  Solo explicaré la configuración más sencilla, en este ejemplo le diremos al servidor que las solicitudes a un directorio de un sitio web se redireccionen a otro servidor, no tiene por qué ser apache, puede ser NGINX, por ejemplo, y este servidor no tienen por qué tener un certificado SSL, ya que lo proveería nuestro servidor. Por ejemplo, en mi servidor principal tengo el servidor web con wordpress, pero me interesa quitarle peso y tener el servidor nextcloud en otro equipo, eso lo logramos con la configuración de Proxy Inverso.

SPOILER – cuando llegue a hablar de contenedores Docker con Collabora Office u OnlyOffice, introduciremos esta configuración. Obviamente, necesitamos el módulo: mod_proxy, que también viene instalado en nuestra distribución. En la configuración del sitio, por ejemplo:

sudo nano /etc/httpd/conf.d/ssl.conf 

Deberíamos poner las directivas dentro de <virtualhost >

ServerAdmin mainkivi@gmail.com
ServerName fedora.mainkivi.info
ProxyPass           /nextcloud https://192.168.1.241/nextcloud retry=0
ProxyPassReverse    /nextcloud https://192.168.1.241/nextcloud

Con esto, cuando llamemos al web EXISTENTE https://fedora.mainkivi.info/nextcloud, este accederá al directorio nextcloud del equipo local con IP 192.168.1.241, obviamente, esta dirección puede ser un lugar web.

Y con esto cerraremos, por ahora, este tipo de configuraciones del servidor web. Estos pasos se explicaron en el video anterior.