Mensageiro de IM pessoal com criptografia ponta a ponta apenas para usuários internos

Neste artigo, eu disse a você como fazer seu próprio mensageiro seguro apenas para seu ponto de encontro paranóico.



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.










All Articles