Dovecot

De Biblioteca Unix

Conteúdo

Dovecot

Debian Lenny 5.0

Instalando os Pacotes necessários

O Debian tem o dovecot na versão 1.0.15 e o backports com mais configurações está na versão 1.2.11 que corrige diversos pequenos problemas como múltiplos campos de senha e melhor definição para quotas, por isso vamos utilizá-lo.

# apt-get install -t lenny-backports dovecot-pop3d dovecot-imapd

feito isso, vamos configurá-lo.

Autenticação por SQL

Configuração por LDAP

Os arquivos de configuração do Dovecot ficam em /etc/dovecot, nossa intensão é ativar o POP3/IMAP, para isso vamos definir algumas coisas:

  1. Local onde serão armazenados os e-mails
  2. Forma de alocação de Quota

com isso em mente vamos editar o arquivo:

# vim/etc/dovecot/dovecot.conf
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl = yes
ssl_ca_file = /etc/ssl/certs/cacert.pem
ssl_cert_file = /etc/ssl/certs/postfix-crt.pem
ssl_key_file = /etc/ssl/private/postfix-key.pem
verbose_ssl = no
mail_location = maildir:/home/vmail/ufms.br/%u
mail_uid = 500
mail_gid = 500
mail_privileged_group = vmail
first_valid_uid = 500
last_valid_uid = 500
first_valid_gid = 500
last_valid_gid = 500
protocol imap {
  mail_max_userip_connections = 10
  mail_plugins = quota imap_quota trash
}  
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
  mail_plugins = quota
}
protocol managesieve {
}
protocol lda {
  postmaster_address = postmaster@ufms.br
  mail_plugins = quota trash
  sendmail_path = /usr/lib/sendmail
  auth_socket_path = /var/run/dovecot/auth-master
}
auth default {
  mechanisms = plain login
  passdb ldap {
    args = /etc/dovecot/dovecot-ldap.conf
  }
  passdb ldap {
    args = /etc/dovecot/dovecot-ldap.conf
  }
  user = root
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0660
      user = vmail
      group = vmail
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
    }
  }
}
dict {
  quota  = pgsql:/etc/dovecot/dovecot-dict-quota.conf
  expire = pgsql:/etc/dovecot/dovecot-dict-quota.conf
}
dict_db_config = /etc/dovecot/dovecot-db.conf
plugin {
  quota = dict:user::proxy::quota
  quota_rule2 = Trash:storage=10240
  trash = /etc/dovecot/dovecot-trash.conf
  expire = Trash 7 Spam 30
  expire_dict = proxy::expire
}

alguns arquivos são adicionais nesta configuração, vamos a eles:

# vim /etc/dovecot/dovecot-ldap.conf
uris = ldaps://ldap.dominio.br
dn = cn=reader,dc=dominio,dc=br
dnpass = SENHA
debug_level = 0
auth_bind = yes
auth_bind_userdn = uid=%u,ou=people,dc=dominio,dc=br
ldap_version = 3
base = dc=dominio,dc=br
scope = subtree
user_attrs = mailQuotaSize=quota=maildir:storage
user_filter = (&(objectClass=qmailUser)(uid=%u)(mail=*@dominio.br)(accountStatus=active))
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=qmailUser)(uid=%u)(mail=*@dominio.br)(accountStatus=active))
default_pass_scheme = SSHA

isso vai fazer com que sejam buscados os usuários %u cujo e-mail tenha o domínio em questão e a conta esteja ativa. Agora vamos a configuração de quota:

connect = host=localhost dbname=quotadb user=quota password=SENHA
map {
  pattern = priv/quota/storage
  table = quota
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota
  username_field = username
  value_field = messages
}
map {
  pattern = shared/expire/$user/$mailbox
  table = expires
  value_field = expire_stamp
  fields {
    username = $user
    mailbox = $mailbox
  }
}


e essas informações podem estar tanto no MySQL quanto no PostgreSQL, a tabela por padrão fica:

CREATE TABLE quota (
 username varchar(100) not null,
 bytes bigint not null default 0,
 messages integer not null default 0,
 primary key (username)
);

e a tabela de expiração:

CREATE TABLE expires (
 username varchar(75) not null,
 mailbox varchar(255) not null,
 expire_stamp integer not null,
 primary key (username, mailbox)
);

se estivermos usando o PostgreSQL em especial é necessário ainda adicionar as seguintes triggers:

CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION merge_quota() RETURNS TRIGGER AS $$
BEGIN
  IF NEW.messages < 0 OR NEW.messages IS NULL THEN
    -- ugly kludge: we came here from this function, really do try to insert
    IF NEW.messages IS NULL THEN
      NEW.messages = 0;
    ELSE
      NEW.messages = -NEW.messages;
    END IF;
    return NEW;
  END IF; 

  LOOP
    UPDATE quota SET bytes = bytes + NEW.bytes,
      messages = messages + NEW.messages
      WHERE username = NEW.username;
    IF found THEN
      RETURN NULL;
    END IF; 

    BEGIN
      IF NEW.messages = 0 THEN
        INSERT INTO quota (bytes, messages, username)
          VALUES (NEW.bytes, NULL, NEW.username);
      ELSE
        INSERT INTO quota (bytes, messages, username)
          VALUES (NEW.bytes, -NEW.messages, NEW.username);
      END IF;
      return NULL;
    EXCEPTION WHEN unique_violation THEN
      -- someone just inserted the record, update it
    END;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER mergequota BEFORE INSERT ON quota
   FOR EACH ROW EXECUTE PROCEDURE merge_quota();

