Messager de messagerie instantanée personnelle avec cryptage de bout en bout pour les initiés uniquement

Dans cet article, je vous ai expliqué comment créer votre propre messager sécurisé juste pour votre lieu de rencontre paranoïaque.



Il existe maintenant de nombreux messagers de messagerie instantanée avec un cryptage de bout en bout, mais il existe beaucoup moins d'options que vous pouvez déployer rapidement sur votre serveur.







En étudiant les options, mes yeux sont tombés sur Delta Chat, qui était déjà mentionné sur Habré - un messager sans infrastructure de serveur centralisé, utilisant des serveurs de messagerie pour livrer des messages, ce qui vous permet de le déployer, par exemple, sur votre serveur domestique et de communiquer à partir d'appareils, y compris non avec accès Internet.



Parmi les avantages de cette approche figurent:



  • Vous gérez vous-même vos informations, y compris les clés de cryptage.
  • Vous ne donnez votre carnet d'adresses à personne.
  • Il n'est pas nécessaire d'utiliser un numéro de téléphone pour s'inscrire.
  • Clients pour tous les systèmes courants: Windows, Linux, Android, MacOS, iPhone.
  • Cryptage STARTTLS / SSL supplémentaire pour la transmission des messages fourni par le serveur de messagerie.
  • Possibilité de configurer la suppression des anciens messages de l'appareil (messages de disparition).
  • La possibilité de configurer la suppression des messages du serveur à la réception.
  • Livraison rapide grâce à IMAP push.
  • Groupes de chats protégés.
  • Prise en charge du transfert de fichiers, photos et vidéos.
  • Le serveur et le client sont à la fois open source et totalement gratuits.


Inconvénients possibles:

  • Il n'existe aucun moyen de créer des conférences audio et vidéo natives.
  • La nécessité d'exporter / d'importer des clés de chiffrement pour configurer un compte sur plusieurs appareils.


Fait intéressant: Roskomnadzor exigeait déjà que les développeurs de Delta Chat fournissent un accès aux données des utilisateurs, aux clés de cryptage et s'inscrivent dans le registre national des fournisseurs, auquel Delta Chat a refusé, car n'ont pas leurs propres serveurs et n'ont pas accès aux clés de chiffrement.



Chiffrement de bout en bout



Delta Chat peut utiliser une connexion StartTLS ou SSL au serveur pour se connecter au serveur, les messages par défaut seront cryptés selon la norme Autocrypt Level 1 , après l'échange des premiers messages (ils sont transmis sous forme non cryptée). Ainsi, si la communication a lieu entre les utilisateurs d'un serveur, les informations ne seront pas transmises à d'autres serveurs, seuls notre serveur et les appareils des utilisateurs seront occupés à la transmission des messages.



Réglage du serveur



La configuration d'un serveur pour Delta Chat revient à installer Postfix + Dovecot avec StartTLS / SSL configuré et à configurer les enregistrements de domaine.

J'utiliserai CentOS 8 pour configurer le serveur, il peut y avoir des différences mineures pour d'autres distributions. Nous sélectionnons les paramètres de serveur appropriés pour notre tâche.







Dans DNS, j'ai créé deux enregistrements: le domaine de troisième niveau sera à la fois le domaine de messagerie et le nom du serveur de messagerie:



secureim.example.com A <ip>
secureim MX secureim.example.com
      
      





Définissons hostname



et installons postfix, dovecot et nginx (nginx - pour obtenir, chiffrons les certificats, wget - pour installer certbot-auto, nano - éditeur):



hostnamectl set-hostname secureim.example.com
dnf install postfix dovecot nginx wget nano -y
      
      





Permettons à Postfix de recevoir du courrier de l'extérieur et de configurer le nom d'hôte, le domaine et l'origine du serveur, puisque le domaine de messagerie et l'adresse du serveur sont les mêmes, le domaine sera le même partout:



