Criptografia no Linux: Email

by Tom Ryder (autoria) e Rafael Beraldo (tradução)

Este é o sétimo post de uma série de dez posts traduzindo o original de Tom Ryder, Linux Crypto. Essa série está sob uma licença Creative Commons 3.0.

Para a lista de posts, veja a introdução.


Um sistema de armazenamento de senhas criptografado é um bom começo, mas agora que temos uma instalação do GnuPG em funcionamento, devemos considerar o uso do PGP para aquilo que foi originalmente criado: emails. Para isso, usaremos o Mutt.

O Mutt é um cliente de email para o console, ou MUA (do inglês mail user agent), projetado sobretudo para gerenciar e ler emails. Ao contrário de outros clientes como o Thunderbird, ele não foi projetado para ser um cliente POP3/IMAP, ou um agente SMTP, embora versões mais recentes incluam essa funcionalidade; essas são operações realizadas por programas como o Getmail e o MSMTP.

Se, como muitas outras pessoas, você estiver usando o Gmail, o Mutt funciona muito bem com POP3/IMAP e SMTP, permitindo que você componha mensagens em texto plano, com seu editor de escolha, numa janela de terminal, num ambiente altamente configurável e utilizando sua própria criptografia para email, para qualquer comunicação confidencial, de maneira que nem mesmo o seu provedor de email possa lê-la.

O uso geral do Mutt e a configuração para usuários do Gmail não será coberta em detalhes aqui. Por enquanto, existem muitos artigos excelentes sobre a configuração básica do Mutt. Se você está interessado na configuração de outros clientes de email para o Linux, como o Claws ou o Thunderbird, o Cory Sadowski tem um ótimo passo-a-passo, além de comentar sobre outras configurações de privacidade relevantes tanto no GNU/Linux quanto no Windows.

As instruções abaixo presumem que você já tem um par de chaves GnuPG pronto, com o gpg-agent(1) rodando no background para gerenciar suas chaves.

Background

A maioria dos guias de configuração do PGP para o Mutt online são bastante antigos e geralmente sugerem muitas linhas para o arquivo de configuração, .muttrc, que lidam diretamente com o comando gpg, com uma miríade de opções e algumas substituições de variáveis obscuras:

set pgp_clearsign_command="gpg --no-verbose --batch --output - ...
set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose ...
set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch ...
set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet ...
set pgp_encrypt_sign_command="pgpewrap gpg --passphrase-fd 0 ...
set pgp_export_command="gpg --no-verbose --export --armor %r"
set pgp_import_command="gpg --no-verbose --import -v %f"
set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons ...
set pgp_list_secring_command="gpg --no-verbose --batch --with-colons ...
set pgp_sign_command="gpg --no-verbose --batch --output - ...
set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint ...

Sou completamente a favor da filosofia do Unix de usar os programas em conjunto, mas isso é demais. Essa configuração é volúvel e muito difícil de trabalhar, além de requerer conhecimento demais do gpg(1) para ser usada e editada sensatamente. Afinal de contas, queremos uma configuração que possamos entender razoavelmente bem.

Então esqueça tudo aquilo; ao invés disso, iremos usar o GPGME. A configuração acima é exatamente o problema que essa biblioteca foi projetada para resolver: os aplicativos podem se ligar a ela para simplificar o uso das funções do GnuPG, incluindo a interface com agentes. Podemos substituir todas as linhas acima com o seguinte:

set crypt_use_gpgme = yes

Instalação

Se você tem o Mutt instalado, há chances que ele já possua uma interface para o GPGME. Você pode checar se sua versão atual do Mutt é capaz de utilizá-lo com a saída de mutt -v version. Essa é a saída do meu, usando o Mutt empacotado para o Debian GNU/Linux, que suporta o GPGME:

$ mutt -v | grep -i gpgme
+CRYPT_BACKEND_CLASSIC_PGP  +CRYPT_BACKEND_CLASSIC_SMIME  +CRYPT_BACKEND_GPGME
upstream/548577-gpgme-1.2.patch

Se você não tem uma versão do Mutt com GPGME, você pode fazer o download do código fonte e compilá-lo com a opção --enable-gpgme:

$ ./configure --enable-gpgme
$ make
# make install

Você pode ter de instalar a biblioteca GPGME e suas headers antes disso:

# apt-get install libgpgme11 libgpgme11-dev

Configuração

Adicione as seguintes linhas ao arquivo .muttrc; remova qualquer texto que comece por crypt_* ou pgp_*:

# Use o GPGME
set crypt_use_gpgme = yes

# Assine as respostas para emails já assinados
set crypt_replysign = yes

# Criptografe as respostas para emails já criptografados
set crypt_replyencrypt = yes

# Criptografe e assine as respostas para emails já criptografados e assinados
set crypt_replysignencrypted = yes

# Tente verificar assinaturas automaticamente
set crypt_verify_sig = yes

Reinicie o Mutt e pronto.

