Serviços de E-mail e Suas Configurações

Um serviço de e-mail é essencial a um negócio, empresa, representação ou startup. A presença virtual é essencial para a publicidade e comunicação, apesar dos diversos canais atuais, um serviço de e-mail agrega funcionalidades que plataformas sociais talvez não tenham. Sendo uma delas a capacidade de um negócio gerenciar sua própria caixa de e-mail, seja através de servidores próprios ou contratados, sem ficar refém de algoritmos externos para receber ou fazer contato.

Sendo responsável por um canal de comunicação, o gestor de um serviço de e-mail precisa tomar alguns cuidados para ter um serviço sempre funcional, longe das blacklists e íntegro. A título de exemplo serão referenciadas configurações de um serviço de e-mail genéricas o suficiente para serem aplicadas a qualquer serviço de e-mail (Gmail, Outlook, Zoho, MXRoute, etc).

Configurando os Registros de DNS

Para que um serviço de e-mail funcione corretamente é necessário que ele possa ser verificado por outros serviços de e-mail, ter sua autenticidade validade e chave de domínio pública (DKIM). Algumas dessas configurações são importantes e são definidas no Registrar responsável pelo DNS do domínio.

Sender Policy Framework - SPF

O Sender Policy Framework (SPF) é um recurso que torna público no DNS de quais endereços IPs ou Domínios um serviço de e-mail terceiro deve aceitar mensagens do domínio em questão. Assim, antes de qualquer destinatário receber um e-mail ele pode consultar nos registros DNS se o IP/Domínio remetente correspondem entre si.

Um exemplo de registro SPF é:

1
2
@ TXT v=spf1 include:example.com -all

Apesar do SPF ser um recurso útil, sua utilização de forma exclusiva não tem sido suficiente para garantir a validação da origem de e-mails. Técnicas de IP e e-mail spoofing são facilmente empregadas para enviar spams.

DomainKeys Identified Mail (Chaves DKIM)

De forma a complementar a segurança de um serviço de e-mail foi criada uma técnica em que servidores que enviam e-mails mantếm publicados em seus registros DNS chaves criptográficas públicas. Em cada e-mail que é enviado ele envia uma assinatura digital que só pode ser validada através da chave que está publicada no DNS do domínio. Assim, qualquer serviço de e-mail quer receber mensagens deste domínio receberá uma assinatura digital que poderá ser verificada com a chave disponível no DNS. Caso a verificação não retorne positivamente é indício de que o e-mail não é legítimo.

Exemplo (não funcional) de chave DKIM que é publicado no DNS:

1
x._domainkey.example.com TXT k=rsa; t=s; p=asdasGSIb3DQEBAQUAA4GNADCBiQKBgQDDmzRmJRQxLEASD1232SyMASd341231hRiwUd/mZp1rodasd123172O1DiYVThkyCgpSYS8nm31231

Domain-based Message Authentication, Reporting and Conformance (DMARK)

Complementando o leque de protocolos de segurança para e-mails, o DMARK atua definindo políticas e ações de segurança quando as verificações do SPF e/ou DMARK não podem ser validadas. Ele também é publicado no DNS do domínio e as ações que ele pode definir como política de tratamento de mensagens que não atendem conformidades do SPF/DMARK são: encaminhar a mensagem ao destinatário, colocar em quarentena ou rejeitar (não entregar a mensagem ao destinatário).

Em paralelo a essas opções, ele também define um endereço de e-mail no qual o gestor do serviço de e-mail se propõe a receber relatórios dessas não conformidades citadas. Assim, qualquer serviço de e-mail que tratar mensagens “inválidas” do domínio podem encaminhar relatórios dessas tratativas, alertando o gestor do domínio sobre indícios de incidentes de segurança.

Exemplo de um registro DMARK que é publicado no DNS:

1
_demark.example.com TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected];"

Protocolos SSL

Assim como na navegação web (https), é importante que se utilize certificados SSLs na comunicação entre os clientes e servidores, estes devem ser configurados nos servidores de e-mail e os clientes que se conectam ao servidor devem sempre prezar por utilizar as portas e protocolos pré-estabelecidas e seguros.