postconf -e "inet_interfaces = all"
postconf -e "myhostname = secureim.example.com"
postconf -e "mydomain = secureim.example.com"
postconf -e "myorigin = secureim.example.com"
      
      





Pour que Delta Chat soit disponible pour une connexion à partir d'Internet, vous devez ouvrir les ports 80, 143, 443, 465, 587, 993. En outre, ouvrez les ports 80, 443 pour crypter les certificats et les mettre à jour à l'avenir. Si vous prévoyez de recevoir des lettres d'autres serveurs de messagerie, vous devrez également ouvrir le port 25 (dans mon cas, je ne prévois pas de me connecter en utilisant d'autres serveurs, donc je ne spécifie pas le 25e port). Et vous devrez peut-être ajouter la redirection de port 80, 143, 443, 465, 587, 993 sur le routeur si le serveur doit être utilisé sur un réseau local.



Ouvrons les ports 80, 143, 443, 465, 587, 993 dans le pare-feu:



firewall-cmd --permanent --add-service={http,https,smtps,smtp-submission,imap,imaps}
systemctl reload firewalld
      
      





Créons les paramètres de site pour notre nom de domaine afin de chiffrer les certificats en utilisant 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/;
      }
}
      
      





Activons et exécutons nginx:



systemctl enable nginx
systemctl start nginx
      
      





Installez 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
      
      





Générons des certificats pour le site (à l'avenir, nous les utiliserons pour le cryptage TLS de la connexion au serveur):



certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@example.com -d secureim.example.com
      
      





Les certificats seront créés et leur emplacement sera également affiché dans la console:



#   /etc/letsencrypt/live/secureim.example.com/fullchain.pem
#   /etc/letsencrypt/live/secureim.example.com/privkey.pem
      
      





Corrigez le fichier de configuration de Postfix pour permettre la réception de messages sur les ports 465 et 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
      
      





Exécutons les commandes pour spécifier l'emplacement du certificat TLS et de la clé privée du serveur:



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 nécessaire, nous pouvons activer la journalisation des connexions TLS:



postconf "smtpd_tls_loglevel = 1"
postconf "smtp_tls_loglevel = 1"
      
      





Ajoutez l'exigence d'utiliser des protocoles non inférieurs à TLS 1.2 à la fin du fichier de configuration de Postfix:



nano /etc/postfix/main.cf
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_protocols = >=TLSv1.2
      
      





# Activez et exécutez Postfix:



systemctl start postfix
systemctl enable postfix
      
      





Installez, activez et exécutez Dovecot:



dnf install dovecot -y
systemctl start dovecot
systemctl enable dovecot
      
      





Modifiez le fichier de configuration Dovecot pour activer le protocole imap:



nano /etc/dovecot/dovecot.conf
protocols = imap
      
      





Configurons le stockage des e-mails pour que les messages soient enregistrés dans les dossiers utilisateur:



nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
mail_privileged_group = mail
      
      





Ajoutez Dovecot au groupe de messagerie afin que Dovecot puisse lire les messages entrants:



gpasswd -a dovecot mail
      
      





Refuser l'autorisation sans chiffrement TLS:



nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
      
      





Ajouter une substitution automatique de domaine lors de l'autorisation (uniquement par nom d'utilisateur):



auth_username_format = %n
      
      





Modifions l'emplacement du certificat, la clé, l'emplacement du fichier de clé Diffie-Hellman, la version minimale de TLS 1.2 et la préférence pour le choix des protocoles de chiffrement du serveur par rapport au client:



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
      
      





Générons une clé Diffie-Hellman, la génération de clé peut prendre beaucoup de temps:



openssl dhparam -out /etc/dovecot/dh.pem 4096
      
      





Modifions la section d'authentification du service pour que Postfix puisse se connecter au serveur d'autorisation Dovecot:



nano /etc/dovecot/conf.d/10-master.conf
service auth {
    unix_listener /var/spool/postfix/private/auth {
      mode = 0600
      user = postfix
      group = postfix
    }
}
      
      





