Debian + Postfix + MySQL + PostfixAdmin + MailScanner + Webmail + Quotas
Procurei uma solução para servidor de email que contivesse domínios virtuais, quota, um gerenciador web, um webmail e mensagem automática de férias. Acabei encontrando e efetuando a implementação e como ela está bem estável, resolvi compartilhá-la com todos vocês.
Parte 3: Instalação dos pacotes para a configuração do Postfixadmin
Instalar os pacotes necessários para que o nosso postfixadmin funcione corretamente.
# aptitude install mysql-server mysql-client php5 php5-mysql php5-imap php5-mcrypt php5-json php5-xmlrpc php5-dev php5-common apache2 apache2-mod-php5 phpmyadmin php-pear
Informe a senha para o root do banco de dados MySQL e confirme-a, depois informe a opção apache2 na segunda tela, que é a tela de configuração do phpmyadmin.
Configuração do usuário para a base de dados do email fazer a conexão com o postfix.
Vamos criar a estrutura necessária para o postfixadmin.
Agora vamos fazer a configuração segura do mysql-server:
# mysql_secure_installation
Informe a senha do root.
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
# mysql -u root -p
mysql> CREATE DATABASE mail;
mysql> CREATE USER mail@localhost IDENTIFIED BY "senha";
mysql> GRANT ALL PRIVILEGES ON mail.* TO mail@localhost;
mysql> FLUSH PRIVILEGES;
mysql> quit;
# aptitude install libpam-mysql
# vim /etc/pam.d/smtp
# mkdir -p /etc/ssl/apache
# cd /etc/ssl/apache
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# chmod 0400 server.*
# cp server.key server.key.orig
# openssl rsa -in server.key.orig -out server.key
# chmod 0400 /etc/ssl/apache/*
# vim /etc/apache2/sites-available/mailadmin
# vim /etc/apache2/ports.conf
# a2enmod ssl
# vim /etc/php5/apache2/php.ini
# mkdir -p /usr/local/sites
# cd /usr/local/sites
# wget -c http://ufpr.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.1/postfixadmin-2.3.1.tar.gz
# tar -xzvf postfixadmin-2.3.1.tar.gz
# mv postfixadmin-2.3.1 postfixadmin
# chown -R root:www-data postfixadmin/
# cd postfixadmin
Vamos editar o arquivo de configuração principal do postfixadmin:
# vim config.inc.php
# a2ensite mailadmin
# apache2ctl restart
Agora acesse a seguinte url:
https://mailadmin.dominio.com.br/setup.php
Se tudo estiver ok é só informar uma senha para o administrador e inserir o hash que será gerado no arquivo /usr/local/sites/postfixadmin/config.php.
# vim /usr/local/sites/postfixadmin/config.php
Agora você pode cadastrar o usuário administrador, informe a senha que gerou o hash, após isso informe um email e uma senha e confirme a senha.
Agora vamos tirar o acesso a esta página de configuração.
# chmod 000 /usr/local/sites/postfixadmin/setup.php
Agora pode acessar a seguinte url e cadastrar os domínios e usuários:
https://mailadmin.dominio.com.br
Informe o email que você cadastrou e a senha.
Agora é só gerenciar esta tela, é muito intuitiva, então não vou precisar explicá-la, somente peço que comecem a criar contas depois de terminar este tutorial, pois se começar criar agora não vai ser gerado o home para os emails dos usuários.
# useradd -d /var/spool/vacation -g vacation -s /bin/false -m vacation
# cp /usr/local/sites/postfixadmin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation
# mkdir /var/log/vacation/
# chown -R vacation:vacation /var/spool/vacation/
# chown -R vacation:vacation /var/log/vacation/
# chmod 750 /var/spool/vacation/
# chmod 700 /var/spool/vacation/vacation.pl
# touch /var/log/vacation.log
# chown vacation:vacation /var/log/vacation.log
Instalando algumas dependências para o nosso vacation:
# aptitude install libmail-sender-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl
# vim /var/spool/vacation/vacation.pl
Agora você já pode cadastrar o seu domínio vacation.
Este domínio tem que ser o mesmo do arquivo de configuração /var/spool/vacation/vacation/vacation.pl em $vacation_domain, que no exemplo eu utilizei autoreply.dominio.com.br.
Vá em:
https://mailadmin.dominio.com.br
E cadastre um novo domínio, exemplo:
autoreply.dominio.com.br
Coloque uma descrição nele exemplo: Domínio de Férias. E em tipo de transporte escolha vacation. Agora confirme a criação do domínio.
Para que usar o vacation? Quando um usuário sai de férias podemos utilizar o vacation para enviar um email de reposta para cada email enviado para o usuário que está em férias com uma mensagem pré-definida, por exemplo que o usuário estará ausente de data tal até data tal.
Para habilitar isso vá até a conta o usuário que sairá de férias e clique no link Mode de Férias. Defina uma mensagem para ele e clique em Definir Mensagem.
Pronto, agora toda a mensagem enviada para este usuário será respondida automaticamente pelo vacation.
# aptitude install mysql-server mysql-client php5 php5-mysql php5-imap php5-mcrypt php5-json php5-xmlrpc php5-dev php5-common apache2 apache2-mod-php5 phpmyadmin php-pear
Informe a senha para o root do banco de dados MySQL e confirme-a, depois informe a opção apache2 na segunda tela, que é a tela de configuração do phpmyadmin.
Configuração do usuário para a base de dados do email fazer a conexão com o postfix.
Vamos criar a estrutura necessária para o postfixadmin.
Agora vamos fazer a configuração segura do mysql-server:
# mysql_secure_installation
Informe a senha do root.
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
# mysql -u root -p
mysql> CREATE DATABASE mail;
mysql> CREATE USER mail@localhost IDENTIFIED BY "senha";
mysql> GRANT ALL PRIVILEGES ON mail.* TO mail@localhost;
mysql> FLUSH PRIVILEGES;
mysql> quit;
Instando e configurando o pam-mysql
Vamos instalar o pacote necessário para o nosso trabalho e vamos já configurar o arquivo que vai ser utilizado para a autenticação do postfix no MySQL.# aptitude install libpam-mysql
# vim /etc/pam.d/smtp
auth required pam_mysql.so user=mail passwd=senha host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
account sufficient pam_mysql.so user=mail passwd=senha host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
auth sufficient pam_unix.so debug
account sufficient pam_unix.so debug
account sufficient pam_mysql.so user=mail passwd=senha host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
auth sufficient pam_unix.so debug
account sufficient pam_unix.so debug
Configurando o Apache2
Vamos gerar os certificados para a nossa conexão segura.# mkdir -p /etc/ssl/apache
# cd /etc/ssl/apache
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# chmod 0400 server.*
# cp server.key server.key.orig
# openssl rsa -in server.key.orig -out server.key
# chmod 0400 /etc/ssl/apache/*
# vim /etc/apache2/sites-available/mailadmin
<VirtualHost *:443>
ServerAdmin webmaster@dominio.com.br
DocumentRoot "/usr/local/sites/postfixadmin"
ServerName mailadmin.dominio.com.br:443
ServerAlias mailadmin.dominio.com.br:443
ErrorLog "/var/log/mailadmin.dominio.com.br-error_log"
CustomLog "/var/log/mailadmin.dominio.com.br-access_log" common
<Directory "/usr/local/sites/postfixadmin">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,deny
Allow From All
</Directory>
SSLEngine on
#Abaixo uma linha unica
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/ssl/apache/server.crt"
SSLCertificateKeyFile "/etc/ssl/apache/server.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerSignature Off
</VirtualHost>
ServerAdmin webmaster@dominio.com.br
DocumentRoot "/usr/local/sites/postfixadmin"
ServerName mailadmin.dominio.com.br:443
ServerAlias mailadmin.dominio.com.br:443
ErrorLog "/var/log/mailadmin.dominio.com.br-error_log"
CustomLog "/var/log/mailadmin.dominio.com.br-access_log" common
<Directory "/usr/local/sites/postfixadmin">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,deny
Allow From All
</Directory>
SSLEngine on
#Abaixo uma linha unica
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/ssl/apache/server.crt"
SSLCertificateKeyFile "/etc/ssl/apache/server.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerSignature Off
</VirtualHost>
# vim /etc/apache2/ports.conf
[...]
NameVirtualHost *:443
NameVirtualHost *:443
# a2enmod ssl
# vim /etc/php5/apache2/php.ini
[...]
include_path = "."
[...]
magic_quotes_gpc = Off
include_path = "."
[...]
magic_quotes_gpc = Off
# mkdir -p /usr/local/sites
# cd /usr/local/sites
# wget -c http://ufpr.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.1/postfixadmin-2.3.1.tar.gz
# tar -xzvf postfixadmin-2.3.1.tar.gz
# mv postfixadmin-2.3.1 postfixadmin
# chown -R root:www-data postfixadmin/
# cd postfixadmin
Vamos editar o arquivo de configuração principal do postfixadmin:
# vim config.inc.php
[...]
$CONF['configured'] = true;
[...]
$CONF['default_language'] = 'pt-br';
[...]
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'senha';
$CONF['database_name'] = 'mail';
[...]
$CONF['admin_email'] = 'postmaster@seudominio';
[...]
$CONF['page_size'] = '20';
$CONF['default_aliases'] = array (
'abuse' => 'abuse@seudominio.com.br',
'hostmaster' => 'hostmaster@seudominio.com.br',
'postmaster' => 'postmaster@seudominio.com.br',
'webmaster' => 'webmaster@seudominio.com.br'
);
[...]
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';
[...]
$CONF['maxquota'] = '1000';
$CONF['quota'] = 'YES';
[...]
$CONF['transport'] = 'YES';
$CONF['transport_options'] = array (
'virtual', // for virtual accounts
'local', // for system accounts
'relay', // for backup mx
'vacation'
);
[...]
$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.seudominio.com.br';
[...]
$CONF['welcome_text'] = <<<EOM
Ola,
Bem vindo a sua nova conta de email.
Qualquer duvida favor entrar em contato com o departamento de TI.
EOM;
$CONF['emailcheck_resolve_domain']='NO';
$CONF['configured'] = true;
[...]
$CONF['default_language'] = 'pt-br';
[...]
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'senha';
$CONF['database_name'] = 'mail';
[...]
$CONF['admin_email'] = 'postmaster@seudominio';
[...]
$CONF['page_size'] = '20';
$CONF['default_aliases'] = array (
'abuse' => 'abuse@seudominio.com.br',
'hostmaster' => 'hostmaster@seudominio.com.br',
'postmaster' => 'postmaster@seudominio.com.br',
'webmaster' => 'webmaster@seudominio.com.br'
);
[...]
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';
[...]
$CONF['maxquota'] = '1000';
$CONF['quota'] = 'YES';
[...]
$CONF['transport'] = 'YES';
$CONF['transport_options'] = array (
'virtual', // for virtual accounts
'local', // for system accounts
'relay', // for backup mx
'vacation'
);
[...]
$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.seudominio.com.br';
[...]
$CONF['welcome_text'] = <<<EOM
Ola,
Bem vindo a sua nova conta de email.
Qualquer duvida favor entrar em contato com o departamento de TI.
EOM;
$CONF['emailcheck_resolve_domain']='NO';
# a2ensite mailadmin
# apache2ctl restart
Agora acesse a seguinte url:
https://mailadmin.dominio.com.br/setup.php
Se tudo estiver ok é só informar uma senha para o administrador e inserir o hash que será gerado no arquivo /usr/local/sites/postfixadmin/config.php.
# vim /usr/local/sites/postfixadmin/config.php
$CONF['setup_password'] = 'fd4a7b3f33e96be9f3b2d095cb14059d:972c9b28d2ad6ac91a58078d575f66c90973c904';
Agora você pode cadastrar o usuário administrador, informe a senha que gerou o hash, após isso informe um email e uma senha e confirme a senha.
Agora vamos tirar o acesso a esta página de configuração.
# chmod 000 /usr/local/sites/postfixadmin/setup.php
Agora pode acessar a seguinte url e cadastrar os domínios e usuários:
https://mailadmin.dominio.com.br
Informe o email que você cadastrou e a senha.
Agora é só gerenciar esta tela, é muito intuitiva, então não vou precisar explicá-la, somente peço que comecem a criar contas depois de terminar este tutorial, pois se começar criar agora não vai ser gerado o home para os emails dos usuários.
Configurando o vacation
# groupadd vacation# useradd -d /var/spool/vacation -g vacation -s /bin/false -m vacation
# cp /usr/local/sites/postfixadmin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation
# mkdir /var/log/vacation/
# chown -R vacation:vacation /var/spool/vacation/
# chown -R vacation:vacation /var/log/vacation/
# chmod 750 /var/spool/vacation/
# chmod 700 /var/spool/vacation/vacation.pl
# touch /var/log/vacation.log
# chown vacation:vacation /var/log/vacation.log
Instalando algumas dependências para o nosso vacation:
# aptitude install libmail-sender-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl
# vim /var/spool/vacation/vacation.pl
#our $db_type = 'Pg';
our $db_type = 'mysql';
our $db_host = 'localhost';
our $db_user = 'mail';
our $db_pass = 'senha';
our $db_name = 'mail';
our $vacation_domain = 'autoreply.dominio.com.br';
our $logfile = "/var/log/vacation.log";
our $syslog = 1;
our $interval = 1*1*1;
[...]
our $db_type = 'mysql';
our $db_host = 'localhost';
our $db_user = 'mail';
our $db_pass = 'senha';
our $db_name = 'mail';
our $vacation_domain = 'autoreply.dominio.com.br';
our $logfile = "/var/log/vacation.log";
our $syslog = 1;
our $interval = 1*1*1;
[...]
Agora você já pode cadastrar o seu domínio vacation.
Este domínio tem que ser o mesmo do arquivo de configuração /var/spool/vacation/vacation/vacation.pl em $vacation_domain, que no exemplo eu utilizei autoreply.dominio.com.br.
Vá em:
https://mailadmin.dominio.com.br
E cadastre um novo domínio, exemplo:
autoreply.dominio.com.br
Coloque uma descrição nele exemplo: Domínio de Férias. E em tipo de transporte escolha vacation. Agora confirme a criação do domínio.
Para que usar o vacation? Quando um usuário sai de férias podemos utilizar o vacation para enviar um email de reposta para cada email enviado para o usuário que está em férias com uma mensagem pré-definida, por exemplo que o usuário estará ausente de data tal até data tal.
Para habilitar isso vá até a conta o usuário que sairá de férias e clique no link Mode de Férias. Defina uma mensagem para ele e clique em Definir Mensagem.
Pronto, agora toda a mensagem enviada para este usuário será respondida automaticamente pelo vacation.