Personalizando os Subdomínios de Acesso e Registros MX

Provedores de serviços de e-mail possuem um infraestrutura de nomes e IPs que eles prezam muito, evitam que sejam bloqueadas em listas de spams e que hajam incidentes de segurança ou uso indiscriminado.

Supondo que o serviço de e-mail que foi contratado lhe oriente a utilizar os domínios e IPs específicos, é possível criar registros no seu próprio domínio que facilitem o acesso para os seus usuários, assim, alguns registros de DNS CNAME e A/AAAA podem ser criados.

Exemplos de redirecionamento de domínios e IPs de acesso ao serviço de e-mail:

1
2
3
mail.meudominio.com CNAME mail.servico-de-email.com
webmail.meudominio.com CNAME webmail.servico-de-email.com

Após essas dicas de segurança temos condições de configurar os principais registros de e-mail no DNS, que são os MX, ele podem ser configurados da seguinte forma:

1
2
3
meudominio.com MX 10 servico-de-email.com
meudominio.com MX 20 servico-de-email-relay.com

Os números 10 e 20 representam a prioridades de entrega, caso algum endereço esteja indisponível.

References:

Instalação Traccar na AWS

O Traccar pode ser instalado com um banco interno, H2 de “baixo desempenho”, com um banco de dados na mesma instância (MySQL) ou utilizando um banco externo.

Para a primeira etapa desta instalação será utilizado o banco interno, dando preferência para conectar a um banco externo (AWS RDS) quando a instância estiver em produção.

  • Criar a instância na AWS em um subnet pública, 8 GB de HD são suficientes. Adicionar regras de Security Groups para as portas 22, 80, 443, 8082 (porta de acesso inicial do servidor java) e para as portas de recebimento dos dados de telemetria 5000 à 5150 (TCP e UDP).

  • Baixar e descompactar os arquivos de instalação do sistema:

1
2
3
4
sudo yum update -y
sudo yum install htop
wget https://www.traccar.org/download/traccar-linux-64-latest.zip
unzip traccar-linux-*.zip
  • Executar o arquivo de instalação como sudo: sudo ./traccar.run
Configuração do banco de dados:
  • Caso deixe a configuração padrão, para uso do banco de dados embutido (H2), a seguinte configuração será mantida no arquivo de configuração: /opt/traccar/conf/traccar.xml.
1
2
3
4
<entry key='database.driver'>com.mysql.jdbc.Driver</entry>
<entry key='database.url'>jdbc:mysql://localhost/traccardb?serverTimezone=UTC&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
<entry key='database.user'>root</entry>
<entry key='database.password'>root</entry>
  • Caso altere a opção padrão de banco de dados e crie um banco de dados MySQL, o arquivo /opt/traccar/conf/traccar.xml deve ser alterado, seguindo o modelo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat > /opt/traccar/conf/traccar.xml << EOF
<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>

<properties>

<entry key="config.default">./conf/default.xml</entry>

<entry key='database.driver'>com.mysql.jdbc.Driver</entry>
<entry key='database.url'>jdbc:mysql://localhost/traccardb?serverTimezone=UTC&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
<entry key='database.user'>root</entry>
<entry key='database.password'>root</entry>

</properties>
EOF
  • Iniciar o serviço Traccar: sudo service traccar start

  • Testar acesso web pela porta 8082: http://ip-do-servidor:8082

  • Realizar login com a credencial padrão (admin/admin), desativar o auto-registro de usuários e alterar a senha padrão.

Na segunda estapa desta instalação será configurado o acesso ao site pelo nome de domínio, através da porta 443 (ssl/tls) e instalação de um certificado.

Configurações do Apache e do certificado SSL

Traccar serves web interface and API using regular HTTP protocol which does not use any encryption. This guide provides instructions on how to configure Traccar to use secure HTTPS protocol with SSL/TLS encryption of all traffic Traccar Secure Connection. Examples are for Ubuntu and other Debian-based systems only, but the general idea can be applied to all platforms. For Windows system you can follow this blog post from Freek.

Traccar does not support secure connection out of the box, but a proxy server can be used to tunnel all data through secure protocol. In this guide we will use Apache server with proxy module.

1. First step is to install Apache server and enable required modules:

