Instalando e Configurando o Servidor de E-mail Carbonio CE na AWS (Substituto do Zimbra)
Tags: carbonio, email, aws, ec2
Published: 2024-04-18 14:17:28

A segurança em um servidor de e-mail é de extrema importância para qualquer organização ou empresa. Os servidores de e-mail lidam com uma quantidade significativa de informações sensíveis e confidenciais, incluindo comunicações internas e externas, documentos anexados, dados de contato e muito mais. Portanto, garantir a segurança desses dados é essencial para proteger a privacidade dos usuários e a integridade das informações da organização.

A Synacor anunciou que, a partir de dezembro de 2023, não fornecerá mais suporte nem atualizações de segurança para o Zimbra Open Source. Isso significa que a versão 8.8.15 será a última Open Source disponível. Manter uma versão de um servidor de e-mail sem suporte ou sem atualizações de segurança pode acarretar diversos riscos, especialmente vulnerabilidades de segurança não corrigidas que podem ser exploradas por hackers. Como é de conhecimento geral, o e-mail representa uma das principais portas de entrada para esse tipo de ataque, e um sistema de e-mail vulnerável pode deixar as empresas expostas a sérias consequências.

A Zextras resolveu disponibilizar e manter a sua própria versão chamada Carbonio CE, e é sobre ele que iremos falar hoje. O passo a passo abaixo irei demonstrar como instalar e configurar o servidor de e-mail Carbonio CE em uma instância EC2 na AWS.

## Ambiente:
Uma instância EC2 com um Elastic IP.

Também é necessário possuir um registro DNS.

Sistema Operacional | CPU | RAM | HD | Versão do E-mail
---- | ---- | ---- | ---- | ----
Ubuntu 20.04 LTS | 4vCPU | 16GB | 50GB | Carbonio Release 24.3.0

Portas externas (0.0.0.0/0):
* 80 (HTTP)
* 443 (HTTPs)
* 25 (SMTP)
* 465 (SMTPs)
* 587 (SMTP)
* 143 (IMAP)
* 993 (IMAPs)
* 110 (POP3)
* 995 (POP3s)

Porta interna (VPN/IP Static):
* 6071 (Administração)

## Etapa 01 - Criando os registro DNS
Antes de tudo, vamos definir e criar a URL que iremos utilizar para o servidor de e-mail.

Irei utilizar o domínio alfredocastro.com.br, defini a URL mail.alfredocastro.com.br para o portal web do Carbonio CE.

Acesse o seu gerenciador de registros DNS do seu domínio e crie os registro abaixo de acordo com o seu cenário:

Tipo | Registro | Valor | Observação
-------|-------|-------|-------
A | mail | 52.XX.XXX.216 | Elastic IP atribuído à EC2
MX | @ | 10 mail.alfredocastro.com.br | URL definida para o servidro de e-mail
TXT | @ | v=spf1 ip4:52.XX.XXX.216/32 -all | Elastic IP atribuído à EC2
TXT | _dmarc | v=DMARC1; p=none; sp=quarantine; rua=mailto:admin@alfredocastro.com.br | E-mail para envio de recebimento de relatórios de conformidade DMARC

Veja um exemplo:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w7twra5awvu80rhli6w8.png)

Para consultar a propagação do registro criado, consulte o site: [WhatsMyDNS](https://www.whatsmydns.net/)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rl1lc3xdpjoyjvgfgp9g.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccfnposisq49iu1o3nq1.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrl2efkfhk7a8girlauo.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8igjct9ni7gon14u8vve.png)

## Etapa 02 - Solicitando a remoção de restrição da porta 25 SMTP do Elastic IP
Obs: Antes de criar um registro DNS reverso, você deve definir um registro DNS de encaminhamento correspondente (registro tipo A) que aponte para seu endereço Elastic IP (feito na etapa anterior).

Criando um registro DNS reverso.

Acesse a console AWS e procure pelo serviço "EC2".

No menu lateral a esquerda, clique em "Elastic IPs".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv0lulrum5imjidduvok.png)

Selecione o Elastic IP e clique em Actions > Update reverse DNS.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ykcr5x91qu2x2kuqully.png)

Digite a URL criada na etapa anterior para o servidor de e-mail. Em seguida escreva update e clique no botão "Update".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ll10l8somyoctwca8jvo.png)

Acesse a URL abaixo e preencha o formulário para solicitar a liberação da porta 25 (SMTP).

https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request

Email address: email para receber o contato da AWS

