Cómo proteger Apache con SSL y cifrar en FreeBSD


En este tutorial, aprenderemos cómo proteger el servidor HTTP Apache con certificados TLS/SSL ofrecidos por Let's Encrypt en FreeBSD 11.x. También cubriremos cómo automatizar el proceso de renovación del certificado para Lets ’Encrypt.

Los certificados TLS/SSL son utilizados por el servidor web Apache para cifrar la comunicación entre los nodos finales, o más común entre el servidor y el cliente para brindar seguridad. Let's Encrypt proporciona la utilidad de línea de comandos certbot, que es una aplicación que puede facilitar la forma en que puede obtener certificados confiables de forma gratuita.

  1. Instalación de FreeBSD 11.x
  2. 10 cosas que hacer después de la instalación de FreeBSD
  3. Cómo instalar Apache, MariaDB y PHP en FreeBSD

Paso 1: configurar Apache SSL en FreeBSD

1. Antes de comenzar a instalar la utilidad certbot y crear el archivo de configuración TSL para Apache, primero cree dos directorios distintos llamados sitios disponibles y sitios habilitados en el directorio de configuración raíz de Apache emitiendo los siguientes comandos.

El propósito de estos dos directorios es facilitar la administración de la configuración del alojamiento virtual en el sistema, sin modificar el archivo de configuración principal de Apache httpd.conf cada vez que agregamos un nuevo host virtual.

# mkdir /usr/local/etc/apache24/sites-available
# mkdir /usr/local/etc/apache24/sites-enabled

2. Después de haber creado ambos directorios, abra el archivo httpd.conf de Apache con un editor de texto y agregue la siguiente línea cerca del final del archivo como se ilustra a continuación.

# nano /usr/local/etc/apache24/httpd.conf

Agregue la siguiente línea:

IncludeOptional etc/apache24/sites-enabled/*.conf

3. A continuación, habilite el módulo TLS para Apache creando el siguiente archivo nuevo llamado 020_mod_ssl.conf en el directorio modules.d con el siguiente contenido.

# nano /usr/local/etc/apache24/modules.d/020_mod_ssl.conf

Agregue las siguientes líneas al archivo 020_mod_ssl.conf.

Listen 443
SSLProtocol ALL -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCacheTimeout  300

4. Ahora, elimine el comentario del módulo SSL del archivo /usr/local/etc/apache24/httpd.conf eliminando el hashtag del principio de la siguiente línea como se ilustra a continuación:

LoadModule ssl_module libexec/apache24/mod_ssl.so

5. A continuación, cree el archivo de configuración de TLS para su dominio en el directorio de sitios disponibles, preferiblemente con el nombre de su dominio, como se presenta en el siguiente extracto:

# nano /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf

Agregue la siguiente configuración de virtualhost al archivo bsd.lan-ssl.conf.

<VirtualHost *:443>
    ServerName www.yourdomain.com
	ServerAlias yourdomain.com
                DocumentRoot "/usr/local/www/apache24/data/"
	SSLEngine on

	SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem"
	SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem"
	SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>

<Directory "/usr/local/www/apache24/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

	BrowserMatch "MSIE [2-5]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0

	CustomLog "/var/log/apache/httpd-ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

	<Directory "/usr/local/www/apache24/data/">
            Options Indexes FollowSymLinks MultiViews
        #AllowOverride controls what directives may be placed in .htaccess files.       
                        AllowOverride All
        #Controls who can get stuff from this server file
                        Require all granted
        </Directory>
       
    ErrorLog "/var/log/apache/yourdomain.ssl-error.log"
    CustomLog "/var/log/apache/yourdomain.ssl-access_log" combined

</VirtualHost>

Asegúrese de reemplazar la variable de nombre de dominio de las declaraciones ServerName, ServerAlias, ErrorLog, CustomLog en consecuencia.

Paso 2: Instale Lets’Encrypt en FreeBSD

6. En el siguiente paso, emita el siguiente comando para instalar la utilidad certbot proporcionada por Let’s Encrypt, que se utilizará para obtener certificados gratuitos de Apache TSL para su dominio.

Mientras instala certbot, se mostrarán una serie de mensajes en su pantalla. Utilice la siguiente captura de pantalla para configurar la utilidad certbot. Además, la compilación e instalación de la utilidad certbot puede llevar algún tiempo, según los recursos de su máquina.

# cd /usr/ports/security/py-certbot
# make install clean

7. Una vez finalizado el proceso de compilación, ejecute el siguiente comando para actualizar la utilidad certbot y las dependencias requeridas por certbot.

# pkg install py27-certbot
# pkg install py27-acme

8. Para generar un certificado para su dominio, emita el comando como se ilustra a continuación. Asegúrese de proporcionar la ubicación webroot correcta donde se almacenan los archivos de su sitio web en el sistema de archivos (directiva DocumentRoot de su archivo de configuración de dominio) utilizando la marca -w . Si tiene varios subdominios, agréguelos todos con la marca -d .

# certbot certonly --webroot -w /usr/local/www/apache24/data/ -d yourdomain.com -d www.yourdomain.com

Mientras obtiene el certificado, proporcione una dirección de correo electrónico para la renovación del certificado, presione a para aceptar los términos y condiciones de Let's Encrypt y n para no compartir la dirección de correo electrónico de los socios de Let's Encrypt.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email protected]
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email protected]

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/apache24/data for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-11-15. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

9. Una vez que haya obtenido los certificados para su dominio, puede ejecutar el comando ls para enumerar todos los componentes del certificado (cadena, clave privada, certificado) como se presenta en el siguiente ejemplo.

# ls -al /usr/local/etc/letsencrypt/live/www.yourdomain.com/

Paso 3: Actualice los certificados TLS de Apache en FreeBSD

10. Para agregar certificados Let's Encrypt a su sitio web, abra el archivo de configuración de Apache para su dominio y actualice las siguientes líneas para reflejar la ruta de los certificados emitidos.

# nano /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf

Agregue estas líneas de certificado TLS:

SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem"
	SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem"
	SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem"

11. Finalmente, habilite el archivo de configuración TLS, creando un enlace simbólico para el archivo de configuración TLS de su dominio al directorio habilitado para sitios, verifique las configuraciones de Apache para ver si hay posibles errores de sintaxis y, si la sintaxis es correcta, reinicie el demonio Apache emitiendo los siguientes comandos.

# ln -sf /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf /usr/local/etc/apache24/sites-enabled/
# apachectl -t
# service apache24 restart

12. Para verificar si el servicio Apache está escuchando en el puerto HTTPS 443, ejecute el siguiente comando para listar los sockets de red httpd.

# sockstat -4 | grep httpd

13. Puede navegar a la dirección de su dominio desde un navegador a través del protocolo HTTPS para confirmar que los certificados de Let's Encrypt se aplicaron correctamente.

https://www.yourdomain.com

14. Para obtener información adicional sobre el certificado Let’s Encrypt emitido desde la línea de comando, use el comando openssl de la siguiente manera.

# openssl s_client -connect www.yourdomain.com:443

15. También puede verificar si el tráfico está encriptado con un certificado válido proporcionado por Let's Encrypt CA desde un dispositivo móvil, como se ilustra en la captura de pantalla móvil a continuación.

¡Eso es todo! Los clientes ahora pueden visitar su sitio web de forma segura, porque el tráfico que fluye entre el servidor y el navegador del cliente está encriptado. Para tareas más complejas relacionadas con la utilidad certbot, visite el siguiente enlace: https://certbot.eff.org/