Install dependencies:

1
2
3
4
5
sudo apt-get install ssl-cert apache2
sudo a2enmod ssl
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
sudo service apache2 restart
2. As a next step we need to add new site configuration:

sudo nano /etc/apache2/sites-available/traccar.conf
Content for the site configuration (replace “demo.traccar.org” with your domain):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<IfModule mod_ssl.c>
<VirtualHost _default_:443>

ServerName demo.traccar.org
ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

ProxyPass /api/socket ws://localhost:8082/api/socket
ProxyPassReverse /api/socket ws://localhost:8082/api/socket

ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/

SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

</VirtualHost>
</IfModule>
3. Enable site and restart Apache service:
1
2
sudo a2ensite traccar
sudo service apache2 restart
4. Domain Name: You need to have a domain name. Check our documentation on how register and to configure a custom domain name with Traccar.
5. Generate an SSL certificate for your server using Let’s Encrypt service :

Lets encrypt certbot: Install certbot:

1
sudo snap install --classic certbot

Execute Certbot:

1
sudo certbot --apache
6. Traccar in subdirectory (non root path) - OPTIONAL:

If you want Traccar to be in a subdirectory, you also need to adjust cookies path. Here is a proxy configuration example:

1
2
3
4
5
6
7
8
9
10
ProxyRequests off

ProxyPass /gps/api/socket ws://localhost:8082/api/socket
ProxyPassReverse /gps/api/socket ws://localhost:8082/api/socket

ProxyPass /gps/ http://localhost:8082/
ProxyPassReverse /gps/ http://localhost:8082/
ProxyPassReverseCookiePath / /gps/

Redirect permanent /gps /gps/
7. Redirect unsecure connections HTTP to HTTPS:
1
2
3
sudo a2enmod rewrite
sudo a2dissite 000-default
sudo nano /etc/apache2/sites-available/traccar.conf

Add following lines to the configuration:

1
2
3
4
<VirtualHost *:80>
ServerName demo.traccar.org
Redirect / https://demo.traccar.org/
</VirtualHost>

Restart Apache server:

1
sudo service apache2 restart
  • Configurar no Registrar o encaminhamento do nome de subdomínio desejado para o IP/CNAME da instância EC2. Caso seja utilizado um Elastic IP, este deve receber o apontamento do subdomínio desejado.
Configurações adicionais:

Podem ser feitos mais alguns ajustes, a fim de garantir mais algumas restrições de segurança e funcionalidades para o serviço:

  • Firewall UFW: Instalar, habilitar e liberar as portas de acesso ao servidor: 5000-5150 (UDP/TCP), 80+443 (TCP), 22 (TCP) caso o servidor ainda precise ser configurado remotamente.
  • No momento em que o servidor já esteja em produção não é necessário mais manter liberação de acesso à porta 22, com isso evita-se alguns escaneamentos de bots.
  • Caso a porta 22 deva ser mantida aberta, utilize a aplicação fail2ban como método adicional de segurança.

Referências

Parallel

Para execução de scripts e programas, de forma paralela, em um sistema GNU/Linux, pode ser utilizado o GNU Parallel. Uma aplicação que permite distribuir a carga de procesamento, de uma ou várias aplicações, em múltiplos CPUs.

Instalação

No Ubuntu/Debian é possível fazer a instalação do seu pacote através dos reposítorios oficiais:

1
2
$ sudo apt-get get update
$ sudo apt-get install parallel

Sintaxe

Executada a instalação, é possível testar
sua utilização com comandos básicos. Dentre as diversas possibilidades de utilização do parallel (man parallel), uma das sintaxes mais simples de ser utilizada é a composição com :::. O trio de dois pontos consecutivos permite a indicação de comandos ou parâmetros que serão paralelizados.

No exemplo abaixo, o comando echo será paralelizado para exibição de dois parâmetros, a e b, simultaneamente.

1
$ parallel echo ::: a b

O retorno dessa execução deve ser:

1
2
a
b

Uma segunda forma de utilizar os ::: para criar comandos do parallel é indicando quais comandos devem ser paralelizados. Para este caso todos os parâmetros necessásios de cada comando serão inseridos num mesmo bloco, delimitado por aspas "".