Use case description: Descrição do motivo que você quer a liberação da porta SMTP

Elastic IP address: O endereço IP atachado na instância EC2

Reverse DNS record: A URL que você definiu para o DNS Reverso

Em seguida clique em "Submit".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxrb7d8vp6udfarag1gl.png)

Você irá receber um e-mail de confirmação da solicitação.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8cdi3th5bw509h5u9uo2.png)

Caso sua solicitação seja aprovada, você irá receber outro email confirmando.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfrvhxqvmwusmcfiu75a.png)

Utilizei o seguinte texto para solicitar a liberação:
```text
I request the release of the SMTP port for sending emails through the provided EIP below. We will use an EC2 with this EIP to set up a business email server.
To ensure that the EC2 is not used for sending unwanted emails, the following measures will be implemented:
* Email Authentication: Implementation of SPF (Sender Policy Framework) and DKIM (DomainKeys Identified Mail) authentication to verify the authenticity of sent emails.
* Constant Monitoring: Implementation of monitoring tools to identify any suspicious activity or abnormal email volume.
* Responsible Use Policies: Establishment of internal policies to ensure that email sending is done responsibly and in compliance with applicable laws and regulations.
```

Para realizar um teste, acesse sua instância EC2 e execute um telnet em algum servidor de e-mail na porta 25. No exemplo abaixo utilizei o servidor do Gmail.
```bash
telnet smtp.gmail.com 25
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/flfcjym7k3h04hihae5z.png)

## Etapa 03 - Instalando e configurando o Carbonio CE
Primeiro vamos atualizar a lista de pacotes disponíveis nos repositórios. Execute o seguinte comando:
```bash
apt-get update
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qq96g3fczmyk2slr1lxp.png)

Agora vamos alterar o hostname da máquina. Execute o seguinte comando:
```bash
hostnamectl set-hostname mail
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5nx8tr72tusty51vu5mk.png)

Precisamos atualizar o arquivo /etc/hosts com o IP da máquina seguido do FQDN e o hostname. Execute o primeiro comando para descobrir o seu IP, em seguida altere o segundo comando conforme o seu ambiente:
```bash
hostname -I
echo "10.0.2.133 mail.alfredocastro.com.br mail" >> /etc/hosts
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kdcdjvp4l6t8r9wyaw0y.png)

Reinicie a máquina utilizando o comando abaixo:
```bash
reboot
```

Execute os comandos abaixo para adicionar o repositório da Zextras:
>NOTA: Acesse a página do [Carbonio Community Edition](https://www.zextras.com/carbonio-community-edition/?ref=blog.netcomms.au#discoverproduct) e preencha o formulário. Você receberá um e-mail com instruções de como adicionar o repositório, parecido com os comandos abaixo:
```bash
cd /tmp
wget https://repo.zextras.io/inst_repo_ubuntu.sh
chmod +x inst_repo_ubuntu.sh
./inst_repo_ubuntu.sh
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vs2sbj51dulssjq9hwui.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wnskaxmw2o0pkcpa12vo.png)

Agora execute o comando abaixo para realizar a instalação do Carbonio CE:
```bash
apt-get install service-discover-server \
carbonio-directory-server \
carbonio-proxy \
carbonio-webui \
carbonio-files-ui \
carbonio-admin-login-ui \
carbonio-mta \
carbonio-appserver \
carbonio-user-management \
carbonio-files-ce \
carbonio-files-db \
carbonio-storages-ce \
carbonio-preview-ce \
carbonio-docs-connector-ce \
carbonio-docs-editor \
carbonio-admin-ui \
carbonio-admin-console-ui \
postgresql-12 -y
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5i7zuc9vfd1itjlllmu5.png)