para as quotas e para a expiração:

CREATE OR REPLACE FUNCTION merge_expires() RETURNS TRIGGER AS $$
BEGIN
  UPDATE expires SET expire_stamp = NEW.expire_stamp
    WHERE username = NEW.username AND mailbox = NEW.mailbox;
  IF FOUND THEN
    RETURN NULL;
  ELSE
    RETURN NEW;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER mergeexpires BEFORE INSERT ON expires
   FOR EACH ROW EXECUTE PROCEDURE merge_expires();

pronto, vamos agora para a última configuração no Dovecot em si:

# vim /etc/dovecot/dovecot-trash.conf
1 Spam
2 Trash
3 Sent
3 Sent Messages

que define a ordem que as mensagens devem ser apagadas na expiração e a configuração do BDB usado no Dovecot:

# vim /etc/dovecot/dovecot-db.conf
set_tx_max 1000

agora é necessário criar um um usuário para manipular este e-mails, o usuário será chamado de vmail, nas configurações vocês viram que definimos um uid/gid como 500, então:

# mkdir /srv/domains
# groupadd -g 500 vmail
# useradd -d /srv/domains -g vmail -r -u 500 vmail

feito isso, podemos reinicializar o Dovecot para funcionar como POP3/IMAP para nosso domínio.

Testando as configurações

Para testar se tudo deu certo, podemos conectar via telnet no serviço e testar a autenticação:

# 'telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN  AUTH=LOGIN] Dovecot ready.
a login USUARIO SENHA <ENTER>

se a resposta for algo como:

a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY  THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST- EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST- STATUS QUOTA] Logged in

onde o que mais importa é o a OK que significa que o login foi bem sucedido.

Gerando as Chaves para TLS

Primeiro editamos o arquivo /etc/ssl/openssl.cnf com as nossas configurações. Depois seguimos os passos abaixo.

  1. Criar a a nossa nova AC:
# /usr/lib/ssl/misc/CA.sh -newca
  1. Emitir uma requisição de chave:
# /usr/lib/ssl/misc/CA.sh -newreq
  1. Assinar a chave criada:
# /usr/lib/ssl/misc/CA.sh -sign

depois disso vamos copiar as chaves para seus locais corretos:

# cp demoCA/cacert.pem /etc/ssl/certs/
# openssl rsa -in newkey.pem -out postfix-key.pem
# mv postfix-key.pem /etc/ssl/private/
# mv newcert.pem /etc/ssl/certs/postfix-crt.pem
# chown root.root /etc/ssl/private/postfix-key.pem
# chmod 400 /etc/ssl/private/postfix-key.pem

pronto, as chaves foram geradas.

Ativando o Managesieve

Edite o arquivo /etc/dovecot/dovecot.conf e adicione a o protocolo managesieve na lista de protocolos:

protocols = imap imaps pop3 pop3s managesieve

altere o seu managesieve de forma a ativá-lo da forma desejada, no nosso caso, queremos que ele rode somente em localhost e se identifique como Cyrus:

protocol managesieve {
  listen = localhost:2000
  managesieve_implementation_string = Cyrus timsieved v2.2.19
}

como nosso Webmail é local, deixamos o sieve ativo somente para localhost.

Na configuração dos plugins é necessário adicionar as seguintes linhas:

sieve=/home/vmail/dominio.br/%u/dovecot.sieve
sieve_dir=/home/vmail/dominio.br/%u/sieve
sieve_before = /etc/dovecot/sieve/global/dovecot.sieve

adapte para o seu caso, lembrando que: %d pode ser utilizado para capturar o domínio, para quem utiliza multi-domínios.

Entregando Spam direto no diretório correto usando Managesieve

Muitas pessoas utilizam o procmail para entregar os e-mails classificados como Spam para seus usuários, já que estamos usando LDA, vamos configurar o Sieve para entrega-los no local correto.

Primero precisamos dizer ao LDA que ele vai utilizar o sieve como plugin, adicione na lista de plugins do LDA o seguinte:

mail_plugins = ... sieve

e defina onde vai ficar o script global de Sieve (também dentro de LDA):

sieve_global_path = /etc/dovecot/sieve/global/dovecot.sieve 

depois disso nós configuramos o script para entregar o Spam na caixa de Spam:

# vim /etc/dovecot/sieve/global/dovecot.sieve 
require "fileinto"; 
if header :contains "X-Spam-Flag" "YES" { 
    fileinto "Junk"; 
}

Agora altere as permissões de leitura para que o usuário vmail possa manipular este arquivo:

# chown -R vmail:vmail /etc/dovecot/sieve/global/
# chmod -R 770 /etc/dovecot/sieve/global/

reinicialize o Dovecot:

# /etc/init.d/dovecot restart

pronto.

--Brivaldo 17h56min de 4 de agosto de 2010 (UTC)

Ferramentas pessoais