Mensajería de mensajería instantánea personal con cifrado de extremo a extremo solo para usuarios internos

En este artículo, te dije cómo crear tu propio mensajero seguro solo para tu lugar de reunión paranoico.



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.










All Articles