Uso

Primeiramente, verifique se você tem a chave pública do seu destinatário disponível em seu chaveiro do GnuPG:

$ gpg --list-keys joao@exemplo.com.br

Se ela estiver disponível para download, você pode baixá-la usando o curl(1) e importá-la diretamente com o gpg(1):

curl http://www.exemplo.com.br/joao-ninguem.asc | gpg --import
gpg: key 1234ABCD: public key "João Ninguém" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg: no ultimately trusted keys found

Lembre-se: é sua responsabilidade decidir o grau de confiança que tem nessa chave; normalmente, a melhor prática é que vocês se encontrem em pessoa para trocar as fingerprints das chaves, de modo que se tenha certeza absoluta de que a chave corresponde àquele usuário.

Se você conhece mais ninguém que use o PGP para se comunicar, você pode me enviar uma mensagem criptografada com minha chave pública, 0x77BB8872, para tom@sanctum.geek.nz (em inglês). Caso você me envie sua chave pública, ou insira um link em sua mensagem, irei respondê-la com outra mensagem criptografada com a sua chave pública, para que você pode verificar se tudo está funcionando.

$ curl http://static.sanctum.geek.nz/thomas-ryder.asc | gpg --import  

Você também pode enviar uma mensagem criptografada com a chave pública do tradutor desse artigo, 0x2D4BF1D0, para rberaldo@cabaladada.org (em português ou inglês).

$ curl http://www.cabaladada.org/public/rberaldo.asc | gpg --import

Voltando ao Mutt, comece a compor sua mensagem com a tecla m. Preencha os campos de destinatário e assunto normalmente e escreva sua mensagem. Quando terminar, salve e saia do $EDITOR e sua mensagem estará em sua tela de Composição, esperando para ser enviada. Aperte p para acessar o menu do PGP, que aparecerá na parte de baixo da tela:

PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, s/(m)ime or (c)lear?

Pressione b para assinar e criptografar a mensagem.

Caso você queira ser capaz de ler a mensagem após enviá-la, será necessário criptografá-la tanto com a sua chave quanto com a do destinatário. Em minha experiência, a maneira mais simples de fazer isso é adicionar o seu próprio endereço ao campo Bcc: pressionando b. Você também pode deixar esse comportamento como padrão com a seguinte linha em ~/.gnupg/gpg.conf, onde 0x1234ABCD é a ID curta de sua chave:

encrypt-to 0x1234ABCD

Tela de Composição do Mutt

Quando você enviar a mensagem pressionando y, talvez seja necessário especificar quais chaves você deseja usar para quais destinatários, se você não possuir uma única chave para aquele endereço de email.

Além disso, você terá de inserir a senha de sua chave privada, que será requerida pelo programa de entrada de PIN, a menos que um agente já a tenha carregada. A senha é necessária para assinar a mensagem. Quando você a fornecer, a mensagem será enviada e, caso você tenha se inserido no campo Bcc:, você também deve ser capaz de lê-la em seus emails enviados, com alguns cabeçalhos mostrando informações do PGP (se a mensagem foi assinada, criptografada ou ambos):

Tela de Mensagens Enviadas do Mutt

O destinatário será capaz de descriptografar a mensagem usando sua chave privada, e ninguém mais além de vocês dois poderá lê-la. Note que isso funciona qualquer que seja número de destinatários, desde que você tenha a chave pública de cada um deles.

Lembre-se que os metadados da mensagens, tais como os nomes e endereços dos remetentes e destinatários, o dia e a hora em que foi enviada e (principalmente) o assunto, são enviados em texto plano. Apenas o corpo da mensagem (incluindo os anexos) é criptografado.

Alguns extras úteis

Com o GPGME, o Mutt tenta utilizar a primeira chave secreta disponível no chaveiro privado. Caso você queira utilizar outro par de chaves específico para assinar mensagens, você pode especificá-lo com a opção pgp_sign_as no arquivo .muttrc:

set pgp_sign_as = 0x9876FEDC

Se você deseja assinar automaticamente todas as mensagens que enviar, você pode configurar a opção crypt_autosign:

set crypt_autosign = yes

O primeiro conjunto de opções que configuramos anteriormente irá assinar e/ou criptografar mensagens automaticamente, em respostas para mensagens assinadas, criptografados ou ambos.

Se você desejar incluir um link para a sua chave PGP nos cabeçalhos das mensagens, é possível adicionar uma header personalizada com a opção my_hdr:

my_hdr X-PGP-Key: http://static.sanctum.geek.nz/thomas-ryder.asc

Todos esses aspectos, combinados com a rapidez e a configuração poderosa do Mutt, o tornam um cliente de email PGP conveniente e muito capaz. Como sempre, quanto mais pessoas que você conhecer utilizarem o PGP, e quanto mais chaves públicas você tiver, mais útil ele será.

Essa entrada é a parte 7 de 10 na série Criptografia no Linux.