Execute o seguinte comando para realizar a configuração inicial do Carbonio CE:
```bash
carbonio-bootstrap
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3i37qrnm695e3qy42cyn.png)

Vamos realizar a alteração do timezone do Carbonio CE, digite "1" para entrar no menu "Common Configuration":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sp1fig3cwbas4yl6ml83.png)

Digite "6" para entrar no menu "TimeZone":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zye6a5tyvoxqr1432gpa.png)

Digite o número corresponde ao seu timezone, irei configurar o timezone de "America/Sao_Paulo" número "43":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q15jt7uj5duqv20esu6g.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75vnats70oqzgd0ncryt.png)

Retorne ao menu principal digitando "r":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2x8kr8wsnhd5zuenkpq.png)

Confirme as configurações digitando "y":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kdwhpa3yb9ctz70tmk5o.png)

Aguarde até que ele exiba a mensagem "Configuration complete", e em seguida tecle "ENTER":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jn96ymuvh5rv8cf6q1n.png)

Agora vamos configurar o Carbonio Mesh, ele é necessário para permitir a comunicação entre o Carbonio e seus componentes. Execute o comando abaixo para realizar a configuração de forma interativa:
```bash
service-discover setup-wizard
```

Primeiro ele irá solicitar o seu endereço IP seguido da máscara de rede, no meu exemplo será o 10.0.2.133/20. Em seguida irá solicitar uma senha para o Carbonio Mesh que é usado para configurações e gerenciamento, repita a senha novamente (por segurança, ele não irá mostrar os caracteres):
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vr99gvct2dthgexqd0jd.png)

>Obs: Caso tenha perdido a senha, você pode encotrar ela no arquivo /var/lib/service-discover/password (acessível apenas pelo usuário root).

Para concluir a instalação do Carbonio Mesh, execute o seguinte comando (será solicitada a senha, digite a senha definida na etapa anterior):
```bash
pending-setups -a
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tgvn3g49n5dt4bezf89x.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owny6azml98wn4mdzh11.png)

Execute os comandos abaixo para realizar a criação da Role, da Database e para o banco de dados inicial de arquivos para o Carbonio CE:
>NOTA: Altere DB_ADM_PWD para uma senha de sua escolha, no primeiro e no terceiro comando.
```bash
su - postgres -c "psql --command=\"CREATE ROLE carbonio_adm WITH LOGIN SUPERUSER encrypted password 'DB_ADM_PWD';\""
su - postgres -c "psql --command=\"CREATE DATABASE carbonio_adm owner carbonio_adm;\""
PGPASSWORD=DB_ADM_PWD carbonio-files-db-bootstrap carbonio_adm 127.0.0.1
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30qsi1aslusga2wtxbd5.png)

Execute um Stop/Start utilizando os comandos abaixo:
```bash
su - zextras
zmcontrol stop
zmcontrol start
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8gcnw02fk52ya0j9q0wj.png)

Execute o comando abaixo para definir uma senha para o usuário Global Admin (usuário administrador da console Carbonio CE acessível na porta 6071):
>NOTA: Altere a informação do domínio conforme o seu ambiente e altere para uma senha de sua escolha.
```bash
su - zextras
carbonio prov setpassword zextras@alfredocastro.com.br YOURPASSWORD
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y875evmqvfzq8owoohni.png)
>NOTA: Execute o comando logado com o usuário zextras (su - zextras).

## Etapa 04 - Configurando o DKIM
DKIM, ou DomainKeys Identified Mail, é um método de autenticação de emails. Ele ajuda a verificar a autenticidade do remetente e a integridade da mensagem de email. Quando um servidor de email usa DKIM, ele adiciona uma assinatura criptográfica aos cabeçalhos do email enviado. Essa assinatura é gerada usando uma chave privada específica do domínio do remetente.

Quando o email é recebido pelo servidor de destino, o servidor verifica essa assinatura usando a chave pública disponível no registro DNS do domínio do remetente. Se a assinatura corresponder aos dados do cabeçalho do email, isso indica que o email não foi alterado após ter sido enviado pelo remetente autenticado.

Essencialmente, DKIM ajuda a combater o spoofing de email e a garantir que os emails sejam autenticados como legítimos. Isso pode ajudar a reduzir a probabilidade de que emails falsificados ou maliciosos sejam entregues na caixa de entrada do destinatário.

Para configurarmos, execute o seguinte comando para gerar o registro DNS:
>NOTA: Altere o domínio conforme o seu ambiente.
```bash
su - zextras
/opt/zextras/libexec/zmdkimkeyutil -a -d alfredocastro.com.br
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddhf8tmvyqe0ebmr5snx.png)

No exemplo acima, foi gerado o seguinte registro para ser criado no DNS:
```bash
Tipo: TXT

Registro: 9EEEDFAE-FC33-11EE-9B42-EAD105BED053._domainkey

Valor: v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5IYCXNy92oQdyTDrXAIfDFz/fHzmNdeqhgSeErR/m0SYDguQKeb7c19zr4imctX2a6HdzV1W5c8w90jvbvKYGUuBOBhSA/APx0DEa+DxV59+D173PE/iKpDuAIBajWyXT+oVH9JX6iCg33Jk4ghEakZ4jz+NsSkVJ3rwUIHvBWnfb7BNF5MPnQ18O9YHvS3POdldIdIme/JHCuew3k/biXIhZxVE9zg2YXwq1AjxCo24jqtDIUhG26koAeSguDDXremk3hyzEG4qKLnF47gdbDSijBBllAMV3CVzqBhBuVOV3gNA1ifGtiAUXH3YHQJeYFqy2yld8oZlqFozuSXzFQIDAQAB
```

