GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo configurar SSL/TLS con Apache httpd en Red Hat

Objetivo

El objetivo es configurar el servidor web Apache con soporte SSL/TLS en Red Hat Linux, usando los paquetes enviados con la distribución.

Sistema operativo y versiones de software

  • Sistema operativo: Red Hat Enterprise Linux 7.5
  • Software: Apache httpd, mod_ssl

Requisitos

Acceso privilegiado al servidor web.

Dificultad

FÁCIL

Convenios

  • # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando
  • $ – comandos de Linux dados para ser ejecutados como un usuario regular sin privilegios

Introducción

Instalar un servidor web es bastante fácil en las distribuciones modernas, ya que los casos de uso de un servidor web son tan comunes que la mayoría, si no todas, las distribuciones proporcionan paquetes en sus repositorios. Apache httpd es un servidor web confiable utilizado por una gran parte de Internet y muchos módulos están disponibles para ampliar su funcionalidad.

Las noticias tecnológicas en estos días están llenas de brechas de seguridad, robo/fuga de datos y una creciente necesidad de usar el cifrado
donde sea posible. Si bien el uso de HTTPS tiene cierta sobrecarga informática tanto en el servidor como en el lado del cliente, no usarlo significa que todos los datos enviados en ambas direcciones son texto claro, que puede leer cualquier persona que pueda leer el tráfico mientras pasa por la red.

Suponga que tiene un servicio web donde los clientes pueden iniciar sesión con su nombre de usuario y contraseña, un método de autenticación común, para acceder a sus propios datos, incluidos los administradores del sitio. Si proporciona este servicio a través de http, toda esta información se puede registrar, por lo que alguien podría obtener todas las credenciales de inicio de sesión, iniciar sesión como administrador del sitio y bloquear a los administradores reales o publicar contenido perjudicial para los visitantes.

La capacidad de usar el cifrado durante la navegación está integrada en todos los principales navegadores modernos desde hace mucho tiempo, y de la misma manera el cifrado está disponible para los servidores web desde hace muchos años.

Instalar servidor web Apache con soporte SSL/TLS

Para instalar los paquetes requeridos, simplemente ejecute como root:

# yum install httpd mod_ssl -y

Si el servidor ya tiene instalado httpd, solo necesita instalar mod_ssl , toda la configuración necesaria la realiza
el instalador. Tenga en cuenta, sin embargo, que en este caso necesita reiniciar httpd, para que pueda cargar el módulo ssl. Al usar
los paquetes enviados con la distribución, podemos hacernos la vida mucho más fácil, ya que Red Hat proporcionará actualizaciones debidamente probadas tanto para el sistema operativo como para el servidor web. Por supuesto, necesita una suscripción para recibir las actualizaciones. pero se necesitan actualizaciones para que el sistema operativo se mantenga actualizado.

Habilitar e iniciar el servidor httpd

Usando systemd puede habilitar e iniciar el servidor web con el siguiente comando:

# systemctl enable httpd && systemctl start httpd

De esta forma, systemd iniciará automáticamente el servicio httpd en cada arranque.

Verificar instalación y estado

Puede verificar el estado del servidor web usando systemd:

# systemctl status httpd -l
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-07-07 21:35:33 CEST; 1 weeks 4 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1292 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
    Tasks: 9
   CGroup: /system.slice/httpd.service
           ├─ 1292 /usr/sbin/httpd -DFOREGROUND
           ├─13271 /usr/sbin/httpd -DFOREGROUND
           ├─13272 /usr/sbin/httpd -DFOREGROUND
           ├─13273 /usr/sbin/httpd -DFOREGROUND
           ├─27508 /usr/sbin/httpd -DFOREGROUND
           ├─27509 /usr/sbin/httpd -DFOREGROUND
           ├─27510 /usr/sbin/httpd -DFOREGROUND
           ├─27511 /usr/sbin/httpd -DFOREGROUND
           └─27512 /usr/sbin/httpd -DFOREGROUND