1
2
$ parallel ::: "comando1 -parametros" "comando2 -parametros"

Dessa forma, os comandos 1 e 2 serão executados simultaneamente, independentes se são iguais ou possuem os mesmos parâmetros.

Exemplos

Uma forma de avaliar a execução simultânea dos comandos é mostrar o horário em que eles começaram a ser executados. Para verificar esse ponto serão utilizados em conjunto os comandos date e ping, em execuções paralelas e buscando sites distintos

Execução 1: date; ping -c 3 facebook.com

Execução 2 date; ping -c 3 google.com

1
$ parallel -k ::: "date; ping -c 3 facebook.com" "date; ping -c 3 google.com"

O parâmetro -k serve apenas para ordenar a exibição dos resultados de cada execução. Os sites indicados são apenas para testes, poderiam ser quaisquer outros acessíveis no momento.

Os resultados das execuções devem ser algo do tipo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sat May 16 19:22:37 -03 2020
PING facebook.com (31.13.85.36): 56 data bytes
64 bytes from 31.13.85.36: icmp_seq=0 ttl=49 time=22.865 ms
64 bytes from 31.13.85.36: icmp_seq=1 ttl=49 time=22.964 ms
64 bytes from 31.13.85.36: icmp_seq=2 ttl=49 time=23.001 ms
--- facebook.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 22.865/22.943/23.001/0.057 ms
Sat May 16 19:22:37 -03 2020
PING google.com (172.217.29.46): 56 data bytes
64 bytes from 172.217.29.46: icmp_seq=0 ttl=43 time=24.132 ms
64 bytes from 172.217.29.46: icmp_seq=1 ttl=43 time=24.155 ms
64 bytes from 172.217.29.46: icmp_seq=2 ttl=43 time=24.048 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 24.048/24.112/24.155/0.046 ms

É importante reparar o carimbo de hora indicado, pois é justamente ele que demonstra a execução paralela de cada uma das execuções:

1
Sat May 16 19:22:37 -03 2020

Aprofundamentos

A execução paralela tem a vantagem de permitir que diferentes programas sejam iniciados em conjunto, e mesmo que possuam tempo de execuções distintos, elas não interferirão entre si.

Serialização x Paralelização

Um exemplo oposto à paralelização é a execução em série. Os mesmos comandos poderiam ser dispostos em série, com objetivos de realizar as mesmas tarefas, porém os tempos de execuções não seriam os mesmos.

1
$ date && ping -c 3 facebook.com && date && ping -c 3 google.com
Resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sat May 16 20:03:08 -03 2020
PING facebook.com (157.240.222.35): 56 data bytes
64 bytes from 157.240.222.35: icmp_seq=0 ttl=49 time=14.406 ms
64 bytes from 157.240.222.35: icmp_seq=1 ttl=49 time=14.140 ms
64 bytes from 157.240.222.35: icmp_seq=2 ttl=49 time=14.014 ms
--- facebook.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 14.014/14.187/14.406/0.163 ms
Sat May 16 20:03:10 -03 2020
PING google.com (172.217.29.46): 56 data bytes
64 bytes from 172.217.29.46: icmp_seq=0 ttl=43 time=25.128 ms
64 bytes from 172.217.29.46: icmp_seq=1 ttl=43 time=24.595 ms
64 bytes from 172.217.29.46: icmp_seq=2 ttl=43 time=24.572 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 24.572/24.765/25.128/0.257 ms

Repare como cada execução do ping aconteceu em tempos distintos:

1
2
3
Execução 1: Sat May 16 20:03:08 -03 2020

Execução 2: Sat May 16 20:03:10 -03 2020

Com a ajuda do comando time, é possível repetir os cenários e aprofundar na comparação do tempo de execução de cada um dos cenários.

Cenário 1: Mensurando o tempo de execução da paralelização