Acesse o seu gerenciador de registros DNS do seu domínio e crie o registro acima de acordo com o seu cenário:

Veja um exemplo:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ymsv921ppvkvl7pmpqz5.png)

Para consultar a propagação do registro criado, consulte o site: [WhatsMyDNS](https://www.whatsmydns.net/)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0vt4a04k2ke2ajf1gu7a.png)

## Etapa 05 - Configurando um Certificado SSL Let's Encrypt no Carbonio CE via Console
A Zextras introduziu uma maneira simplificada e aprimorada de configurar certificados SSL Let's Encrypt através da Console Web. Com esta atualização, você agora pode facilmente implementar certificados para um único domínio ou vários domínios.

Para configurar o Let's Encrypt, você precisa ter o pacote certbot, execute o seguinte comando para verificar se ele está instalado:
```bash
dpkg -l | grep carbonio-certbot
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbd2kl4bwasdoobicksv.png)

Verifique o modo zimbraReverseProxyMailMode do seu servidor. Por padrão é definido como https, execute o seguinte comando:
>NOTA: Altere a URL conforme o seu ambiente
```bash
su - zextras -c "carbonio prov gs mail.alfredocastro.com.br | grep -i zimbraReverseProxyMailMode"
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6fa6krvjkpfubijnbwk0.png)

Para que o certbot funcione, precisamos alterar o modo zimbraReverseProxyMailMode de https para redirect, execute os comandos abaixo para realizar a alteração:
>NOTA: Altere a URL conforme o seu ambiente
```bash
su - zextras -c "carbonio prov ms mail.alfredocastro.com.br zimbraReverseProxyMailMode redirect"
su - zextras -c "zmconfigdctl restart"
su - zextras -c "carbonio prov gs mail.alfredocastro.com.br | grep -i zimbraReverseProxyMailMode"
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3o6qsn8fa3xmi0zsfdp0.png)

Faça login no Console de administração do Carbonio CE, utilize o usuário zextras@alfredocastro.com.br:
>NOTA: https://mail.alfredocastro.com.br:6071/ - altere a URL conforme o seu ambiente

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/igmfs5dszapyif9fqxgx.png)

Clique em "Domains" no menu lateral esquerdo:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z937l1zmasg7e2n52vq8.png)

Selecione o domínio desejado:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bnw3mdasmz2agi1r373.png)

Clique em "Virtual Hosts & Certificates":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kka1g6tw8fkfi47iz9s7.png)

Digite a URL que você configurou em seu servidor de mail e clique em "ADD":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnw5d29y61ihrncqhu5t.png)

Clique em "SAVE":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6kydi0r543zhtvjv1rp.png)

Clique em "UPLOAD AND VERIFY CERTIFICATE":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2jhdvuius4bv9rnyqmz.png)

Altere "Certificate Type" para "I want to use a Let's Encrypt (longChain) certificate" e em seguida clique em "GENERATE CERTIFICATE":
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kiz5083rc9jt6njcdpj1.png)

Você verá uma notificação em verde escrito "The System is processing your certificate generation request. It will send the result to the Global and Domain notification recipients.", o Carbonio CE irá solicitar o certificado.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mdvetntu3rmvej4jw32b.png)

Se tudo ocorrer bem você irá receber dois e-mails com a conclusão da solicitação, acesse a URL do seu servidor de e-mail e faça login com o usuário zextras@alfredocastro.com.br:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tymor1sis6g5qstr90xl.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p07hkosikzsnokthlbfa.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c20gdiedahhtxrsnpfnn.png)

Para finalizar, execute o comando abaixo para reiniciar o Carbonio CE e finalizar a instalação do Certificado SSL:
```bash
su - zextras -c "zmcontrol restart"
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kwi1inuqewf8whcxr8w4.png)

Espero tê-lo ajudado! Se houver alguma dúvida, não hesite em entrar em contato.

https://alfredocastro.com.br/posts/instalando-e-configurando-o-servidor-de-e-mail-carbonio-ce-na-aws-substituto-do-zimbra/