Jul 07 21:35:32 web.foobar.com systemd[1]: Starting The Apache HTTP Server...
Jul 07 21:35:33 web.foobar.com systemd[1]: Started The Apache HTTP Server.

Para verificar que mod_ssl esté correctamente instalado:

# rpm -q mod_ssl
mod_ssl-2.4.6-80.el7.x86_64

Y se carga como un módulo en el servidor httpd:

# apachectl -M | grep ssl
 ssl_module (shared)

Uso de certificados

Cuando instalamos el paquete mod_ssl, el módulo se agrega al servidor httpd, por lo que se cargará en el próximo inicio.
Se genera un certificado autofirmado de forma predeterminada, que se utiliza para establecer una conexión cifrada con el navegador.
Abra un navegador y diríjalo al servidor a través de https:

Mensaje de error de SSL en el navegador Firefox

Ignoremos esto por ahora, agreguemos la excepción de seguridad (no establezca "almacenar esta excepción de forma permanente") y continuemos. Aparece la página predeterminada. En el caso de Red Hat, esto se ve así:

Página de inicio predeterminada de una instalación de servidor web httpd en Red Hat Linux

Tenga en cuenta el signo de exclamación junto a la URL (otros navegadores pueden mostrar una advertencia diferente).

Nuestro servidor web ahora está funcionando a través de https con un certificado autofirmado y listo para servir contenido publicado
en /var/www/html , la raíz de contenido predeterminada del servidor web en Red Hat.

La conexión entre el servidor web y el navegador ahora está encriptada, por lo que es más difícil falsificar el tráfico (que
puede usarse, por ejemplo, para robar credenciales de inicio de sesión). ¿Terminamos? En cierto modo, cumplimos nuestro objetivo.

El hecho de que nuestro navegador no pueda identificar el certificado del servidor como válido no impide que utilice una comunicación encriptada con el servidor, si decidimos explícitamente que confiamos en este certificado. Esto puede ser adecuado para un sistema pequeño (doméstico), donde solo tiene unos pocos usuarios, así como solo unos pocos servidores web:debe aceptar el certificado autofirmado en los navegadores que deberían ser clientes de los servidores web y cualquier otro navegador en el mundo no debería ver nunca el contenido proporcionado por estos servidores.

Sin embargo, tenga en cuenta que este certificado autofirmado caducará con el tiempo (como debería hacerlo cualquier otro certificado) y tendrá que
renovarlo para poder utilizarlo. Los navegadores consideran que los certificados caducados no son válidos, al igual que los certificados cuya validez no se puede demostrar mediante una cadena de certificados válida por encima de ellos.

Para saber cuándo caducará el certificado autofirmado (o cualquier otro), tenemos que encontrarlo en el sistema de archivos consultando el archivo de configuración del módulo ssl:

# grep SSLCertificateFile /etc/httpd/conf.d/ssl.conf | grep -v "#"
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

Y luego use openssl para obtener la fecha de vencimiento:

# openssl x509 -enddate -noout -in  /etc/pki/tls/certs/localhost.crt
notAfter=Jul 10 07:06:17 2019 GMT

Después (o más bien, antes) de que caduque el certificado, debe renovarlo o reemplazarlo con un certificado en el que los clientes confíen. Un
enfoque más elegante en contraste con los certificados autofirmados es solicitar y usar un certificado de una CA
(Autoridad de certificación) en la que sus clientes ya confían, ya sea de su CA interna (que a su vez puede tener una
CA raíz de confianza por encima de ella), o directamente desde una CA de confianza global.

Para usar el certificado obtenido en lugar del predeterminado, los siguientes parámetros deben apuntar al archivo del certificado, la
clave del certificado y el certificado de la CA que firmó el certificado SSL, respectivamente. Los archivos se deben copiar en
el servidor web y el usuario del sistema operativo que ejecuta el servidor web debe poder leerlos; en el caso de una instalación predeterminada de Red Hat, el usuario de apache. Estos parámetros se pueden encontrar en el ssl.conf mencionado anteriormente .

