Cyrus Imap: Lançado novo release para a versão 2.4 (2.4.18)

logo

Olá ! Embora o Cyrus Imap esteja com a versão 2.5 já estável, como muitos ainda estão utilizando a versão 2.4, portanto, gostaria de compartilhar o lançamento do novo release desta versão (2.4.18), com as seguintes correções:

  • Destacando o item “Disable use of SSLv2/SSLv3” que é fundamental para a correção da vulnerabilidade Poodle.

Captura de tela de 2015-07-07 13:56:49

Cyrus IMAP 2.5.0: Um horizonte promissor para o projeto !

Olá ! É com muito prazer que escrevo sobre a restruturação do projeto Cyrus IMAP. O Cyrus é um dos servidores POP/IMAP livres mais bem conceituados e seu ambiente Aggregator, que permite a distribuição de caixas em múltiplos servidores, é um dos grandes diferenciais desta solução.

Mas de fato o projeto encontrava-se parado, a última versão (2.4.17) havia sido lançada em Dezembro de 2012 e desde então apenas versões beta da integração do Caldav com esta versão foram lançadas.

Porém, no dia 19 de Fevereiro, Bron Gondwana (um dos principais desenvolvedores do projeto) anunciou a reformulação do projeto, com a formação da Cyrus Foundation, que captou recursos (financeiros e desenvolvedores) para levar o projeto a uma nova era ! As metas principais são: lançar o Cyrus 2.5.0 em Março de 2015 e a versão 3.0 em Julho do mesmo ano. Foi notória a empolgação da comunidade com este anuncio.

E cumprindo o cronograma, Jeroen van Meeuwen anunciou a liberação da versão 2.5 no dia 03 de Março :

https://docs.cyrus.foundation/imap/release-notes/2.5-current.html

Escreverei muito sobre o Cyrus este ano ! Por enquanto, seguem algumas das melhorias da versão 2.5.0:

  • AUTOCREATE
  • Suporte Caldav e Carddav
  • Suporte estendido de quotas: Número de pastas, mensagens e annotations
  • RFC 5464: METADADOS IMAP
  • Notificações de eventos
  • Melhorias da distribuição de partições: Mais opções para distribuição entre Backends e partições
  • Novo formato para o arquivo mailboxes.db
  • Suporte a bases twoskip: Mais segura, rápida do que o formato skiplist
  • Conta “Catchall” para o protocolo LMTP

Cyrus Aggegator: IMAP com escalabilidade

Em um artigo anterior, eu apresentei o Cyrus Imap e suas principais funcionalidades:

https://respirandolinux.wordpress.com/2013/03/20/sobre-o-cyrus-imap/

Agora apresento o Cyrus Aggregator, recurso nativo para escalabilidade do Cyrus. O ambiente Aggregator (muito vezes chamado também de Murder, devido a um artigo que foi publico com o título “Cyrus Aggregator: The Imap Murder”), permitir distribuir as caixas postais IMAP e POP entre diversos servidores de forma transparente aos usuários, isto é, sendo apresentado como único ambiente.

 A solução possui três classes de servidores: Frontend, Backend e Mupdate. Os clientes IMAP/POP se conectam aos servidores Fontends que por sua vez realizam a consulta no servidor Mupdate obtendo a localização da caixa postal do cliente conectado e o servidor Mupdate informa aos Fontends que estabelecem a comunicação com o Backend trazendo a caixa postal do usuário. Os servidores Backend armazenam as caixas postais e informam ao servidor Mupdate a sua localização, permissões e mudanças, o Mupdate sincroniza com os Frontends a posição das caixa postais e controla para que não haja conflitos.

Nesta arquitetura, os servidores Frontend recebem a relação de caixas postais do ambiente do servidor Mupdate, esta classe de servidor não possui dados, portanto é redundante em todos os aspectos. Se a relação de caixas postais corromper em algum servidor Frontend, basta remover essa base e sincronizar com o Mupdate novamente. É possível adicionar novos servidores Frontend e Backend a qualquer momento, sem impacto no ambiente.

 

 

