Existem agora muitos mensageiros de IM com criptografia de ponta a ponta, mas existem muito menos opções que você pode implementar rapidamente em seu servidor.
Enquanto estudava as opções, meus olhos caíram no Delta Chat, que já foi citado no Habré - um messenger sem infraestrutura de servidor centralizado, que usa servidores de e-mail para entregar mensagens, que permite implantá-lo, por exemplo, em seu servidor doméstico e se comunicar de dispositivos, inclusive com acesso à Internet.
Entre as vantagens desta abordagem estão:
- Você mesmo gerencia suas informações, incluindo chaves de criptografia.
- Você não dá sua agenda para ninguém.
- Não há necessidade de usar um número de telefone para se registrar.
- Clientes para todos os sistemas populares: Windows, Linux, Android, MacOS, iPhone.
- Criptografia STARTTLS / SSL adicional para transmissão de mensagens fornecida pelo servidor de e-mail.
- Capacidade de configurar a exclusão de mensagens antigas do dispositivo (mensagens que desaparecem).
- A capacidade de configurar a exclusão de mensagens do servidor no recebimento.
- Entrega rápida graças ao IMAP push.
- Bate-papos protegidos em grupo.
- Suporte para transferência de arquivos, fotos e vídeos.
- O servidor e o cliente são de código aberto e totalmente gratuitos.
Possíveis desvantagens:
- Não há como criar conferências de áudio e vídeo nativas.
- A necessidade de exportar / importar chaves de criptografia para configurar uma conta em vários dispositivos.
Fato interessante: Roskomnadzor já exigia que os desenvolvedores do Delta Chat fornecessem acesso aos dados do usuário, chaves de criptografia e registro no cadastro estadual dos provedores, ao qual o Delta Chat recusou, porque não têm seus próprios servidores e não têm acesso a chaves de criptografia.
Criptografia ponta a ponta
O Delta Chat pode usar StartTLS ou conexão SSL com o servidor para se conectar ao servidor, as mensagens por padrão serão criptografadas de acordo com o padrão Autocrypt Nível 1 , após as primeiras mensagens serem trocadas (elas são transmitidas de forma não criptografada). Assim, se a comunicação for entre usuários de um servidor, as informações não serão transmitidas para outros servidores, apenas o nosso servidor e os dispositivos dos usuários estarão ocupados na transmissão das mensagens.
Ajuste do servidor
Configurar um servidor para Delta Chat se resume a instalar Postfix + Dovecot com StartTLS / SSL configurado e configurar registros de domínio.
Vou usar o CentOS 8 para configurar o servidor, pode haver pequenas diferenças para outras distribuições. Selecionamos os parâmetros de servidor apropriados para nossa tarefa.
No DNS, criei dois registros: o domínio de terceiro nível será o domínio de e-mail e o nome do servidor de e-mail:
secureim.example.com A <ip> secureim MX secureim.example.com
Vamos
hostname
definir e instalar o postfix, dovecot e nginx (nginx - para obter, vamos criptografar certificados, wget - para instalar o certbot-auto, nano - editor):
hostnamectl set-hostname secureim.example.com
dnf install postfix dovecot nginx wget nano -y
Vamos permitir que o Postfix receba e-mails de fora e configurar o hostname, domínio e origem do servidor, uma vez que o domínio de e-mail e o endereço do servidor são os mesmos, o domínio será o mesmo em todos os lugares:
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 o Delta Chat esteja disponível para conexão pela Internet, você precisa abrir as portas 80, 143, 443, 465, 587, 993. Também abrimos as portas 80, 443 para criptografar certificados e renová-los no futuro. Se você planeja receber cartas de outros servidores de e-mail, também precisará abrir a porta 25 (no meu caso, não pretendo me conectar usando outros servidores, portanto não especifico a porta 25). E pode ser necessário adicionar o encaminhamento de porta 80, 143, 443, 465, 587, 993 no roteador se o servidor for usado em uma rede local.
Vamos abrir as portas 80, 143, 443, 465, 587, 993 no firewall:
firewall-cmd --permanent --add-service={http,https,smtps,smtp-submission,imap,imaps} systemctl reload firewalld
Vamos criar configurações de site para nosso nome de domínio para criptografar 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/; } }
Vamos habilitar e executar o nginx:
systemctl enable nginx
systemctl start nginx
Instale o 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
Vamos gerar certificados para o site (no futuro, vamos usá-los para criptografia TLS da conexão com o servidor):
certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@example.com -d secureim.example.com
Os certificados serão criados e sua localização também será exibida no console:
# /etc/letsencrypt/live/secureim.example.com/fullchain.pem
# /etc/letsencrypt/live/secureim.example.com/privkey.pem
Corrija o arquivo de configuração do Postfix para permitir o recebimento de mensagens nas portas 465 e 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
Vamos executar os comandos para especificar a localização do certificado TLS e da chave privada do 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"
Se necessário, podemos ativar o registro de conexões TLS:
postconf "smtpd_tls_loglevel = 1"
postconf "smtp_tls_loglevel = 1"
Adicione o requisito para usar protocolos pelo menos TLS 1.2 no final do arquivo de configuração do Postfix:
nano /etc/postfix/main.cf smtp_tls_mandatory_protocols = >=TLSv1.2 smtp_tls_protocols = >=TLSv1.2
# Habilite e execute o Postfix:
systemctl start postfix
systemctl enable postfix
Instale, ative e execute o Dovecot:
dnf install dovecot -y
systemctl start dovecot
systemctl enable dovecot
Modifique o arquivo de configuração Dovecot para habilitar o protocolo imap:
nano /etc/dovecot/dovecot.conf protocols = imap
Vamos configurar o armazenamento de e-mail para que as mensagens sejam salvas nas pastas do usuário:
nano /etc/dovecot/conf.d/10-mail.conf mail_location = maildir:~/Maildir mail_privileged_group = mail
Adicione Dovecot ao grupo de e-mail para que Dovecot possa ler as mensagens recebidas:
gpasswd -a dovecot mail
Negar autorização sem criptografia TLS:
nano /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = yes
Adicionar substituição automática de domínio durante a autorização (apenas por nome de usuário):
auth_username_format = %n
Vamos alterar a localização do certificado, chave, a localização do arquivo de chave Diffie-Hellman, a versão mínima do TLS 1.2 e a preferência para escolher os protocolos de criptografia do servidor em vez do 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
Vamos gerar uma chave Diffie-Hellman, a geração de chaves pode levar muito tempo:
openssl dhparam -out /etc/dovecot/dh.pem 4096
Vamos mudar a seção de autenticação do serviço para que o Postfix possa se conectar ao servidor de autorização Dovecot:
nano /etc/dovecot/conf.d/10-master.conf service auth { unix_listener /var/spool/postfix/private/auth { mode = 0600 user = postfix group = postfix } }
Vamos habilitar a autocriação de pastas de correio do sistema (no caso de usarmos o servidor para correio regular também) adicionando a linha auto = create na seção de pastas de correio:
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
}
Vamos configurar o Dovecot para entregar mensagens ao armazenamento configurado, adicionando o parâmetro lmtp:
nano /etc/dovecot/dovecot.conf protocols = imap lmtp
Vamos configurar o serviço LMTP da seguinte maneira:
nano /etc/dovecot/conf.d/10-master.conf service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } }
Adicione as seguintes configurações ao final do arquivo para instruir o Postfix a entregar a correspondência no armazenamento local por meio do serviço Dovecot LMTP. Vamos também desativar o SMTPUTF8, já que o Dovecot LMTP não oferece suporte a esta extensão:
nano /etc/postfix/main.cf mailbox_transport = lmtp:unix:private/dovecot-lmtp smtputf8_enable = no
Vamos criar usuários que usarão o servidor criando uma entrada correspondente no sistema e dando a ele uma senha que será usada para autorização via smtps e imaps:
adduser user1 passwd user1
# Reinicie Dovecot e Postfix:
systemctl restart dovecot systemctl restart postfix
Adicione uma tarefa a / etc / crontab para renovar certificados automaticamente:
nano /etc/crontab
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
Nesta fase, o servidor deve funcionar como um servidor de e-mail, ou seja, você pode se conectar a um cliente de e-mail e tentar enviar e receber cartas para outras caixas de correio deste servidor ou, se você abriu a porta 25 acima, para outros servidores de e-mail.
Agora vamos configurar o cliente Delta Chat em um PC e smartphone Android.
Para se conectar, basta inserir o endereço de e-mail e a senha criada anteriormente no servidor, Delta Chat determinará quais portas podem ser utilizadas, após o que será possível adicionar um novo contato, também no endereço de e-mail, usando um endereço de e-mail válido.
As primeiras mensagens serão enviadas sem criptografia, neste estágio a troca de chaves está em andamento. Além disso, as mensagens serão criptografadas além do TLS usado para transmissão de dados, criptografia de ponta a ponta Autocrypt Nível 1.
Também é possível criar um bate-papo verificado em grupo - onde todas as mensagens são criptografadas com criptografia de ponta a ponta e os participantes podem entrar digitalizando o convite com um código QR. Desta forma, todos os participantes estão ligados uns aos outros por uma cadeia de convites que garantem consistência criptográfica contra ataques ativos à rede ou ataques ao provedor.
Uma das coisas mais interessantes que eu queria verificar era a aparência da mensagem no armazenamento do servidor. Para isso, enviei uma mensagem para uma conta inativa - neste caso, a mensagem aguardará seu destinatário no servidor, e nós, tendo acesso ao servidor, poderemos visualizá-la:
Conteúdo da mensagem
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 você pode ver, as cartas são armazenadas no servidor de forma criptografada e, se o servidor for apreendido por interessados, as mensagens não correrão risco.
Para maior confiabilidade, você pode usar criptografia completa do disco do servidor e do dispositivo no qual o cliente está sendo executado, também usar chaves para se conectar ao servidor via ssh e usar senhas fortes e complexas para contas de e-mail.
Conclusão
Delta Chat é uma alternativa interessante para um mensageiro de IM auto-hospedado, que permite trocar mensagens usando protocolos de e-mail existentes (que no futuro permitem que você não se preocupe com o bloqueio), e alta resistência à interceptação de mensagens, a ausência de um servidor central e a capacidade de implantar em seu servidor, permite que você não preocupações com os seus dados caindo nas mãos erradas.