SSLCertificateFile	/etc/httpd/custom-cert/server-ssl.crt
SSLCertificateKeyFile	/etc/httpd/custom-cert/server-ssl.key
SSLCACertificateFile	/etc/httpd/custom-cert/ca.crt

Redireccionar el tráfico http a https

Ahora que servimos a través de https, podemos imponer el uso de https mientras servimos todo o parte de nuestro contenido. En nuestro
ejemplo, somos muy seguros y usamos http solo para redirigir a los clientes entrantes a https.

Puede surgir una pregunta, si queremos hablar solo https, ¿por qué escuchamos http? Supongamos que un usuario final, que acaba de enterarse de nuestro sitio, obtuvo una URL de un amigo que no contiene el protocolo. Hasta el día de hoy, la mayoría de los navegadores usan por defecto el protocolo http, si no se especifica uno explícitamente. Si dejamos de servir a través de http, el usuario que escriba la URL sin https recibirá un mensaje de error si su navegador intenta llegar a nuestro servidor a través de http.

Para redirigir todas las solicitudes http entrantes a https, creamos un archivo en /etc/httpd/conf.d con un nombre descriptivo, por ejemplo, redirect_http.conf con el siguiente contenido (donde web.foobar.com es el nombre DNS del sitio):

<VirtualHost _default_:80>
        Servername web.foobar.com
        Redirect permanent / https://web.foobar.com/
</VirtualHost>

Y reinicie el servidor web. Podemos probar si la redirección funciona correctamente desde la línea de comandos con wget (desde un host que confíe en el certificado SSL del servidor web):

$ wget http://web.foobar.com/
--2018-07-19 16:13:01--  http://web.foobar.com/
Resolving web.foobar.com (web.foobar.com)... 10.9.8.7
Connecting to web.foobar.com (web.foobar.com)|10.9.8.7|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://web.foobar.com/ [following]
--2018-07-19 16:13:01--  https://web.foobar.com/
Connecting to web.foobar.com (web.foobar.com)|10.9.8.7|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 240 [text/html]
Saving to: ‘index.html’

100%[====================================================================================>] 240         --.-K/s   in 0s      

2018-07-19 16:13:01 (7.04 MB/s) - ‘index.html’ saved [240/240]

El resultado muestra la respuesta http 301 y podemos ver cómo nuestro cliente wget sigue la redirección para conectarse mediante el protocolo https. De forma predeterminada, el tráfico SSL se registra en archivos de registro diferentes al tráfico HTTP. Podemos encontrar la solicitud anterior
registrada en /var/log/httpd/ssl_access_log :

10.9.8.8 - - [19/Jul/2018:16:13:01 +0200] "GET / HTTP/1.1" 200 240

Conclusión

Con esto, hemos completado nuestro objetivo, configuramos un servidor web que usa https para hablar con los clientes y también redirige las solicitudes http entrantes a https.


Linux
  1. Cómo proteger sus servicios de correo electrónico de Linux con SSL/TLS

  2. Cómo proteger el nombre de host de Plesk en el puerto 8443 con certificado SSL

  3. ¿Cómo configurar VSFTPD con conexión encriptada SSL/TLS?

  4. Cómo asegurar una conexión SSL con Apache en Ubuntu 18.04

  5. Cómo instalar Apache 2 con SSL en Linux (con mod_ssl, openssl)

Cómo configurar Let's Encrypt SSL con Apache en Fedora

Cómo instalar y configurar Apache con Let's Encrypt TLS/SSL en Ubuntu 20.04

Cómo instalar y configurar Apache (httpd) con Let's Encrypt TLS/SSL en AlmaLinux 8

Cómo monitorear certificados SSL/TLS con Checkmk

Cómo configurar la autenticación de contraseña con Apache en Ubuntu 18.04

Cómo configurar la configuración de host virtual de Apache (con ejemplos)