Resolvendo inconsistências entre servidores Backend e Mupdate Master (Murder)

É possível que a relação de caixas postais do servidor Mupdate (Murder) perca a consistência com os servidores Backend do ambiente, como por exemplo uma caixa postal não estar mais listada no Backend e o Mupdate ainda a mantenha em sua lista. Isso pode ocorrer por falhas de comunicação (rede) entre os servidores ou erros de I/O no Mupdate. Como o servidor Mupdate é autoritativo no ambiente do Cyrus Aggregator, isto é, sua relação é considerada mandatória, não é possivel forçar novamente a criação de uma caixa no Backend que erroneamente esteja sendo listada no Mupdate.

No caso de ocorrer muitas inconsistências, o procedimento recomendado é:

  1. Parar o serviço do Cyrus no servidor Mupdate
  2. Parar o serviço do Cyrus no Backend
  3. Remover a relação de caixas posais (mailboxes.db) no servidor Mupdate
  4. Executar o comando ctl_mboxlist -m -a -w no servidor Backend como usuário Cyrus e com o serviço parado, o -w irá simular a operação, caso esteja de acordo, basta executar novamente sem esta opção.

Porém, não é viável parar o serviço caso ocorram pequenas inconsistências, para isso o utilitário cyr_dbtool do Cyrus, pode ser utilizado, ele consegue manipular o arquivo mailboxes.db, que geralmente fica no formato skiplist, sem a necessidade parar o serviço. Vejamos sua utilização:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist show

Informamos o caminho do arquivo (não é permitido utilizar caminhos relativos), seu formato, e por último, a operação a ser executada. Neste caso irá listar todos os registros presentes no arquivo.

Exemplo com o resultado do comando executado em um servidor Mupdate:

user.fabio            1 nome_do_backend!default fabio    lrswipkxtecda
user.fabio.Drafts    1 nome_do_backend!default fabio    lrswipkxtecda    
user.fabio.Sent     1 nome_do_backend!default fabio    lrswipkxtecda        
user.fabio.Trash    1 nome_do_backend!default fabio    lrswipkxtecda

Para remover um registro, utilizamos a operação delete:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Drafts
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Sent
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Trash

Desta forma, os registros serão removidos imediatamente da base, sendo possível criar as caixas novamente no servidor Backend. O comando não permite o uso de caracteres coringas.

Cyrus Imap: Eliminar mensagens “fetching user deny” no código

