A partir desta parte da série começamos a especializar nosso servidor para a tarefa final dele. Isso acontece com o ViMbAdmin, que nada mais é que uma interface bacana para administrar o backend que provê os domínios e contas virtuais para o serviço de email e agendas. Ele faz a mesma coisa que o Postfix Admin, só que é mais bonito.

Antes de partirmos para a instalação e configuração do ViMbAdmin, cabe uma breve explicação sobre o que são domínios e contas virtuais.

Tipicamente, sistemas baseados em Unix possuem usuários cadastrados no sistema. É com um usuário desse que você faz o login via SSH, o que implica que sua conta de usuário existe fisicamente no sistema.

Cada usuário tem a sua caixa de correio. As contas de usuários em um servidor recebem mensagens de outros usuários no mesmo servidor ou de usuários em outros servidores através do MTA. Todas as mensagem são colocadas na caixa de correio do usuário de destino pelo MDA. O que também implica em dizer que a caixa de correio também existe fisicamente no servidor e que é atrelada à conta.

Quando o MTA e o MDA são configurados para responder para domínios e usuários virtuais, nenhum usuário só do email possui uma conta Unix no servidor, mas mesmo assim possui uma caixa de correio. O ViMbAdmin viabiliza essas contas virtuais.

Composer e Memcached

O ViMbAdmin necessita de alguns pré-requisitos: o Composer e o Memcached. Vamos instalá-los.

A instalação do Composer é bem simples. Basta rodar:

# cd
# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer

Se você receber um aviso dizendo que PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub, ignore.

Agora o Memcached. Ele é mais chatinho de instalar e configurar. O modo mais fácil é usar o sbopkg.

# sbopkg -r
<responda C>
# sbopkg -i memcached
<reponda P>

Aguarde a compilação e a instalação terminar para podermos alterar umas coisinhas.

Como o Memcached vai rodar com o usuário sem privilégios nobody, precisamos criar um diretório onde ele tem permissões para escrever o arquivo com o identificador do processo, uma vez que o /var/run só pode ser escrito pelo root.

# mkdir /var/run/memcached
# chown nobody /var/run/memcached

Edite o arquivo /etc/rc.d/rc.memcached para fazer as alterações abaixo.

--- rc.memcached.default        2015-05-15 00:46:49.798578010 -0300
+++ rc.memcached        2015-05-15 00:59:35.177744509 -0300
@@ -7,11 +7,12 @@
# to automatically start and stop the memcached service.
#

-PID="/var/run/memcached.pid"
+PID="/var/run/memcached/memcached.pid"
USER="nobody"
+OPTIONS="-l 127.0.0.1 -u $USER -m 10 -P $PID -d"

memcached_start() {
-       memcached -d -u $USER -P $PID
+       memcached $OPTIONS
}