1
$ time parallel -k ::: "date; ping -c 3 facebook.com" "date; ping -c 3 google.com"
Resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sat May 16 20:52:58 -03 2020
PING facebook.com (157.240.222.35): 56 data bytes
64 bytes from 157.240.222.35: icmp_seq=0 ttl=49 time=14.108 ms
64 bytes from 157.240.222.35: icmp_seq=1 ttl=49 time=13.892 ms
64 bytes from 157.240.222.35: icmp_seq=2 ttl=49 time=13.811 ms
--- facebook.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 13.811/13.937/14.108/0.125 ms
Sat May 16 20:52:58 -03 2020
PING google.com (172.217.29.46): 56 data bytes
64 bytes from 172.217.29.46: icmp_seq=0 ttl=43 time=24.248 ms
64 bytes from 172.217.29.46: icmp_seq=1 ttl=43 time=23.609 ms
64 bytes from 172.217.29.46: icmp_seq=2 ttl=43 time=24.277 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 23.609/24.045/24.277/0.308 ms

real 0m2.159s
user 0m0.100s
sys 0m0.020s

Cenário 2: Mensurando o tempo de execução da serialização

1
time (date && ping -c 3 facebook.com && date && ping -c 3 google.com)
Resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sat May 16 20:53:02 -03 2020
PING facebook.com (157.240.222.35): 56 data bytes
64 bytes from 157.240.222.35: icmp_seq=0 ttl=49 time=13.868 ms
64 bytes from 157.240.222.35: icmp_seq=1 ttl=49 time=13.860 ms
64 bytes from 157.240.222.35: icmp_seq=2 ttl=49 time=14.212 ms
--- facebook.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 13.860/13.980/14.212/0.164 ms
Sat May 16 20:53:04 -03 2020
PING google.com (172.217.29.46): 56 data bytes
64 bytes from 172.217.29.46: icmp_seq=0 ttl=43 time=24.081 ms
64 bytes from 172.217.29.46: icmp_seq=1 ttl=43 time=24.015 ms
64 bytes from 172.217.29.46: icmp_seq=2 ttl=43 time=24.933 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 24.015/24.343/24.933/0.418 ms

real 0m4.051s
user 0m0.000s
sys 0m0.000s
Comparativos:
1
2
Tempo de execução com paralelização: 0m2.159s
Tempo de execução com serialização: 0m4.051s

Desta forma, ficam demonstradas e exemplificadas as vantagens de se utilizar o parallel em rotinas repetitivas e/ou com tempos de execuções distintos.

Execução de um script scanner de rede com parallel:

prips 192.168.0.1/24 | parallel --timeout 2 -j0 'ping -c 1 {} >/dev/null && echo {}' 2>/dev/null

References

CHMOD

A alteração de permissões de arquivos no linux pode ser efetuada de forma rápida com o comando chmod.

Sintaxe

chmod [option] path/to/file
chmod -R go-w path/to/folder

Tipos de permissões

Um arquivo ou pasta podem receber permissões de leitura (read), escrita (write) ou execução (execute).

Grupos

Ao aplicar uma permisão é necessário especificar os grupos aos quais ela se aplica. Os possíveis grupos são: usuário (user), grupo (group) e outro (other).

Informações dos grupos e das permissões são exibidas ao executar o comando ls -l.

1
2
3
4
5
-rw-r--r--  1 user user    0 Sep 24 16:38 readme.txt
file -
user rw-
group r--
other r--

O primeiro campo diferencia ou não um diretório (d). Os próximos três campos determinam as permissões do usuário (user). Os três campos seguintes exibem as permissões do grupo do usuário (group) e os últimos campus as permissões do outros grupos (other). O grupo other se refere a qualquer outro usuário existente, inclusive acessos públicos.

Exemplos

  1. Excluir permissão de escrita de um arquivo para “ group” e “others”:
    1
    $ chmod go-w readme.txt
  2. Adicionar todas as permissões para um arquivo:
    1
    2
    3
    4
    5
    6
    $ chmod ugo+rwx readme.txt
    -rwxrwxrwx 1 user user 0 Sep 24 16:38 readme.txt
    file -
    user rwx
    group rwx
    other rwx
  3. Adicionar todas as permissões para um diretório e seus arquivos:
    1
    2
    3
    4
    5
    6
    $ chmod -R test ugo+rwx
    drwxrwxrwx 2 user user 4096 Sep 24 16:53 test
    directory d
    user rwx
    group rwx
    other rwx

References