domingo, 31 de mayo de 2020

CenTOS 8 | Ubuntu 20.04 Aplicar TLS Apache2 + OpenSSL Root CA + CSR/Cert


Usando SSL con Apache2 + OpenSSL como CA, procesando CSR, y Certificado

Situación Presentada

Una ex-compañera de trabajo me dijo que le habían solicitado en la empresa pasar sus sitios web intranet a HTTPS cómo motivo de baseline según nuevas politicas de seguridad informatica.  

Y qué hacemos entonces?

Cada terminología se va a explicar brevemente para conocimiento general, pero esta entrada se enfocará en la creación del archivo de solicitud de certificado CSR y proceso de firmarlo con una CA authority y finalmente instalación del CRT resultante de esto, en los servidores web, que son Apache2.  Se configurará una una entidad certificadora interna corriendo como Root CA, tambien una breve muestra de como usar una entidad certificadora pública.(Let's Encrypt)


Componentes del articulo

1. Pre-requisitos para instalación
  1.1 Requisitos CenTOS 8
  1.2 Requisitos Ubuntu 20.04
2. Firewall
  2.1 Ubuntu 20.04
  2.2 CentOS 8
3.  Terminología y conceptos de HTTPS, PKI, y CertificadosSSL usados
4. Preparacion  Apache2 
HTTPS y forzar Redirect 
  4.1 Ubuntu 20.04 
  4.2 CentOS 8  
5. Crear Private Key y CSR.
  5.1 Generar Llave
    5.1.1 Usando alrogitmo RSA
    5.1.2 Usando algoritmo ECDSA
  5.2 Generar CSR
6. Creación de Certificado con CA .
  6.1 Usando CA Interno
    6.1.1 Crear una entidad certificadora interna
    6.1.2 Firmar (Crear) crear Certificado con CA interno
    6.1.3 Habilitar CA Interno en almacen de certificados.
      6.1.3.a En Linux
      6.1.3.b En Windows
   6.1.4 Visualización de Certificado
     6.1.4.a En Linux
     6.1.4.b En Windows
  6.2 Usando CA Publico
8. Pruebas de certificado.


1. Pre-requisitos para instalación


•Un PC con CentOS 8 o Ubuntu 20.04, usados en este tutorial.
•Una conexión de red a internet (cableada preferiblemente)
•Un servidor DNS corriendo (usar DNSMasq o DNS configurado en este post )
•Un Apache2 webserver corriendo, ya que no se cubrira aqui.
•Conocimiento basico de shell de Linux

  1.1 Pre-requisitos CentOS 8

•Actualizar repositorios e instlara el repositorio EPEL tambien.

   sudo yum install epel-release
   sudo yum update
   sudo yum update

* Nota: Si aparece un error indicando que no puede sincronizar, ejecutar lo siguiente:

   sudo dnf update -y --releasever=8

  1.2 Pre-Requisitos Ubuntu 20.04


• Actualizar repositorios:

   sudo apt update
apt install php libapache2-mod-php 

2. Configurar Firewall
Si no está hecho ya, se debe abrir el puerto tcp/443 (https) para que funcione el  , ya que posteriormente se hará un redireccionamiento forzado desde el puerto tcp/80 (http) .
Si no se está usando firewall, omitir paso, sin embargo es fuertemente aconsejable, y casi mandatorio tenerlo activo.

**NOTA: La red que uso en mi laboratorio es la 192.168.116.0/24 , configurada en este post

Permitir Inbound:

tcp/80- HTTP (porque si , para probar la redireccion ) 
tcp/443   - HTTPS 

2.1 Ubuntu 
La configuracion que se usará para el servidor web, será la siguiente (en caso de ya estar configurados algunas reglas, omitirlas y pasar a la de HTTPS ,la última).

En Ubuntu El firewall esta deshabilitado por default. 
Para habilitarlo, y configurarlo a lo minimo, ejecutaremos los siguientes comandos:

Crear las reglas generales con el principio de Denegacion Implicita para prevenir accesos no autorizados.
sudo ufw default allow outgoing
sudo ufw default deny incoming

Agregar excepcion para conectarnos por SSH, desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 22 comment 'aceptar trafico SSH a NUESTRA red'

Agregar excepcion para el servicio web que habrá (HTTP/HTPS), desde nuestra red:
sudo ufw allow 80/tcp comment 'aceptar trafico web HTTP de TODOS'
sudo ufw allow 443/tcp comment 'aceptar trafico web HTTPS de TODOS'

2.2 CentOS
Se ejecutará lo mismo que en el inciso anterior para Ubuntu, pero con la sintaxis del firewall para CentOS:

Agregar nuestra red actual a la zona:

sudo firewall-cmd --zone=public --permanent --add-source=192.168.116.0/24
Agregar reglas con excepciones:
SSH:
sudo firewall-cmd --zone=public --permanent --add-port=22/tcp


HTTP/HTTPS
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp

sudo firewall-cmd --reload

Se confirman los cambios:
sudo firewall-cmd --zone=public --list-all

3. Breve explicación de HTTPS, PKI y Certificados SSL

Esto es una explicación (muy rápida) de como funciona el mecanismo SSL/TLS, en caso de ser necesario.

Los servidores web para servir paginas web seguras, utilizan algo que se llaman Certificados SSL, lo hacen por medio de protocolos seguros como el TLS 1.2 , por tanto, SSL y TLS  son terminos intercambiables, siendo el ultimo el más nuevo y seguro.

Esto lo que hacen es encriptar el tráfico entre el usuario, y el sitio web, y así prevenir que la data sea vista a simple vista por softwares que pueden inspeccionar paquetes (e.g. cómo ver trafico HTTP con Wireshark ).





Los componentes, siglas y conceptos utilizados en este intercambio son los siguientes:

PKI (Public Key Infraestructure ó Infraestructura de Llave Publica) 
Es la esencia del concepto de certificados digitales, es la práctica o sistema de emisión, validación y revocación de un certificado. 

CA (Certificate Authority  ) valida la autenticidad de un certificado, es decir, que da el visto bueno, de que un certificado utilizado por un sitio web ES LEGITIMO, o sea que no está siendo impersonado, o duplicado por algun atacante (ver ataque de hombre en el medio MITM )  .  
En esta situación se puede usar un CA interno o uno público , la diferencia es que los certificados de los (Root ó Intermediarios) CA públicos, ya están incluidos en el almacén de llaves de un sistema operativo, los certificados de nuestros CA internos, debemos instalarlos manuamente (inciso 6).


En SSL/TLS se utiliza un par de llaves, un metodo al que se le llama public key cryptograpy, usado para autenticar y mantener conexiones seguras. Estas se crean al mismo tiempo usando algun mecanismo de encriptacion y se usarn en el proceso del handshake TLS.



Private Key ó Llave Privada
Es un archivo de texto usado inicialmente para crear un CSR , y luego para asegurar y verificar conexiones formadas con el certificado creado. 

La llave privada debe estar segura y guardada, ya que si alguien obtiene acceso a ella, puede usar el certificado para fines maliciosos.

Public Key ó Llave Publica
Va incluida en el CSR que se envia al CA, y en el CRT que se recibe a cambio y se coloca en el sitio web. Es la parte del par de llaves que al juntarse con  la privada (solo disponible para el servidor) hace un calculo matematico para validar su autenticidad.

CSR (Certificate Signing Request ó Solicitud de Firma de Certificado)
Es un archivo generado en el servidor donde se pondrá el SSL, el mismo donde se produjo la llave privada, y contiene la información que el CA usará para crear el certificado (e.g cn=nombre host/dominio/comun, o=organizacion, c=pais, etc).

CRT/CER (Certificate file ó archivo de certificado)
Es el resultado final de haber creado el par de llaves, enviado el CSR al CA para firmado digital, y es el archivo (.crt o .cer) que se instalará en el servidor, para que los usuarios puedan verlo y usarlo para crear una sesión segura.

OpenSSL 
Es OpenSSL es un software, bueno, un conjunto de librerias open source cuyo fin y uso es asegurar la comunicación entre las redes de computadoras.
Relativo al tema actual, es ysado ampliamente para implementacion de protocolos SSL/TLS .


4. Configuración de módulos Apache2 

Antes de comenzar a generar y aplicar certificados, es necesario  tener los modulos listos y habilitados para cargarlos, y tambien el archivo *Nuevo* de configuración para poder servir https y forzar el redireccionamiento desde http.

4.1 Módulos Ubuntu (apache2: rewrite y ssl)
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl restart apache2

4.2 Módulos CentOS (httpd: mod_ssl )

yum install mod_ssl



Se crea un archivo de configuración para el sitio web (la ubicacion cambia segun distribución):
**Nota: los parametros en violeta, son personalizables de acuerdo al gusto o necesidad. Y los comentarios van  #

Ubuntu, editar archivo de configuracion:

sudo nano /etc/apache2/sites-available/miweb.conf

y luego de modificarlo habilitar el sitio web.

sudo a2ensite miweb






CentOS, editar archivo de configuracion

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


El archivo miweb.conf con el siguiente contenido:

# Contenedor para el sitio web, con el bind al socket de la ip+tcp/443 (https)
<VirtualHost 192.168.116.4:443>
#Las siguientes 3 lineas son para habilitar el ssl, y apuntara la ubicacion de el certificado y su llave privada. 
SSLEngine On
SSLCertificateFile "/etc/apache2/ssl/miweb-san.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/miwebrsa.key"
#Opciones básicas de un sitio web (est
   DocumentRoot "/var/www/html/miweb"
   Options Indexes FollowSymlinks
# El nombre del nuestro host, segun su entrada en el DNS 
   ServerName web1.plecaetc.local
# IMPORTANTE, este es el que ira en el certificado
 </VirtualHost>

# Contenedor para el sitio web, con el bind al socket de la ip+tcp/80 (http)
<VirtualHost 192.168.116.4:80>
#La primera linea, nombre de host que espera (pero en puerto http)
ServerName web1.plecaetc.local
#La directiva que hace el redireccionamiento
Redirect / https://web1.plecaetc.local

</VirtualHost>


4.4 Metodo Alterno Redirect Ubuntu y CentOS (Obsoleto)

nano /var/www/html/miweb/.htaccess

RewriteEngine On
RewriteCond %{HTTP_HOST} ^web1\.plecaetec\.local [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://web1.plecaetec.local/$1 [R,L]


5. Crear Private Key y CSR

El escenario ya ha sido preparado para el webserver, los modulos y configuración, todo está en orden, por lo que se comienza la parte que corresponde a la generación del Certificado y lo que lo rodea.. 


5.1 Generar llave 

OpenSSL tiene la fortuna de ser standard en ambas familias de distribución, por lo que los pasos aplican a ambos.

Se utilizará para crear la llave privada, ya que contiene muchas librerias para hashing, encriptación de files (sym/asym) , y para lo que nosotros usaremos, algoritmo de firma digital para certificados.


Volvernos al directorio de apache 
Ubuntu:   /etc/apache2/ 
CentOS:  /etc/httpd/ 

cd/etc/apache2/
sudo mkdir ssl
cd ssl


5.1.1 Usando algoritmo RSA
Es usado normalmente para redes de computadoras, y por los equipos legacy, el requerimiento minimo de bits usados para generar la llave, es 2048 bit en los tiempos modernos.


sudo openssl genrsa -out /etc/apache2/ssl/miwebrsa.key 2048


5.1.2 Usando algoritmo ECDSA
Para mobiles, se puede utilizar ECDSA , que es más liviano para transportar, como ejemplo 112 bit brindan la misma seguridad que 2048 en RSA. 

Es bueno ver las alternativas de curvas posibles para utilizar
sudo openssl ecparam -list_curves

En el listado de posibles , se eligio el de 112bit para genrear la llave.

sudo openssl ecparam -name secp112r1 -genkey -noout -out /etc/apache2/ssl/miwebecdsa.key



OpenSSL también brinda las librerias para poder crear solicitud de firma de certificados, CSR, para enviarlos a la Autoridad Certificadora ,CA.

Cualquiera de las llaves creadas en el paso 5.1  puede ser usado.

5.2.1 Metodo no SAN (Obsoleto, usar metodo 5.2.2)

sudo openssl req -new -key /etc/apache2/ssl/miweb.key -out /etc/apache2/ssl/miwebrsa.csr

Habrá un prompt de ciertos datos que van en el Subject del certificado (la información general)

**NOTA: Importante es el CommonName (cn) , ya que es el valor que se compara con la URL del navegador, por eso la entrada en el DNS del web server, debe estar bien configurada, en este caso uso web1.plecaetc.local.













5.2.1 Metodo SAN (x509 v3 )

Por los actuales estandares de seguridad, se deben llevar a cabo certificados con Subject Alternative Name, obligatoriamente, por lo que se recomienda utilizar el siguiente comando en donde se utiliza el archivo de configuracion (depende la version de linux), Y SE LE AGREGA el apartado SAN con sus valores, para enviarlos con el CSR al CA (visto a continuación)

openssl req -new -sha256 -key miwebrsa.key -subj "/C=HN/ST=Cortes/O=PlecaEtece Blog/CN=web1.plecaetc.local" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:web1.plecaetc.local,DNS:web2.plecaetc.local")) -out miweb-san.csr

6. Root CA  y firmar (crear) certificados

Como se explica anteriormente, el funcionamiento de la infraestructura PKI (inciso 3) se requiere de una autoridad que firme y certifique la legitimidad del certificado que son aplicados.

6.1 Usando CA Interno

6.1.1 Crear una entidad certificadora interna

Es posible crear un root CA en un servidor Linux (Otro, no el que genera el CSR), con OpenSSL , ejecutando los siguientes pasos.
**Nota: Todos los valores son de acuerdo al escenario actual.

Se crea la llave
sudo openssl genrsa -out ca.plecaetc.key 2048

En una sola linea se crea el certificado de CA (parecido a la creacion del CSR)
sudo openssl req -new -x509 -days 1000 -key ca.plecaetc.key -subj "/C=HN/ST=Cortes/O=PlecaEtece Blog/CN=ca.plecaetc.local" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:ca.plecaetc.local,DNS:dns.plecaetc.local")) -out ca-plecaetc.crt


Ubuntu
/etc/ssl/openssl.cnf

CentOS
/etc/pki/tls/openssl.cnf

Buscar y descomentar la siguiente linea.

copy_extensions = copy

Y ejecutar los siguientes comandos:

sudo mkdir /etc/pki/CA/newcerts
sudo touch /etc/pki/CA/serial
sudo echo 1000 > /etc/pki/CA/serial
Si se desea crear duplicas de certificados:
sudo echo unique_subject = no >> /etc/pki/CA/index.txt.attr

6.1.2 Firmar (crear) Certificado con CA interno

El archivo CSR que fue creado en el inciso 5.2  debe ser copiado/subido al servidor que contiene el root CA interno (la ubicación puede ser a gusto personal)
Y ejecutar la siguiente linea de comando dónde:

Todo en una sola línea, o separado en lineas con contrapleca 

sudo openssl ca -cert /etc/pki/CA/ca.plecaetc.crt -keyfile /etc/pki/CA/ca.plecaetc.key -in miweb-san.csr -out miweb-san.csr

Queda algo asi:






















6.1.3 Agregar / Habilitar CA Interno en almacen de certificados.
Al ser un CA interno, el certificado raiz debe ingresarse en el almacen de certificados Root de confianza de TODOS LOS EQUIPOS que vayan a crear una conexión segura SSL.


6.1.3.a En Linux

Correr los siguientes comandos para copiar el certificado en formato PEM a las rutas necesarias (según distribución)
**Nota=Las rutas de Origen son relativas a donde se han guardado los certificados.

Ubuntu
sudo cp /etc/apache2/ssl/ca.plecaetc.crt /usr/share/ca-certificates/
sudo update-ca-certificates





CentOS

sudo cp /etc/pki/CA/ca.plecaetc.crt /etc/pki/ca-trust/source/anchors/plecaetc-local-CA.pem
sudo update-ca-trust

6.1.3.b En Windows



6.1.4 Visualización de Certificado

6.1.4.a En Linux
sudo openssl x509 -text -noout -in miweb-cert.crt


















6.1.4.b En Windows




6.2 Método CA Publico
(Let's Encrypt, via ZeroSSL )

La ventaja principal de este metodo es  
Si se dispone de un dominio público, en el que se pueda validar sea de nuestra propiedad, es posible utilizar nuestro CSR con Let's Encrypt , usando como medio ZeroSSL.

Esto está fuera del alcance de este post, pero a continuación una muestra rápida de cómo se hace.

Crear una cuenta en.










































Y basta seguir los pasos, hay mucha documentacion disponible en linea al respecto. Y una vez ya generado el certificado, ejecutar el paso del inciso 4.3 Archivo de Configuración... 


7. Probar Certificado

Basta con probar conectarse desde un navegador nuevo (Chrome se usa en esta prueba)

Probando con la siguiente url (relativa a este post) http://web1.plecaetc.local
Y debería redireccionar al sitio https con el certificado SAN firmado por la entidad certificadora que hicimos.





Algunas Referencias




viernes, 1 de mayo de 2020

CentOS8 | Ubuntu 20.04: Servidor de Correos (mail server)


Usando Sendmail+Dovecot+SquirrelMail y configuracion de Firewall (ufw y firewallD)

Situación Presentada
Siguiendo el post anterior , un amigo me consultó "Cómo puedo tener correo electrónico sin pagar el relajo de plata que cuesta" .
Entonces yo le dije que con Linux se puede hacer eso y mucho más, pero para lo que él necesita le ayudé con un mail server básico.


Y qué hacemos entonces?

Esta entrada se enfocará en la instalación y configuración de un servidor de correos, con sus componentes: MTA, MDA y MUA (el ultimo para acceso web) .
Es altamente recomendable tener un servidor DNS corriendo en la red, ver  post anterior  si no se tiene, pero se puede hacer uno rapido con DNSMasq (no cubierto aqui)
forwarder, ACL y reglas de Firewall que son necesarias para lograrlo.
No se usará DHCP.

Se usará un entorno virtualizado (usar VirtualBox o VMWare player) para hacer la configuración y pruebas.



Componentes del articulo

1. Pre-requisitos para instalación
  1.1 Requisitos CenTOS 8
  1.2 Requisitos Ubuntu 20.04
2. Red y Firewall
  2.1 Configurar Red (CentOS 8 y Ubuntu 20.04)
  2.2 Configurar Firewall
      2.2.1 Ubuntu 20.04
      2.2.2 CentOS 8
3.  Breve explicación de servicios de correo.
4. Instalación de paquetes.
  4.1 Ubuntu 20.04
    4.1.1 Sendmail y Dovecot
    4.1.2 Apache web server
    4.1.3 Squirrelmail
  4.2 CentOS 8
    4.2.1 Sendmail y Dovecot
    4.2.2 Apache web server
    4.2.3 Squirrelmail  
5. Configuración Dovecot y Sendmail.
  5.1 Ubuntu 20.04 y CentOS 8
6. Configuración Squirrelmail y Apache .
  6.1 Ubuntu 20.04 y CentOS 8
7. Pruebas de servicio de correo.
  7.1 Preparación de ambiente
  7.2 Prueba desde Thunderbird
  7.3 Prueba desde Windows Mail
  7.4 Prueba desde Webmail 



1. Pre-requisitos para instalación


•Un PC con CentOS 8 o Ubuntu 20.04, usados en este tutorial.
•Una NIC conectada a la red sin firewall de por medio.
•Una conexión de red a internet (cableada preferiblemente)
•Un servidor DNS corriendo (usar DNSMasq o DNS configurado en post anterior )
•Conocimientos basicos de protocolos de correo electronico.
•Conocimiento basico de shell de Linux

  1.1 Pre-requisitos CenTOS 8

•Actualizar repositorios e instlara el repositorio EPEL tambien.

   sudo yum install epel-release
   sudo yum update

* Nota: Si aparece un error indicando que no puede sincronizar, ejecutar lo siguiente:

   sudo dnf update -y --releasever=8

  1.2 Pre-Requisitos Ubuntu 20.04


Actualizar repositorios:

   sudo apt update

2. Red y Firewall 

. 2.1 Configurar Red (CentOS 8 y Ubuntu 20.04)
   Para configurar la red, ver los pasos detallados en el siguiente post:
    
   https://plecaetece.blogspot.com/2020/04/centos-ubuntu-2004-configuracion-de-red.html

    *NOTA: Colocar sus valores de IP correctos, y el DNS que tengan disponible, en mi ambiente, tomando en cuenta el post DNS mencionado arriba mis detalles de red van así:

             IP:   192.168.116.4
     Subred:   255.255.255.0 (ó /24) 
  Gateway:   192.168.116.2
        DNS:   192.168.116.5 
Hostname:   mail.plecaetc.local 

2.2 Configurar Firewall 

La configuracion que se usará para el servidor mail, será la siguiente.

Permitir Inbound:


tcp/110 -  POP
tcp/143 - IMAP
tcp/993 - IMAP SSL
tcp/25   - SMTP
tcp/587 - SMTP SSL

tcp/80   - HTTP (interfaz de correo web)
tcp/443   - HTTPS (interfaz de correo web)

2.2.1 Ubuntu

En Ubuntu El firewall esta deshabilitado por default. 
Para habilitarlo, y configurarlo a lo minimo, ejecutaremos los siguientes comandos:

Crear las reglas generales con el principio de Denegacion Implicita para prevenir accesos no autorizados.
sudo ufw default allow outgoing
sudo ufw default deny incoming

Agregar excepcion para conectarnos por SSH, desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 22 comment 'aceptar trafico SSH a NUESTRA red'

Agregar excepcion para el servicio web que habrá (HTTP/HTPS), desde nuestra red:
sudo ufw allow 80/tcp comment 'aceptar trafico web HTTP de TODOS'
sudo ufw allow 443/tcp comment 'aceptar trafico web HTTPS de TODOS'

Agregar excepcion para POP, desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 110 comment 'aceptar trafico POP a NUESTRA red'
Agregar excepcion para IMAP , desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 143 comment 'aceptar trafico IMAP a NUESTRA red'
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 993 comment 'aceptar trafico IMAP SSL a NUESTRA red'
Agregar excepcion para SMTP, desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 25 comment 'aceptar trafico SMTP a NUESTRA red'
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 587 comment 'aceptar trafico SMTP SSL a NUESTRA red'

Se habilita el firewall 
sudo ufw enable
Se revisa el estado 
sudo ufw status








--

2.2.2 CentOS

Se ejecutará lo mismo que en el inciso anterior para Ubuntu, pero con la sintaxis del firewall para CentOS:

Agregar nuestra red actual a la zona:


sudo firewall-cmd --zone=public --permanent --add-source=192.168.116.0/24
Agregar reglas con excepciones:
sudo firewall-cmd --zone=public --permanent --add-port=22/tcp
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=110/tcp
sudo firewall-cmd --zone=public --permanent --add-port=143/tcpsudo firewall-cmd --zone=public --permanent --add-port=25/tcp
sudo firewall-cmd --reload

Se confirman los cambios:
sudo firewall-cmd --zone=public --list-all
















3. Breve explicación de los servicios de correo.

Los servidores de correo tienen varios componentes o agentes corriendo adentro para poder llevar a cabo las operaciones de envio, almacenamiento, ruteo y presentación de los mismos.

Los componentes son los siguientes:

Mail Transfer Agent (MTA). 
Aceptar correos de otros MTA (otros servidores) y usuarios de correo. Es el que utiliza el protocolo SMTP 
Algunos ejemplos son sendmail, Postfix, y el MTA de Microsoft Exchange.

Mail Delivery Agent(MDA).
Acepta correos de entrada de un MTA y se encarga de entregarlo al usuario correcto. Es el que utiliza protocolo IMAP o POP
Ejemplos: Courier, Exchange MDA, Dovecot.

LDA – Local Delivery Agent.
Es basicamente lo mismo que el MDA, pero lo hace localmente. 

procmail es el comunmente utilizado en sistemas de Linux.

Mail User Agent (MUA)
Se utiliza por los usuarios para crear, descargar y leer correos, subirlos a un MTA. Conocidos tambien como clientes de correo
Ejemplos: Outlook, WindowsLive Mail, Mozilla Thunderbird, Squirrelmail.

Interfaz web Squirrelmail.



Esquema de interconexión de componentes


imagen cortesía https://es.ccm.net



4. Instalación de paquetes.

4.1 Ubuntu 20.04

4.1.1 Sendmail y Dovecot

sudo apt install dovecot-core dovecot-pop3d dovecot-imapd sendmail sendmail-cf

**Nota: habrá algo de log post instalación, pero no haremos nada más, luego se configura.

4.1.2 Apache web server

sudo apt-get install apache2 php libapache2-mod-php php-cli php-common 

4.1.3 Squirrelmail

Colocarse en un folder neutral para descargarlo
cd /tmp

Descargar la versión más nueva de squirrelmail y el unzip.
wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.22/squirrelmail-webmail-1.4.22.zip

sudo apt install unzip -y

Instalar Squirrel Mail en webserver (que viene siendo descomprimir el website, y moverlo a donde estan los sitios web de nuestro servidor web)

sudo unzip squirrelmail-webmail-1.4.22.zip 

sudo mv squirrelmail-webmail-1.4.22/ /var/www/html/webmail
sudo chown -R www-data:www-data /var/www/html/webmail


NO INICIAR NINGUN SERVICIO AÚN

4.2 CentOS 8

4.2.1 Sendmail y Dovecot

sudo yum install sendmail-cf sendmail dovecot 

**Nota: habrá algo de log post instalación, pero no haremos nada más, luego se configura.

4.2.2 Apache web server

sudo yum install httpd php php-cli php-common

4.2.3 Squirrelmail  

cd /tmp

wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.22/squirrelmail-webmail-1.4.22.zip

sudo unzip squirrelmail-webmail-1.4.22.zip 
sudo mv squirrelmail-webmail-1.4.22/ /var/www/html/webmail
sudo chown -R apache:apache /var/www/html/webmail

NO INICIAR NINGUN SERVICIO AÚN


Listo, ya se han descargado e instalado todos lo spaquetes necesarios en ambas distros.

5. Configuración Dovecot y Sendmail.

5.1 Ubuntu 20.04 y CentOS 8

La configuración es virtualmente la misma, con algunas variantes que serán puestas en rojo.

Los protocolos imap y pop3 se definen en el archivo de configuracion, lo abrimos con (vim o nano):

sudo nano /etc/dovecot/dovecot.conf

---- diferencias en configuracion

Ubuntu
En la entrada siguiente, es donde se ubica el archivo donde especifican los protcolos:






Ese archivo mencionado contiene la siguiente información
protocols = $protocols imap
protocols = $protocols pop3

CentOS 
En la entrada siguiente, es donde se especifican los protcolos:






----

En el siguiente file está la configuración de los mailboxes (tambien ya están configurados, no es necesario editarlo.) 

sudo nano /etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:~/mail:INBOX=/var/mail/%u

En el siguiente file está la configuración autenticación:

sudo nano /etc/dovecot/conf.d/10-auth.conf


disable_plaintext_auth = yes


Crear la carpeta y archivo de INBOX con el que trabajará Dovecot:

sudo mkdir /etc/skel/mail/.imap/
sudo touch /etc/skel/mail/.imap/INBOX

Abrir archivo de configuración para Sendmail:

sudo vim /etc/mail/sendmail.mc

En la linea siguiente, remover la parte "Addr=127.0.0.1"

---- diferencias en configuracion

Ubuntu

DAEMON_OPTIONS(`Family=inet,Name=MTA-v4,Port=smtp,Addr=127.0.0.1')dnl

Y quedará así:


CentOS

DAEMON_OPTIONS(`Port=smtp,Name=MTA,Addr=127.0.0.1')dnl

Y quedará así:





---- 

Efectuar los cambios.

sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

6. Configuración Squirrelmail y Apache .

6.1 Ubuntu 20.04 y CentOS 8

Agregar a los siguientes archivos, el nombre de nuestro dominio, en mi caso es 
plecaetc.local  , recordar que los correos iran por ejemplo (jfilomeno@plecaetc.local)


sudo vim /etc/mail/local-host-names

plecaetc.local
mail.plecaetc.local





Agregar al final del archivo "/etc/mail/access" ....
sudo vim /etc/mail/access

... la siguiente linea :

Connect:plecaetc.local                      RELAY







Copiar el siguiente archivo de configuracion para SquirrelMail

cd /var/www/html/webmail/config
sudo cp config_default.php config.php

Editarlo a nuestra conveniencia (en azul los valores que se han editaro)

sudo vim config.php

$org_name = "PlecaEtc";
$domain = 'plecaetc.local'; 
$data_dir = '/var/www/html/webmail/data/';
$attachment_dir = '/var/www/html/webmail/attach/';

Crear el directorio para los adjuntos, y darle los permisos. 
mkdir /var/www/html/webmail/attach/

chown www-data:www-data /var/www/html/webmail/attach/
*Nota:Para CentOS en vez de www-data  es apache.

Se agrega la interfaz web de correo electronico, al Web Servercorriendo.Esto se hace creando un nuevo archivo de configuración y colocando los siguientes valores:



    DocumentRoot "/var/www/html/webmail"
    ServerName mail.plecaetc.local


        Options Indexes FollowSymlinks
        RewriteEngine On
        AllowOverride All
        DirectoryIndex index.php
        Order allow,deny
        Allow from 192.168.116.0/24


**Nota: en el archivo se define que escuche en la IP 116.4 , por HTTP (tcp 80), y que solo responda cuando sea llamado desde "mail.plecaetc.local" en el navegador.


---- cambios en configuracion
Ubuntu

Agregar la información anterior del sitio web, con el siguiente comando(vim o nano):
nano /etc/apache2/sites-available/webmail.conf

Habilitar los nuevos cambios (y un módulo que necesitaremos - mod_rewrite ) y reiniciar el servicio

sudo a2enmod rewrite
sudo a2ensite webmail.conf
sudo systemctl restart apache2

CentOS

Agregar la información anterior del sitio web, con el siguiente comando(vim o nano):

vim /etc/httpd/conf/httpd.conf

Reiniciar los servicios solamente, ya que no son necesarios los extra pasos de Ubuntu.
sudo systemctl restart httpd

---- 

7. Pruebas de servicio de correo.

7.1 Preparación de ambiente
Se levantan y habilitan todos los servicios configurados:

sudo systemctl enable sendmail
sudo systemctl start sendmail

sudo systemctl enable dovecot
sudo systemctl start dovecot

sudo systemctl enable httpd
sudo systemctl start httpd

Creamos un usuario de pruebas y se llenan todos los valores que solicite el shell:

sudo adduser jfilomeno























7.2 Prueba desde Thunderbird


Se agrega la cuenta y se acepta la excepción del certificado SSL (por el IMAP 4) y se prueba la funcionalidad.









7.3 Prueba desde Windows Mail
Se agrega la cuenta con los mismos parametros del inciso anterior y se prueba la funcionalidad




7.4 Prueba desde Webmail 
Para el webmail, se puede acceder desde cualquier PC que esté en la red local, configurada correctamente (DNS apuntando al que está configurado correctamente).