Activons la création automatique des dossiers de messagerie système (au cas où nous utiliserions également le serveur pour le courrier ordinaire) en ajoutant la ligne auto = create dans la section des dossiers de courrier:



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
  }
      
      





Configurons Dovecot pour livrer les messages au stockage configuré en ajoutant le paramètre lmtp:



nano /etc/dovecot/dovecot.conf
protocols = imap lmtp
      
      





Configurons le service LMTP comme suit:



nano /etc/dovecot/conf.d/10-master.conf
service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
  }
}
      
      





Ajoutez les paramètres suivants à la fin du fichier pour indiquer à Postfix de livrer le courrier au stockage local via le service LMTP Dovecot. Désactivons également SMTPUTF8, car Dovecot LMTP ne prend pas en charge cette extension:



nano /etc/postfix/main.cf
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no
      
      





Créons des utilisateurs qui utiliseront le serveur en créant une entrée correspondante dans le système et en lui donnant un mot de passe qui sera utilisé pour l'autorisation via smtps et imaps:



adduser user1
passwd user1
      
      





# Redémarrez Dovecot et Postfix:



systemctl restart dovecot
systemctl restart postfix
      
      





Ajoutez une tâche à / etc / crontab pour renouveler automatiquement les certificats:



nano /etc/crontab
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
      
      





À ce stade, le serveur doit fonctionner comme un serveur de messagerie, c'est-à-dire vous pouvez vous connecter avec un client de messagerie et essayer d'envoyer et de recevoir des lettres vers d'autres boîtes aux lettres de ce serveur, ou si vous avez ouvert le port 25 ci-dessus, puis vers d'autres serveurs de messagerie.



Configurons maintenant le client Delta Chat sur un PC et un smartphone Android.







Pour se connecter, il suffit de saisir l'adresse mail et le mot de passe créés précédemment sur le serveur, Delta Chat déterminera quels ports peuvent être utilisés, après quoi il sera possible d'ajouter un nouveau contact, également à l'adresse mail, en utilisant une adresse mail valide.







Les premiers messages seront envoyés en clair, à ce stade l'échange de clés est en cours. De plus, les messages seront cryptés en plus du TLS utilisé pour la transmission de données, le cryptage de bout en bout Autocrypt Level 1.



Il est également possible de créer une discussion de groupe vérifiée - où tous les messages sont cryptés par cryptage de bout en bout, et les participants peuvent rejoindre en scannant l'invitation avec un code QR. De cette manière, tous les participants sont reliés les uns aux autres par une chaîne d'invitations qui garantissent la cohérence cryptographique contre les attaques actives du réseau ou les attaques des fournisseurs.



L'un des points les plus intéressants que je voulais vérifier était de voir à quoi ressemble le message dans le magasin du serveur. Pour ce faire, j'ai envoyé un message à un compte inactif - dans ce cas, le message attendra son destinataire sur le serveur, et nous, ayant accès au serveur, pourrons le voir:

Contenu du message
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--




Comme vous pouvez le voir, les lettres sont stockées sur le serveur sous forme cryptée, et si le serveur est saisi par des parties intéressées, les messages ne seront pas menacés.

Pour une plus grande fiabilité, vous pouvez utiliser le chiffrement complet du disque du serveur et de l'appareil sur lequel le client s'exécute, ainsi que des clés pour vous connecter au serveur via ssh et utiliser des mots de passe forts et complexes pour les comptes de messagerie.



Conclusion



Delta Chat est une alternative intéressante pour un messager de messagerie instantanée auto-hébergé, qui vous permet d'échanger des messages en utilisant les protocoles de messagerie existants (ce qui à l'avenir vous permet de ne pas vous soucier du blocage), et une haute résistance à l'interception des messages, l'absence d'un serveur central et la possibilité de se déployer sur votre serveur, vous permet de ne pas craint que vos données ne tombent entre de mauvaises mains.










All Articles