Olá ! Anteriormente, eu havia publicado uma dica para remover as mensagens “fetching user_deny” geradas pelo cyrus dos logs criando um filtro no Rsyslog (https://respirandolinux.wordpress.com/2013/01/16/cyrus-imap-muitas-mensagens-fetching-user_deny-no-log/), caso esteja compilando o Cyrus, segue o link com o patch para eliminar essas mensagens direto no código:

github.com/fsschmidt/cyrusimap/blob/master/Patches/user_deny_silence.patch

Obs.: Testado com a última versão até o momento, 2.4.17.

Scripts para o Cyrus Imap: Criar caixas postais e definir quota

Em um post anterior, compartilhei dois scripts, para definir permissão para o usuário admin e remover caixas postais no Cyrus Imap, agora compartilho com vocês os scripts para criar caixas postais e definir quota, também criei um script maior que além de criar a caixa postal já define a permissão e aplica a quota.

Os scripts estão disponibilizados em https://github.com/fsschmidt/cyrusimap conforme abaixo:

Criar caixa postal:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas.pl

Definir quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/setarquota.pl

Criar a caixa postal definindo permissão e quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas_completo.pl

Sobre o Cyrus IMAP

Compartilho com vocês um pequeno trecho do conteúdo de treinamento baśico de Cyrus Imap, que irei oferecer gratuitamente:

O Cyrus IMAP (http://www.cyrusimap.org) é um servidor POP/IMAP de alta performance e altamente escalável, desenvolvido pela Carnegie Mellon University (CMU), ele possibilita acessos simultâneos (leitura/escrita) a uma mesma caixa postal e quotas e regras de acesso (ACL) a qualquer caixa da hierarquia.

Nos repositórios estáveis das distribuições (Red Hat, Suse, Debian,etc…) até o momento a versão disponibilizada do Cyrus Imap é bastante antiga (2.2.13), que não é mais atualizada, recebendo somente atualizaçõs de segurança. Portanto, recomenda-se a utilização da versão atual, 2.4 , que possibilita o uso de replicação nativa e diversas melhorias para o ambiente Aggregator, além diversas melhorias no código para estabilidade, performance e segurança.

O Cyrus Imap opera somente com seu formato de armazenamento, não sendo possível utilizar os formatos Maildir, Mailbox ou qualquer outra configuração. Por padrão, o Cyrus Imap armazena as mensagens e meta-arquivos na mesma estrutura de diretório, o armazenamento de mensagens é constituído por diversos arquivos pequenos que não são acessados tão frequentemente, uma mensagem é acionada somente quando o usuário abre a mesma, os meta-arquivos são separados em arquivos por caixa postal (pasta): header, index, cache, expunge e squat, sendo os três primeiros para indexação e recuperação dos cabeçalhos das mensagens, o expunge para controle de remoção atrasada se essa opção estiver habilitada e o arquivo squat contém uma indexação específica para pesquisa de mensagens, com ganho de 20 a 30% em relação a indexação padrão para operações que envolvam pesquisa, sendo o maior dos meta-arquivos, se a mensagem não estiver referenciada neste arquivo será recuperada através da indexação normal, porém com desempenho inferior.

Sabendo que os meta-arquivos são acessados com mais frequência e ocupam um espaço relativamente pequeno, cerca de 10% para toda a estrutura de caixas postais do usuário (esse resultado foi obtido a partir de estudos com implementações reais até 1000 usuários), é uma boa estratégia configurar o Cyrus Imap para separar esses arquivos em meta-partições que utilizam discos mais rápidos para obter um melhor desempenho das operações de I/O no servidor IMAP.

A partir da versão 2.3 essa configuração é possível utilizando os parâmetros metadata no arquivo de parametrização do Cyrus Imap. Como conceito, cada partição pode ter somente uma meta-partição e a definição de quais arquivos serão separados é global, ou seja, é definido quais meta-arquivos ficarão separados em meta-partição e essa configuração é compartilhada para todas as partições.

Scripts para o Cyrus Imap: Aplicar permissão e remover caixas postais

Precisei executar um procedimento para remover cerca de 400 caixas postais no Cyrus Imap, como certamente executar essa tarefa manualmente não seria nada adequado criei um script em Perl para remover essas caixas postais em lote, porém algumas em algumas caixas postais o usuário administrador não possuía as devidas permissões, compartilho com vocês os dois scripts, para aplicar as permissões corretas e remover as caixas postais desejadas:

(Os scripts também estão disponbilizados em https://github.com/fsschmidt/cyrusimap)

Aplicar permissão:

#!/usr/bin/perl -w
#Autor: Fabio S. Schmidt <fabio_schmidt@hotmail.com>
#Revisao em: 14/03/2013
#Script para aplicar permissao em caixas postais do Cyrus Imap
use Cyrus::IMAP::Admin;
#
# PARAMETROS DE CONFIGURACAO
#
my $cyrus_server = $ARGV[2];
my $cyrus_user = “admin”;
my $matricula = $ARGV[1];
my $mechanism = “login”;
if (!$ARGV[1]) {
    die “Usage: $0 SENHA MAILBOX SERVIDOR\n”;
} else {
    $cyrus_pass = “$ARGV[0]”;
}
print “Aplicando permissao ALL para o usuario $cyrus_user na caixa : $matricula. \n”;
aplicapermissao($matricula);
sub aplicapermissao {
    my ($user, $subfolder) = @_;
    my $cyrus = Cyrus::IMAP::Admin->new($cyrus_server);
    $cyrus->authenticate($mechanism,’imap’,”,$cyrus_user,’0′,’10000′,$cyrus_pass);
    $cyrus->setaclmailbox(“user.$matricula”, ‘expresso-admin’, ‘all’);
    if ($cyrus->error) {
        print STDERR “Error: “, $matricula,” “, $cyrus->error, “\n”;
    } else {
        print “Permissao concedida para o usuario $matricula.\n”;
    }
}
Remover caixa postal:
#!/usr/bin/perl -w
#Autor: Fabio S. Schmidt <fabio_schmidt@hotmail.com>
#Script para remover caixas postais do Cyrus Imap
use Cyrus::IMAP::Admin;
#
# PARAMETROS DE CONFIGURACAO
#
my $cyrus_server = $ARGV[2];
my $cyrus_user = “admin”;
my $matricula = $ARGV[1];
my $mechanism = “login”;
if (!$ARGV[1]) {
    die “Usage: $0 SENHA MAILBOX SERVIDOR\n”;
} else {
    $cyrus_pass = “$ARGV[0]”;
}
print “Removendo usuario : $matricula. \n”;
removeusuario($matricula);
sub removeusuario {
    my ($user, $subfolder) = @_;
    my $cyrus = Cyrus::IMAP::Admin->new($cyrus_server);
    $cyrus->authenticate($mechanism,’imap’,”,$cyrus_user,’0′,’10000′,$cyrus_pass);
    $cyrus->deletemailbox(“user.$matricula”);
    if ($cyrus->error) {
        print STDERR “Error: “, $matricula,” “, $cyrus->error, “\n”;
    } else {
        print “Usuario $matricula foi removido com sucesso.\n”;
    }
}
Para executar os comandos em lote, basta criar um laço FOR conforme o exemplo abaixo:
#!/bin/bash
# EXCLUIR CAIXAS POSTAIS DO CYRUS IMAP
echo “Excluindo caixas postais do CYRUS IMAP…”
for i in `cat remover_caixas.txt`
do perl remover_caixas.pl SENHA $i SERVIDOR
done

Cyrus Imap: Muitas mensagens fetching user_deny no log

Ao instalar o Cyrus Imap 2.4 (essa dica se aplica a todas versões do Cyrus), observei que a mensagem fetching user_deny  estava sendo repetida muitas vezes a cada conexão, conforme o exemplo abaixo:

cyrus/imap[19325]: fetching user_deny.db entry for ‘usuario’

Para criar uma exceção no ryslog para que a mensagem não seja mais exibida basta criar o aquivo /etc/rsyslog.d/cyrus-imapd.conf conforme abaixo:

if $programname == ‘cyrus’ and $msg contains_i ‘fetching user_deny’ then ~

Feito isso, basta reiniciar o serviço do rsyslog que a mensagem não será mais exibida.

Cyrus aggregator: Servidor Backend retornar mensagem de férias / fora do escritório

Essa dica é para quem possui o Cyrus Aggregator ou pretende implementá-lo,  para que o serviço Sieve no servidor Backend consiga enviar a mensagem de férias (ou fora do escritório), é necessário ter um MTA configurado localmente. Abaixo segue uma configuração básica caso opte por utilizar o Postfix para atender esta demanda, o SMTP configurado no Backkend somente irá efetyar Relay para o servidor SMTP desejado:

O arquivo abaixo também está publicado em: https://github.com/fsschmidt/cyrusimap/blob/master/Aggregator/backend-main.cf

# Arquivo de configuração para servidores Backend com Cyrus Aggregator
# Efetua o relay para o servidor SMTP desejado
# Debian specific: Specifying a file name will cause the first
smtpd_banner = $myhostname ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = NOME_DA_MAQUINA
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = NOME_DA_MAQUINA
#ENDERECO DO SERVIDOR SMTP PARA ENCAMINHAR A MENSAGEM
relayhost = SMTP_PARA_EFETUAR_RELAY
#CONTROLE DE ACESSO, INCLUIR SOMENTE LOCALHOST E IP DO PROPRIO SERVIDOR
mynetworks = 127.0.0.0/8 IP_REDE_SERVIDOR_BACKEND/32
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4