memcached_stop() {

Agora precisamos iniciar o Memcached.

# chmod 755 /etc/rc.d/rc.memcached
# /etc/rc.d/rc.memcached start
# ss -ltp|grep memcached
LISTEN     0      128             127.0.0.1:11211                    *:*        users:(("memcached",17954,26))

Com Memcached no lugar, precisamos instalar a extensão que faz com que o PHP consiga usá-lo.

# sbopkg -i php-memcache

Edite o arquivo para remover o comentário da linha extension.

; Enable memcache extension
extension=memcache.so

Reinicie o PHP-FPM.

# /etc/rc.d/rc.php-fpm restart

Prontinho. Os pré-requisitos do ViMbAdmin estão no jeito.

ViMbAdmin is in da house

A instalação do ViMbAdmin é chatinha, cheia de vai e volta.

# export VIMBADMIN_PATH=/var/www/backend
# composer create-project opensolutions/vimbadmin $VIMBADMIN_PATH -s dev
<responda 'n' para 'Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]?'>
# ln -s /var/www/backend/application/configs /etc/vimbadmin
# chown -R nobody $VIMBADMIN_PATH/var
# mysql -u root -p
<digite a senha do root do MariaDB conforme definida na parte III.>
MariaDB [(none)]> CREATE DATABASE `vimbadmin`;
MariaDB [(none)]> GRANT ALL ON `vimbadmin`.* TO `vimbadmin`@`localhost` IDENTIFIED BY '<senha fodona do vimbadmin>';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> <CTRL+D>
# cp /etc/vimbadmin/application.ini.dist /etc/vimbadmin/application.ini
# cp $VIMBADMIN_PATH/public/.htaccess.dist $VIMBADMIN_PATH/public/.htaccess

Agora precisamos configurar o acesso ao banco de dados para continuar. Abra o arquivo /etc/vimbadmin/application.ini e altere conforme abaixo.

resources.doctrine2.connection.options.password = '<senha fodona do vimbadmin>'

Hora de criar as tabelas.

# cd $VIMBADMIN_PATH
# ./bin/doctrine2-cli.php orm:schema-tool:create

São necessárias algumas configurações no nginx para o ViMbAdmin funcionar, mas as 'árveres semos nozes' e já fizemos isso na parte IV e V. Então é só acessar https://mail.exemplo.com:3443/.

Você verá a interface de instalação do ViMbAdmin. Ela contém algumas informações que precisamos adicionar no arquivo configuração. Copie os três parâmetros, securitysalt, resources.auth.oss.rememberme.salt e defaults.mailbox.password_salt e cole-os no lugar apropriado em /etc/vimbadmin/application.ini.

Um pouco mais abaixo, no passo 2, defina um email que será usado para administrar as contas. Essa conta vai existir de fato depois, mas será usada para tarefas estritamente administrativas. Vamos usar como exemplo administrador@exemplo.com.

Também defina uma senha fodona para esse usuário. Lembre-se: ele é o usuário que poderá fazer tudo em seu servidor. Essa senha precisa ser a mais forte possível. Não clique no ícone para gerar a senha, uma vez que o ViMbAdmin não te mostra qual senha ele gerou e ainda não temos um servidor de email para recebermos a nova senha. Digite-a você mesmo.

Antes de continuar, uma ressalva. O ViMbAdmin 'telefona para casa' quando uma nova instalação é concluída. Eu particularmente não gosto disso. Felizmente é possível desativar esse antirrecurso, mas você só tem uma chance de fazê-lo e é agora. Edite o arquivo de configuração e ajuste skipInstallPingback = 1. Se você deixar o valor 0, ele ligará pra casa.

Agora clique em Activate My Account para prosseguir. Na página seguinte você vai receber um aviso informando que não foi possível enviar o email de boas vindas com a senha para o administrador. Evidente! Não há servidor de email ainda.

Antes de fazer o login, vamos fazer algumas configurações adicionais. Edite novamente o arquivo /etc/vimbadmin/application.ini e altere os parâmetros conforme o patch abaixo. Não deixe de adaptá-los conforme a sua necessidade.

--- application.ini.dist        2015-05-15 01:20:46.688744509 -0300
+++ application.ini     2015-05-15 02:22:59.232348660 -0300
@@ -31,9 +31,9 @@
; When installing for the first time, it may be useful to set the following
; to 1 BUT ensure you set it to zero again in a production system

-phpSettings.display_startup_errors = 1
-phpSettings.display_errors = 1
-resources.frontController.params.displayExceptions = 1
+phpSettings.display_startup_errors = 0
+phpSettings.display_errors = 0
+resources.frontController.params.displayExceptions = 0

@@ -56,9 +56,8 @@
;; here and uncomment MemcacheCache.
;;

-resources.doctrine2cache.type                    = 'ArrayCache'
-;resources.doctrine2cache.type                    = 'MemcacheCache'
-;resources.doctrine2cache.memcache.servers.0.host = '127.0.0.1'
+resources.doctrine2cache.type                    = 'MemcacheCache'
+resources.doctrine2cache.memcache.servers.0.host = '127.0.0.1'
resources.doctrine2cache.namespace              = 'ViMbAdmin3'

@@ -68,13 +67,13 @@
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Configuration
; See: https://github.com/opensolutions/ViMbAdmin/wiki/Quotas

-defaults.domain.quota = 0
-defaults.domain.maxquota = 0
+defaults.domain.quota = 5368709120
+defaults.domain.maxquota = 10737418240
defaults.domain.transport = "virtual"
defaults.domain.aliases = 0
-defaults.domain.mailboxes = 0
+defaults.domain.mailboxes = 20

-defaults.quota.multiplier = 'MB'
+defaults.quota.multiplier = 'GB'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -103,7 +102,7 @@
;;
;; Enable or disable display of sizes. Default: disabled

-defaults.list_size.disabled = true
+defaults.list_size.disabled = false

;; Maildir size units. By default: KB. One of B, KB, MB or GB.
defaults.list_size.multiplier = 'GB'
@@ -114,8 +113,8 @@
; Default values for creating mailboxes

; This sets the uid and gid columns in the mailbox table to the below values
-defaults.mailbox.uid = 2000
-defaults.mailbox.gid = 2000
+defaults.mailbox.uid = 5000
+defaults.mailbox.gid = 5000

; Set the homedir and maildir values in the mailbox table where the
@@ -128,8 +127,8 @@
;
; http://wiki2.dovecot.org/VirtualUsers/Home

-defaults.mailbox.maildir = "maildir:/srv/vmail/%d/%u/mail:LAYOUT=fs"
-defaults.mailbox.homedir = "/srv/vmail/%d/%u"
+defaults.mailbox.maildir = "maildir:/var/mail/vmail/%d/%u:LAYOUT=fs"
+defaults.mailbox.homedir = "/var/mail/vmail/%d/%u"

;minimum mailbox password length
defaults.mailbox.min_password_length = 8
@@ -146,7 +145,7 @@
;                      scheme specified by XXX. To see available schemes, use 'dovecotpw -l'
;                      or 'doveadm pw -l'

-defaults.mailbox.password_scheme = "md5.salted"
+defaults.mailbox.password_scheme = "crypt:sha512"

; The path to (and initial option(s) if necessary) the Dovecot password generator. Typical 
; values may be something like:
@@ -174,14 +173,14 @@
server_id = 1

;;Archive options
-binary.path.chown_R   = "/bin/chown -R"
-binary.path.tar_cf    = "/bin/tar -cf"
-binary.path.tar_xf    = "/bin/tar -xf"
-binary.path.bzip2_q   = "/bin/bzip2 -q"
-binary.path.bunzip2_q = "/bin/bunzip2 -q"
-binary.path.rm_rf     = "/bin/rm -rf"
+binary.path.chown_R   = "/usr/bin/chown -R"
+binary.path.tar_cf    = "/usr/bin/tar -cf"
+binary.path.tar_xf    = "/usr/bin/tar -xf"
+binary.path.bzip2_q   = "/usr/bin/bzip2 -q"
+binary.path.bunzip2_q = "/usr/bin/bunzip2 -q"
+binary.path.rm_rf     = "/usr/bin/rm -rf"

-archive.path = "/srv/archives"
+archive.path = "/root/mboxarchive"

@@ -226,20 +225,20 @@
server.smtp.enabled = 1
server.smtp.host    = "mail.%d"
server.smtp.user    = "%m"
-server.smtp.port    = "465"
-server.smtp.crypt   = "SSL"
+server.smtp.port    = "587"
+server.smtp.crypt   = "TLS"

-server.pop3.enabled = 1
+server.pop3.enabled = 0
server.pop3.host  = "gpo.%d"
server.pop3.user  = "%m"
server.pop3.port  = "995"
server.pop3.crypt = "SSL"

server.imap.enabled = 1
-server.imap.host  = "gpo.%d"
+server.imap.host  = "mail.%d"
server.imap.user  = "%m"
server.imap.port  = "993"
-server.imap.crypt = "SSL"
+server.imap.crypt = "TLS"

server.webmail.enabled = 1
server.webmail.host  = "https://webmail.%d"
@@ -251,23 +250,23 @@
;;
;; Identity

-identity.orgname  = "Example Limited"
-identity.name  = "Example Support Team"
-identity.email = "support@example.com"
-identity.autobot.name  = "ViMbAdmin Autobot"
-identity.autobot.email = "autobot@example.com"
-identity.mailer.name   = "ViMbAdmin Autobot"
-identity.mailer.email  = "do-not-reply@example.com"
+identity.orgname  = "Nome da Minha Empresa ou Eu Mesmo"
+identity.name  = "EuMesmo DevOps"
+identity.email = "devops@exemplo.com"
+identity.autobot.name  = "EuMesmo Backend Autobot"
+identity.autobot.email = "robozinho@exemplo.com"
+identity.mailer.name   = "EuMesmo Backend Mailer"
+identity.mailer.email  = "naoresponda@exemplo.com"

-identity.sitename = "ViMbAdmin"
-identity.siteurl = "https://www.example.com/vimbadmin/"
+identity.sitename = "EuMesmo Backend"
+identity.siteurl = "https://mail.exemplo.com:3443/"

;;
;; All mail and correspondence will come from the following;;

-server.email.name = "ViMbAdmin Administrator"
-server.email.address = "support@example.com"
+server.email.name = "EuMesmo Backend Administrator"
+server.email.address = "devops@exemplo.com"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -593,14 +592,13 @@

resources.doctrine2cache.autoload_method    = "composer"
-;resources.doctrine2cache.type              = 'ArrayCache'
-;resources.doctrine2cache.type               = 'MemcacheCache'
-;resources.doctrine2cache.memcache.servers.0.host       = '127.0.0.1'
-;resources.doctrine2cache.memcache.servers.0.port       = '11211'
-;resources.doctrine2cache.memcache.servers.0.persistent = false
-;resources.doctrine2cache.memcache.servers.0.weight     = 1
-;resources.doctrine2cache.memcache.servers.0.timeout    = 1
-;resources.doctrine2cache.memcache.servers.0.retry_int  = 15
+resources.doctrine2cache.type               = 'MemcacheCache'
+resources.doctrine2cache.memcache.servers.0.host       = '127.0.0.1'
+resources.doctrine2cache.memcache.servers.0.port       = '11211'
+resources.doctrine2cache.memcache.servers.0.persistent = false
+resources.doctrine2cache.memcache.servers.0.weight     = 1
+resources.doctrine2cache.memcache.servers.0.timeout    = 1
+resources.doctrine2cache.memcache.servers.0.retry_int  = 15

; resources.doctrine2cache.memcache.servers.1.host       = 'xxx'
; resources.doctrine2cache.memcache.servers.2.host       = 'yyy'

Retorne ao navegador e acesse o ViMbAdmin com a conta administrativa criada anteriormente.

Arquivamento e cotas

Antes de criar o domínio e as contas, precisamos configurar algumas questões administrativas do ViMbAdmin. São elas: verificação de tamanho, arquivamento e cotas das caixas de correio.

Os parâmetros para essas coisas funcionarem já estão devidamente configurados no /etc/vimbadmin/application.ini, então só precisamos fazer as coisas externas a ele.

As três primeiras tarefas rodam a partir do cron. Então, vamos editar o crontab do root.

# crontab -e

Coloque as linhas abaixo no final dele. Altere os agendamentos conforme você desejar.

#
### Backend
## ViMbAdmin tasks
# Check mailbox size daily at 4:10
10 4 * * * /var/www/backend/bin/vimbtool.php -a mailbox.cli-get-sizes
# Archive/restore/purge mailboxes weekly, from 3:10 to 3:50 on Sundays
10 3 * * 0 /var/www/backend/bin/vimbtool.php -a archive.cli-archive-pendings
30 3 * * 0 /var/www/backend/bin/vimbtool.php -a archive.cli-restore-pendings
50 3 * * 0 /var/www/backend/bin/vimbtool.php -a archive.cli-delete-pendings

Agora crie o diretório de arquivamento definido pelo parâmetro archive.path.

# mkdir -p /root/mboxarchive

Quanto as cotas, na configuração do ViMbAdmin definimos que a cota padrão para uma nova conta é 5GB (defaults.domain.quota = 5368709120) e a cota máxima é 10GB (defaults.domain.maxquota = 10737418240). Se você não quer usar cotas, basta definir esse valores para 0 (ilimitado). A cota máxima é o que você, como administrador, poderá dar a uma conta.

Também definimos que o número máximo de contas para cada domínio é 20 (defaults.domain.mailboxes = 20).

Os nomes dessas configurações são meio confusos e levam a crer que as cotas padrão e máxima são definidas para o domínio inteiro. Não são! A cota máxima para o domínio é: defaults.domain.mailboxes * defaults.domain.maxquota. Ou seja, na configuração acima o armazenamento máximo que pode ser utilizado por cada domínio neste servidor é 200GB (10GB * 20).

Domínio e contas {#domínio-e-contas}

Com ViMbAdmin devidamente instalado e configurado, finalmente chegou a hora de criar o nosso domínio de email e suas respectivas contas.

Podemos criar quantos domínios forem necessários (exemplo.com, exemplo.net, exemplo.com.br etc), mas para simplificar, vamos fazer isso apenas para o domínio exemplo.com que estamos tratando nessa série.

Uma vez logado com o usuário administrador no ViMbAdmin, na tela Domain, clique no ícone + no canto superior direito. Coloque os dados abaixo, evidentemente adaptando para o seu domínio.

  • Domain: exemplo.com
  • Description: Domínio virtual exemplo.com.
  • Backup MX: desmarcado
  • Active: marcado

Clique em Advanced. Você verá que os valores que configuramos para os novos domínios (mailboxes e cotas) estarão devidamente preenchidos. Você pode alterar qualquer um deles agora se precisar. Depois é só clicar em Save e o domínio será cadastrado no backend.

Agora clique na opção Mailboxes do menu. Aqui é onde você cria e administra as contas de usuários. Clique no ícone + no canto superior direito para criar uma nova conta.

A primeira conta a ser criada é a do administrador. Então vamos lá:

  • Address: digite apenas 'administrador' e escolha 'exemplo.com' na caixa ao lado.
  • Name: Administrador Exemplo.com
  • Password: digite a mesma senha que você usou na criação da conta de administração do ViMbAdmin. Esse detalhe é importante para depois.
  • Quota: defina a cota do usuário, ou deixe 0 para usar o limite atribuído pelo domínio.
  • Alternative Email: opcionalmente, coloque um endereço de email alternativo para os casos onde o usuário não tiver como acessar a conta neste servidor.
  • Welcome Email: desmarcado já que ainda não temos um MTA configurado.

Você pode dar uma olhada na aba Access para ativar as restrições de acesso por protocolo (SMTP, POP, IMAP e Sieve). Não faz muito sentido limitar isso aqui, pois esses serviços serão determinados pela configuração do MTA e MDA.

Quando estiver satisfeito, clique em Save. Repita o processo para criar a sua conta pessoal e outras que desejar. Para fins didáticos, vou presumir que você criou sua conta como eumesmo@exemplo.com.

Agora clique na opção Aliases do menu. Aliases são apelidos. Por exemplo: existe a conta eumesmo@exemplo.com, mas você quer que os emails enviados para eutambem@exemplo.com também seja entregue para eumesmo@exemplo.com. É com um alias que você faz isso, portanto crie quantos aliases quiser.

Um alias interessante é o 'pega tudo' (catch all). Este apelido especial faz com que os emails enviados para endereços ou alias não existentes no servidor sejam encaminhados para uma conta especifica. Só fique atento que um 'pega tudo' pega tudo mesmo, até spam.

Para criar um alias, clique no + e preencha Address com o nome do apelido, escolha o domínio e defina a conta de destino em Goto. Para o alias 'catch all', deixe o nome do apelido vazio e escolha o domínio e a conta de destino. Ela pode ser a sua própria conta, por exemplo. Ao terminar, clique em Save. Crie todos os aliases que desejar.

E feito. Seu backend está pronto e com ele tudo o que você precisa para administrar as contas de emails e agendas de modo unificado.

Quando um usuário precisar mudar a senha, basta acessar o endereço https://mail.exemplo.com:3443/auth/change-password. A alteração da senha feita aqui valerá para todos os serviços que o usuário tem acesso nesse servidor, incluindo as agendas.

Lembre-se que se você limitar o acesso ao backend a um IP, somente quem acessar a partir deste IP poderá chegar na página da alteração de senha. Isso é uma ótima medida de segurança para empresas, onde o usuário precisa estar em locais pré-determinados (casa ou escritório, por exemplo) para alterar sua própria senha, ou solicitar isso a um administrador.

Tudo muito bonito, mas email que é bom nada. Na próxima parte vamos começar a mudar isso.