Ahora hay muchos mensajeros de mensajería instantánea con cifrado de extremo a extremo, pero hay muchas menos opciones que puede implementar rápidamente en su servidor.
Mientras estudiaba las opciones, mis ojos se posaron en Delta Chat, que ya se mencionó en Habré: un mensajero sin una infraestructura de servidor centralizada, que usa servidores de correo para entregar mensajes, lo que le permite implementarlo, por ejemplo, en su servidor doméstico y comunicarse desde dispositivos, incluidos no con acceso a Internet.
Entre las ventajas de este enfoque se encuentran:
- Usted mismo administra su información, incluidas las claves de cifrado.
- No le das tu libreta de direcciones a nadie.
- No es necesario utilizar un número de teléfono para registrarse.
- Clientes para todos los sistemas populares: Windows, Linux, Android, MacOS, iPhone.
- Cifrado STARTTLS / SSL adicional para la transmisión de mensajes proporcionado por el servidor de correo.
- Posibilidad de configurar la eliminación de mensajes antiguos del dispositivo (mensajes que desaparecen).
- La capacidad de configurar la eliminación de mensajes del servidor al recibirlos.
- Entrega rápida gracias a IMAP push.
- Grupos de chat protegidos.
- Soporte para transferir archivos, fotos y videos.
- El servidor y el cliente son de código abierto y completamente gratuitos.
Posibles desventajas:
- No hay forma de crear conferencias de audio y video nativas.
- La necesidad de exportar / importar claves de cifrado para configurar una cuenta en varios dispositivos.
Dato interesante: Roskomnadzor ya exigió que los desarrolladores de Delta Chat brinden acceso a los datos del usuario, claves de cifrado y se registren en el registro estatal de proveedores, a lo que Delta Chat se negó, porque no tienen sus propios servidores y no tienen acceso a claves de cifrado.
Encriptado de fin a fin
Delta Chat puede usar la conexión StartTLS o SSL al servidor para conectarse al servidor, los mensajes por defecto se cifrarán de acuerdo con el estándar Autocrypt Level 1 , después de que se intercambien los primeros mensajes (se transmiten en forma no cifrada). Por lo tanto, si la comunicación es entre usuarios de un servidor, la información no se transmitirá a otros servidores, solo nuestro servidor y los dispositivos de los usuarios estarán ocupados en la transmisión de mensajes.
Ajuste del servidor
Configurar un servidor para Delta Chat se reduce a instalar Postfix + Dovecot con StartTLS / SSL configurado y configurar registros de dominio.
Para configurar el servidor, usaré CentOS 8, para otras distribuciones puede haber pequeñas diferencias. Seleccionamos los parámetros de servidor adecuados para nuestra tarea.
En DNS, creé dos registros: el dominio de tercer nivel será tanto el dominio de correo como el nombre del servidor de correo:
secureim.example.com A <ip> secureim MX secureim.example.com
Deje
hostname
conjunto 's e instalar postfix, palomar y Nginx (nginx - para obtener los certificados de cifrar vamos, wget - para instalar certbot automático, con nano - editor):
hostnamectl set-hostname secureim.example.com
dnf install postfix dovecot nginx wget nano -y
Permitamos que Postfix reciba correo de fuera y configure el nombre de host, dominio y origen del servidor, ya que el dominio de correo y la dirección del servidor son los mismos, el dominio será el mismo en todas partes:
postconf -e "inet_interfaces = all"
postconf -e "myhostname = secureim.example.com"
postconf -e "mydomain = secureim.example.com"
postconf -e "myorigin = secureim.example.com"
Para que Delta Chat esté disponible para la conexión desde Internet, debe abrir los puertos 80, 143, 443, 465, 587, 993. Además, abra los puertos 80, 443 para cifrar los certificados y actualizarlos en el futuro. Si planeas recibir cartas de otros servidores de correo, también necesitarás abrir el puerto 25 (en mi caso, no planeo conectarme usando otros servidores, así que no especifico el puerto 25). Y es posible que deba agregar el reenvío de puertos 80, 143, 443, 465, 587, 993 en el enrutador si el servidor se va a utilizar en una red local.
Abramos los puertos 80, 143, 443, 465, 587, 993 en el firewall:
firewall-cmd --permanent --add-service={http,https,smtps,smtp-submission,imap,imaps} systemctl reload firewalld
Creemos la configuración del sitio para nuestro nombre de dominio para poder cifrar certificados usando certbot-auto
nano /etc/nginx/conf.d/secureim.example.com.conf server { listen 80; listen [::]:80; server_name secureim.example.com; root /usr/share/nginx/html/; } }
Habilitemos y ejecutemos nginx:
systemctl enable nginx
systemctl start nginx
Instale certbot-auto:
cd ~
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
yes | certbot-auto --install-only
Generemos certificados para el sitio (en el futuro los usaremos para el cifrado TLS de la conexión al servidor):
certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@example.com -d secureim.example.com
Los certificados se crearán y su ubicación también se mostrará en la consola:
# /etc/letsencrypt/live/secureim.example.com/fullchain.pem
# /etc/letsencrypt/live/secureim.example.com/privkey.pem
Corrija el archivo de configuración de Postfix para permitir recibir mensajes en los puertos 465 y 587:
nano /etc/postfix/master.cf submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
Ejecutemos los comandos para especificar la ubicación del certificado TLS y la clave privada del servidor:
postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/secureim.example.com/fullchain.pem"
postconf "smtpd_tls_key_file = /etc/letsencrypt/live/secureim.example.com/privkey.pem"
Si es necesario, podemos habilitar el registro de conexiones TLS:
postconf "smtpd_tls_loglevel = 1"
postconf "smtp_tls_loglevel = 1"
Agregue el requisito de utilizar protocolos no inferiores a TLS 1.2 al final del archivo de configuración de Postfix:
nano /etc/postfix/main.cf smtp_tls_mandatory_protocols = >=TLSv1.2 smtp_tls_protocols = >=TLSv1.2
# Habilitar y ejecutar Postfix:
systemctl start postfix
systemctl enable postfix
Instale, habilite y ejecute Dovecot:
dnf install dovecot -y
systemctl start dovecot
systemctl enable dovecot
Modifique el archivo de configuración de Dovecot para habilitar el protocolo imap:
nano /etc/dovecot/dovecot.conf protocols = imap
Configuremos el almacenamiento de correo para que los mensajes se guarden en carpetas de usuario:
nano /etc/dovecot/conf.d/10-mail.conf mail_location = maildir:~/Maildir mail_privileged_group = mail
Agregue Dovecot al grupo de correo para que Dovecot pueda leer los mensajes entrantes:
gpasswd -a dovecot mail
Denegar autorización sin cifrado TLS:
nano /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = yes
Agregue la sustitución automática de dominio durante la autorización (solo por nombre de usuario):
auth_username_format = %n
Cambiemos la ubicación del certificado, la clave, la ubicación del archivo de claves Diffie-Hellman, la versión mínima de TLS 1.2 y la preferencia para elegir los protocolos de cifrado del servidor sobre el cliente:
nano /etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/letsencrypt/live/secureim.example.com/fullchain.pem ssl_key = </etc/letsencrypt/live/secureim.example.com/privkey.pem ssl_dh = </etc/dovecot/dh.pem ssl_min_protocol = TLSv1.2 ssl_prefer_server_ciphers = yes
Generemos una clave Diffie-Hellman, la generación de claves puede llevar mucho tiempo:
openssl dhparam -out /etc/dovecot/dh.pem 4096
Cambiemos la sección de autenticación del servicio para que Postfix pueda conectarse al servidor de autorización de Dovecot:
nano /etc/dovecot/conf.d/10-master.conf service auth { unix_listener /var/spool/postfix/private/auth { mode = 0600 user = postfix group = postfix } }
Habilite la creación automática de carpetas de correo del sistema (en caso de que usemos el servidor también para correo normal) agregando la línea auto = crear en la sección de carpetas de correo:
nano /etc/dovecot/conf.d/15-mailboxes.conf
mailbox Drafts {
auto = create
special_use = \Drafts
}
mailbox Junk {
auto = create
special_use = \Junk
}
mailbox Trash {
auto = create
special_use = \Trash
}
mailbox Sent {
auto = create
special_use = \Sent
}
mailbox "Sent Messages" {
auto = create
special_use = \Sent
}
Configuremos Dovecot para enviar mensajes al almacenamiento configurado agregando el parámetro lmtp:
nano /etc/dovecot/dovecot.conf protocols = imap lmtp
Configuremos el servicio LMTP de la siguiente manera:
nano /etc/dovecot/conf.d/10-master.conf service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } }
Agregue la siguiente configuración al final del archivo para decirle a Postfix que entregue el correo al almacenamiento local a través del servicio Dovecot LMTP. También deshabilite SMTPUTF8, ya que Dovecot LMTP no admite esta extensión:
nano /etc/postfix/main.cf mailbox_transport = lmtp:unix:private/dovecot-lmtp smtputf8_enable = no
Creemos usuarios que usarán el servidor creando una entrada correspondiente en el sistema y dándole una contraseña que se usará para la autorización a través de smtps e imaps:
adduser user1 passwd user1
# Reinicie Dovecot y Postfix:
systemctl restart dovecot systemctl restart postfix
Agregue una tarea a / etc / crontab para renovar los certificados automáticamente:
nano /etc/crontab
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
En esta etapa, el servidor debería funcionar como un servidor de correo, es decir, puede conectarse con un cliente de correo e intentar enviar y recibir cartas a otros buzones de este servidor, o si ha abierto el puerto 25 anterior, a otros servidores de correo.
Ahora configuremos el cliente Delta Chat en una PC y un teléfono inteligente Android.
Para conectarse, basta con ingresar la dirección de correo y la contraseña creada anteriormente en el servidor, Delta Chat determinará qué puertos se pueden usar, luego de lo cual será posible agregar un nuevo contacto, también por dirección de correo electrónico, utilizando una dirección de correo válida.
Los primeros mensajes se enviarán sin cifrar, en esta etapa el intercambio de claves está en curso. Además, los mensajes se cifrarán además del TLS utilizado para la transmisión de datos, cifrado de extremo a extremo Autocrypt Nivel 1.
También es posible crear un chat grupal verificado, donde todos los mensajes son cifrados de extremo a extremo, y los participantes pueden unirse escaneando la invitación con un código QR. De esta forma, todos los participantes están vinculados entre sí mediante una cadena de invitaciones que garantizan la coherencia criptográfica frente a ataques de red activos o ataques de proveedores.
Una de las cosas más interesantes que quería comprobar era ver cómo se ve el mensaje en la tienda del servidor. Para hacer esto, envié un mensaje a una cuenta inactiva; en este caso, el mensaje esperará a su destinatario en el servidor y nosotros, teniendo acceso al servidor, podremos verlo:
Contenido del mensaje
Return-Path: <user2@secureim.example.com>
Delivered-To: user1@secureim.example.com
Received: from secureim.example.com
by secureim.example.com with LMTP
id g/geNIUWzl+yBQAADOhLJw
(envelope-from <user2@secureim.example.com>)
for <user1@secureim.example.com>; Mon, 07 Dec 2020 14:48:21 +0300
Received: from [127.0.0.1] (unknown [192.87.129.58])
by secureim.example.com (Postfix) with ESMTPSA id AA72A3193E11
for <user1@secureim.example.com>; Mon, 7 Dec 2020 11:48:21 +0000 (UTC)
MIME-Version: 1.0
References: <Mr.DoII3_YQLLv.2m_e6hIHc0e@secureim.example.com>
<Mr.YwnXrWVn2Ai.FAQ-abJC0kt@secureim.example.com>
In-Reply-To: <Mr.YwnXrWVn2Ai.FAQ-abJC0kt@secureim.example.com>
Date: Mon, 07 Dec 2020 11:48:20 +0000
Chat-Version: 1.0
Autocrypt: addr=user2@secureim.example.com; prefer-encrypt=mutual;
keydata=xjMEX83vexYJKwYBBAHaRw8BAQdAYgkiTiHDlJtzQqLCFxiVpma/X5OtALu8kJmjeTG3yo
7NIDx1c2VyMkBzZWN1cmVpbS5zYW1vaWxvdi5vbmxpbmU+wosEEBYIADMCGQEFAl/N73sCGwMECwkI
BwYVCAkKCwIDFgIBFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXgLNQEA17LrpEA2vF
1FMyN0ah5tpM6w/6iKoB+FVUJFAUALxk4A/RpQ/o6D7CuacuFPifVZgz7DOSQElPAMP4AHDyzcRxwJ
zjgEX83vexIKKwYBBAGXVQEFAQEHQJ7AQXbN5K6EUuwUbaLtFpEOdjd5E8hozmHkeeDJ0HcbAwEIB8
J4BBgWCAAgBQJfze97AhsMFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXhYJgEA+RUa
RlnJjv86yVJthgv7w9LajPAgUGCVhbjFmccPQ4gA/iiX+nk+TrS2q2oD5vuyD3FLgpja1dGmqECYg1
ekyogL
Message-ID: <Mr.qg4Mj0zMVZw.lT9nBnZMoKs@secureim.example.com>
To: <user1@secureim.example.com>
From: <user2@secureim.example.com>
Subject:…
Content-Type: multipart/encrypted; protocol=«application/pgp-encrypted»;
boundary=«OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP»
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/pgp-encrypted
Content-Description: PGP/MIME version identification
Version: 1
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/octet-stream; name=«encrypted.asc»
Content-Description: OpenPGP encrypted message
Content-Disposition: inline; filename=«encrypted.asc»;
-----BEGIN PGP MESSAGE-----
wU4DKm2PBWHuz1cSAQdA4krEbgJjac78SUKlWKfVyfWt2drZf41dIjTH01J52HIg
aY/ZzCn/ch8LNGv3vuJbJS8RLHK7XyxZ4Z1STAtTDQPBTgNyNpRoJqRwSxIBB0AC
OVrbhsjNPbpojrm/zGWkE5berNF7sNnGQpHolcd+WyCdpqQAk3CaiQjxsm7jdO0A
gMtmXABw/TWcpTU/qOfW/9LBVwFZ/RPCKxCENfC0wau4TI+PMKrF0HODyWfBkEuw
e3WlQpN/t0eSUPKMiMhm7QM0Ffs52fPz0G6dfVJ2M6ucRRyU4Gpz+ZdlLeTLe3g2
PkKbb6xb9AQjdj/YtARCmhCNI48sv7dgU1ivh15r37FWLQvWgkY93L3XbiEaN/X9
EWBQxKql/sWP01Kf67PzbtL5uAHl8VnwInCIfezQsiAsPS2qiCb1sN3yBcNlRwsR
yTs2CPJTIi7xTSpM1S/ZHM5XXGnOmj6wDw69MHaHh9c9w3Yvv7q1rCMvudfm+OyS
/ai4GWyVJfM848kKWTCnalHdR4rZ3mubsqfuCOwjnZvodSlJFts9j5RUT87+j1DM
mQa4tEW8U5MxxoirFfbBnFXGUcU/3nicXI5Yy6wPP8ulBXopmt5vHsd68635KVRJ
2GMy7sMHcjyzujNCAmegIQgKqTLO5NUOtxW7v1OXL23pKx32OGcy8PtEJp7FBQYm
bUNAaz+rkmC971S2FOU0ZGV8LNp8ULioAbL629/JpPHhBOBJCsVnsXDIh6UBPbuM
06dU7VP6l8PNM87X/X1E3m2R1BCNkZghStQrt16fEoA+jm9F6PNtcap2S5rP9llO
klo/ojeciqWl0QoNaJMlMru70TT8a9sf6jYzp3Cf7qFHntNFYG1EcEy9YqaXNS7o
8UOVMfZuRIgNqI9j4g8wKf57/GIjtXCQn/c=
=bzUz
-----END PGP MESSAGE-----
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP--
Como puede ver, las cartas se almacenan en el servidor en forma encriptada, y si el servidor es incautado por partes interesadas, los mensajes no estarán en riesgo.
Para una mayor confiabilidad, puede usar el cifrado de disco completo del servidor y el dispositivo en el que se ejecuta el cliente, así como usar claves para conectarse al servidor a través de ssh y usar contraseñas seguras y complejas para las cuentas de correo.
Conclusión
Delta Chat es una alternativa interesante para un mensajero de mensajería instantánea autohospedado, que le permite intercambiar mensajes utilizando los protocolos de correo existentes (que en el futuro le permite no preocuparse por el bloqueo), y la alta resistencia a la interceptación de mensajes, la ausencia de un servidor central y la capacidad de implementar en su servidor, le permite no le preocupa que sus datos caigan en las manos equivocadas.