Postfix + MySQL + Courier + MailScanner + MailWatch + Webmail AfterLogic + Postfixadmin + Quota + Debian Squeeze

Prepare o seu sistema com o seguinte script Easy-Debian para que não falte nenhum pacote ou configuração.

Download do pacote do Postfix

Para a instalação é necessário que o sistema esteja atualizado. Para isto execute os comandos abaixo:

aptitude update && aptitude dist-upgrade -y

Após a atualização do sistema é necessário a adição de repositórios do wheezy para termos a versão mais atual do postfix para podermos aplicar o patch para cotas.

vim /etc/apt/sources.list
#REPOSITORIO PARA O POSTFIX
deb ftp://ftp.pucpr.br/debian wheezy main contrib non-free
deb-src ftp://ftp.pucpr.br/debian wheezy main contrib non-free

Vamos atualizar os repositórios com os novos dados.

aptitude update -y

Agora vamos obter o código fonte do postfix e o patch para cotas

cd /usr/src
apt-get source postfix
wget -c http://wiki.douglasqsantos.com.br/Downloads/mail/postfix-vda-v11-2.9.1.patch

A última versão do patch para o postfix foi para a versão 2.9.1 do postfix porém funciona na 2.9.3 do postfix só precisamos fazer um ajuste e aplicar o patch Vamos alterar a versão do postfix no patch

sed -i 's/2.9.1/2.9.3/g' /usr/src/postfix-vda-v11-2.9.1.patch

Agora vamos aplicar o patch

cd /usr/src/postfix-2.9.3 && patch -p1 < /usr/src/postfix-vda-v11-2.9.1.patch
patching file README_FILES/VDA_README
patching file src/global/mail_params.h
patching file src/util/file_limit.c
patching file src/virtual/mailbox.c
patching file src/virtual/maildir.c
patching file src/virtual/virtual.c
patching file src/virtual/virtual.h

Comentar as linhas do arquivo “/etc/apt/sources.list” adicionadas para o download do postfix.

Montagem do pacote do Postfix

Agora que já obtemos o pacote do Postfix e aplicamos o patch precisamos instalar as dependências para compilar o pacote.

aptitude update
aptitude install debhelper po-debconf libdb-dev ssl-cert libpcre3-dev libmysqlclient-dev libssl-dev libsasl2-dev libpq-dev libcdb-dev hardening-wrapper -y
aptitude install libldap2-dev libsqlite3-dev -y

Agora vamos criar os pacotes .deb

dpkg-buildpackage
cd ../
apt-get remove --purge postfix -y
dpkg -i postfix_*.deb

Aqui vamos ter que responder algumas perguntas na instalação dos pacotes.

  1. Irá perguntar o tipo de configuração do Postfix, informe Site Internet
  2. Irá perguntar o nome do domínio kque será utilizado, informe douglasqsantos.com.br

Agora vamos instalar os pacotes adicionais necessários.

dpkg -i postfix-pcre*.deb
dpkg -i postfix-mysql*.deb
dpkg -i postfix-doc*.deb

Será instalado agora o mailx que é o tradicional agente de mail do utilizador de linha de comandos.

aptitude install bsd-mailx

Agora vamos acertar alguns parâmetros do sistema

Nome e ip do servidor

vim /etc/hosts
127.0.0.1       localhost
ip_servidor     mail.douglasqsantos.com.br    mail

Agora vamos acertar o hostname

vim /etc/hostname
mail.douglasqsantos.com.br

Agora vamos acertar o mailname do servidor

vim /etc/mailname
mail.douglasqsantos.com.br

Agora vamos reiniciar o servidor para acertar o resto do sistema

reboot

Instalação do Apache e MySQL para a utilização do Postfixadmin

aptitude update && aptitude dist-upgrade -y
aptitude install mysql-server mysql-client apache2 php5 php5-mysql php5-imap libpam-mysql -y
  • Será solicitado a senha do banco de dados, informe e confirme ela.

Agora precisamos instalar alguns pacotes para que o postfixadmin funcione corretamente

aptitude install php5-gd php5-mcrypt php5-json php5-xmlrpc php5-dev php5-common \
libapache2-mod-php5 php-pear php5-intl php5-curl -y

Criação do banco de dados dos usuários de e-mail

mysql -u root -p
CREATE DATABASE mail;
GRANT ALL PRIVILEGES ON mail.* TO mail@localhost IDENTIFIED BY "123";
FLUSH PRIVILEGES;
quit;

Instalação e configuração do PostFix Admin

Obtendo o postfixadmin

A versão 2.3.5 do postfixadmin ta com bug no envio de email para Alias, por isso estou utilizando a versão 2.3.3.

cd /var/www
rm -rf *
wget -c http://wiki.douglasqsantos.com.br/pacotes/postfixadmin-2.3.3.tar.gz
tar -xzvf postfixadmin-2.3.3.tar.gz
mv postfixadmin-2.3.3 postfixadmin
rm -rf postfixadmin-2.3.3*
chown -R www-data:www-data *

Faça as alterações necessárias para o postfixadmin

sed -i "s/change-this-to-your.domain.tld/douglasqsantos.com.br/g" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['configured'\] = false;/\$CONF\['configured'\] = true;/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['default_language'\] = 'en';/\$CONF\['default_language'\] = 'pt-br';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_user'\] = 'postfix';/\$CONF\['database_user'\] = 'mail';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_password'\] = 'postfixadmin';/\$CONF\['database_password'\] = '123';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['database_name'\] = 'postfix';/\$CONF\['database_name'\] = 'mail';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['domain_path'\] = 'NO';/\$CONF\['domain_path'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['domain_in_mailbox'\] = 'YES';/\$CONF\['domain_in_mailbox'\] = 'NO';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['quota'\] = 'NO';/\$CONF\['quota'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['transport'\] = 'NO';/\$CONF\['transport'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['vacation'\] = 'NO';/\$CONF\['vacation'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['emailcheck_resolve_domain'\]='YES';/\$CONF\['emailcheck_resolve_domain'\]='NO';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['used_quotas'\] = 'NO';/\$CONF\['used_quotas'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['new_quota_table'\] = 'NO';/\$CONF\['new_quota_table'\] = 'YES';/" /var/www/postfixadmin/config.inc.php
sed -i "s/\$CONF\['maxquota'\] = '10';/\$CONF\['maxquota'\] = '10000';/" /var/www/postfixadmin/config.inc.php

Insira as configurações adicionais do vacation no final do arquivo config.inc.php

vim /var/www/postfixadmin/config.inc.php
$CONF['transport_options'] = array (
    'virtual',   for virtual accounts
    'local',     for system accounts
    'vacation',     for system accounts
    'relay'      for backup mx
);

Reinicie o serviço do Apache

/etc/init.d/apache2 restart

Acesse pelo seu navegador o menu de configuração do PostfixAdmin para terminar a instalação pelo endereço: http://ip_servidor/postfixadmin/setup.php

  1. Na primeira tela ele irá fazer a verificação se todos os critérios para funcionar estão intalados e funcionando.
  2. No final da página, informe a senha para de acesso como administrador

Depois de alterada a senha, ele vai mostrar a linha com a senha, copie a linha e substitua a linha no arquivo config.inc.php

vim /var/www/postfixadmin/config.inc.php
 In order to setup Postfixadmin, you MUST specify a hashed password here.
 To create the hash, visit setup.php in a browser and type a password into the field,
 on submission it will be echoed out to you as a hashed value.
#$CONF['setup_password'] = 'changeme';
$CONF['setup_password'] = '0faa114f15c60534ff34a8248dfaeafc:0c7fcd264027316b45619a99af58f25a1cb1b130';

Depois de alterado o arquivo, volte na tela do postfixadmin e informe o e-mail do aministrador e a senha, para testar a autenticação. Agora vamos continuar a nossa configuração.

Vacation

O Vacation funciona para gerenciar as mensagens de ausência ou ferias do usuários. Útil quando você sai de férias por exemplo e não vai ler e-mails por um tempo e deixa uma mensagem pré-definida com as informações sobre as pessoas que vão ser contactadas no tempo que você estará fora.

Preparando o ambiente:

Vamos criar o grupo e o usuário vacation

groupadd vacation
useradd -d /var/spool/vacation -g vacation -s /bin/false -m vacation

Agora vamos copiar o arquivo do vacation para o seu home

cp /var/www/postfixadmin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation/

Agora vamos criar o diretório que vai armazenar os logs e acertar as permissões dos diretórios e arquivos

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

Agora vamos instalar as dependências para o vacation funcionar corretamente

aptitude install libmail-sender-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libmail-sender-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl  -y

Vamos acertar as configurações no arquivo vacation.pl

vim /var/spool/vacation/vacation.pl
[...]
#our $db_type = 'Pg'; ->temos que comentar essa linha
our $db_type = 'mysql';
 
# leave empty for connection via UNIX socket
our $db_host = '';
 
# connection details
our $db_username = 'mail';
our $db_password = '123';
our $db_name     = 'mail';
 
our $vacation_domain = 'autoreply.dominio.com.br';
 
[...]
our $syslog = 1;
our $log_to_file = 1; 

[...]
my $interval = 1*1*1;
# disabled by default
#our $interval = 0; -> comentar essa linha e deixar my $interval = 60*60*24;

Agora vamos criar dois domínios um principal e um domínio para o vacation que vão ser as auto repostas de ferias ou ausência.

  1. Selecione Domínios/Criar domínio
  2. Agora informe o domínio
  3. A sua descrição
  4. Informe uma cota ou deixe ela como 0
  5. Transporte deixe o virtual
  6. Selecione Adicionar aliases padrão
  7. E selecione Criar domínio

Agora vamos criar o domínio do vacation

  1. Domínio agora vai ser autoreply.douglasqsantos.com.br “douglasqsantos.com.br” é o domínio anteriormente criado
  2. Coloque uma descrição para ele exemplo domínio de ferias
  3. Selecione em transporte como vacation
  4. Selecione criar domínio
  5. Pode sair dessa tela.

Autenticação

Vamos instalar os módulos que serão usados para autenticação.

aptitude install libsasl2-2 libsasl2-modules-sql -y
aptitude install libsasl2-modules libsasl2-dev sasl2-bin openssl   -y

Usuário do Postfix

Agora vamos obter o gid do Postfix

grep postfix /etc/passwd
postfix:x:104:107::/var/spool/postfix:/bin/false
  • Como podemos notar o gid do postfix é 107 esse valor vai ser usado para criarmos o vmail que vai ser responsável pelas mensagens e pela identificação dos modulos do courierauthmysql
adduser --system --shell /bin/false --uid 107 --gid 107 vmail
Adicionando usuário de sistema 'vmail' (UID 107) ...
Adicionando novo usuário 'vmail' (UID 107) com grupo 'postfix' ...
Criando diretório pessoal '/home/vmail' ...

Modulos do postfix

Instalando os módulos do postfix

aptitude install postfix-policyd-spf-perl libsasl2-2 libsasl2-modules-sql -y
chown -R vmail:postdrop /home/vmail

Ajustando configurações do Postfix

Vamos fazer um backup do arquivo original

cp -Rfa /etc/postfix/main.cf{,.bkp}

Agora vamos configurar o nosso postfix

vim /etc/postfix/main.cf
#---------------------------------MAIN-----------------------------------------
smtpd_banner      = $myhostname ESMTP
biff        = no
append_dot_mydomain     = no
readme_directory    = no
alias_maps      = hash:/etc/postfix/aliases
alias_database      = hash:/etc/postfix/aliases
myhostname      = mail.douglasqsantos.com.br
mydomain      = douglasqsantos.com.br
myorigin      = $myhostname
mydestination       = $myhostname, localhost
relayhost       =
mynetworks      = 127.0.0.0/8, 10.0.0.0/24, 172.31.0.0/24
relay_domains       = $mydestination
home_mailbox      = Maildir/
mailbox_command     = /usr/bin/procmail -a "$EXTENSION" DEFAULT=$HOME/Maildir/ MAILDIR=$HOME/Maildir/
mailbox_size_limit    = 0
message_size_limit    = 10240000
recipient_delimiter     = +
mynetworks_style    = subnet
inet_interfaces     = all
default_transport     = smtp
smtpd_recipient_limit     = 30
bounce_queue_lifetime     = 300s
maximal_queue_lifetime    = 300s
header_checks                   = regexp:/etc/postfix/header_checks
#-----------------------------END MAIN-----------------------------------------
#-----------------------------SASL--------------------------------------------- 
smtpd_sasl_auth_enable    = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients  = yes
smtpd_sasl_local_domain   = $mydomain
#----------------------------END SASL------------------------------------------
#-------------------------------TLS--------------------------------------------
smtp_tls_CAfile                 = /etc/postfix/ssl/cacert.pem
smtp_tls_cert_file              = /etc/postfix/ssl/smtpd.crt
smtp_tls_key_file               = /etc/postfix/ssl/smtpd.key
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtp_tls_security_level   = may
smtpd_tls_CAfile                = /etc/postfix/ssl/cacert.pem
smtpd_tls_cert_file             = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file              = /etc/postfix/ssl/smtpd.key
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
smtpd_tls_dh1024_param_file     = /etc/postfix/ssl/dh_1024.pem
smtpd_tls_dh512_param_file      = /etc/postfix/ssl/dh_512.pem
smtpd_tls_security_level        = may
smtpd_tls_received_header       = yes
smtpd_tls_ask_ccert             = yes
smtpd_tls_loglevel              = 1
tls_random_source               = dev:/dev/urandom
smtpd_enforce_tls     = yes
#-----------------------------END TLS-------------------------------------------- 
#--------------------------------MYSQL------------------------------------------- 
transport_maps      = proxy:mysql:/etc/postfix/mysql_transport_maps.cf
virtual_alias_maps    = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains   = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps    = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport     = virtual
virtual_minimum_uid     = 107
virtual_uid_maps    = static:107
virtual_gid_maps    = static:107
virtual_mailbox_base    = /home/vmail
#-----------------------------END MYSQL------------------------------------------- 
#-----------------------------QUOTA-----------------------------------------------
virtual_mailbox_limit     = 51200000
virtual_mailbox_limit     = 0
virtual_maildir_extended  = yes
virtual_mailbox_limit_override  = yes
virtual_mailbox_limit_maps  = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_overquota_bounce  = yes
virtual_maildir_limit_message   = Desculpe, o diretorio de correio do usuario estourou sua quota, por favor tente novamente depois.
#----------------------------END QUOTA-------------------------------------------
#----------------------------CONTROLS--------------------------------------------
smtpd_helo_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_invalid_hostname,
 reject_unknown_hostname,
 reject_non_fqdn_hostname,
 reject_unauth_pipelining
 
smtpd_client_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_pipelining,
 reject_rbl_client dnsbl.sorbs.net,
 reject_rbl_client dnsbl.njabl.org,
 reject_rbl_client rbl.schulte.org,   
 reject_rbl_client dnsbl.anticaptcha.net,
 reject_rbl_client bl.spamcannibal.org,
 reject_rbl_client bl.spamcop.net,
 reject_rbl_client cart00ney.surriel.com,
 reject_rbl_client korea.services.net,
 reject_rbl_client cbl.abuseat.org,
 reject_unknown_client

 
smtpd_sender_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 check_policy_service unix:private/policy,
 reject_non_fqdn_sender,
 reject_unauth_pipelining,
 reject_unknown_sender_domain
 
smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_invalid_hostname,
 reject_non_fqdn_hostname,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_unknown_recipient_domain,
 check_policy_service inet:127.0.0.1:60000,
 reject_unknown_client
#------------------------END CONTROLS-------------------------------------------

Vamos criar o arquivo necessário para para a checagem de Spam e AntiVirus.

echo "/^Received:/ HOLD" > /etc/postfix/header_checks

Geração das chaves para a conexão com TLS

Vamos gerar as chaves de autenticação

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
52 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
.......++++++
...............................................................++++++
e is 65537 (0x10001)
Enter pass phrase for smtpd.key: senha
Verifying - Enter pass phrase for smtpd.key: senha

Acertando permissão da key gerada

chmod 600 smtpd.key

Agora vamos gerar o pedido de assinatura

openssl req -new -key smtpd.key -out smtpd.csr
Enter pass phrase for smtpd.key: senha
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:mail.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Vamos assinar agora o nosso certificado

openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=IT/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
Getting Private key
Enter pass phrase for smtpd.key:

Agora vamos tirar a senha do certificado agora

openssl rsa -in smtpd.key -out smtpd.key.unencrypted
Enter pass phrase for smtpd.key: senha
writing RSA key

Gerando o CA

mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
Generating a 1024 bit RSA private key
.++++++
......++++++
writing new private key to 'cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:mail.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Ultimas chaves de Diffie Hellman

openssl dhparam 1024 -out dh_1024.pem
openssl dhparam 512 -out dh_512.pem

Vamos configurar o arquivo que tem o controle do tipo de transporte se vai ser virtual ou vacation por exemplo

vim /etc/postfix/mysql_transport_maps.cf
user = mail
password = 123
hosts = localhost
dbname = mail
table = domain
select_field = transport
where_field = domain

Aqui vamos configurar o arquivo que controla as contas de email

vim /etc/postfix/mysql_virtual_alias_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address

Aqui vamos configurar o arquivo que controla os domínios do postfix

vim /etc/postfix/mysql_virtual_domains_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain

Aqui vamos acertar o arquivo que controla as cotas do usuários e domínios

vim /etc/postfix/mysql_virtual_mailbox_limit_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username

Aqui vamos acertar o arquivo que controla as mailbox

vim /etc/postfix/mysql_virtual_mailbox_maps.cf 
user = mail
password = 123
hosts = localhost
dbname = mail
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Vamos acertar as permissões

chmod o= /etc/postfix/mysql_*
chgrp postfix /etc/postfix/mysql_*

Vamos fazer o acerto dos aliases agora

mv /etc/aliases /etc/postfix

Ajustando arquivos de aliases para os redirecionamentos

vim /etc/postfix/aliases
[...]
root: douglas@douglasqsantos.com.br

Agora vamos gerar a nova base de dados dos aliases

newaliases

Vamos fazer backup do arquivo de configuração

cp /etc/postfix/master.cf{,.bkp}

Ajustando arquivo de serviços do postfix

vim /etc/postfix/master.cf
#-------------------------SERVICES--------------------------------------------
#-----------------------------------------------------------------------------
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
#-----------------------------------------------------------------------------
smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
  -o smtp_fallback_relay=
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#----------------------------END SERVICES-----------------------------------------
#----------------------------DELIVERY METHODS-------------------------------------
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  - n n - 2 pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
#--------------------------END DELIVERY METHODS----------------------------------------------- 
#--------------------------SPF----------------------------------------------------------------
policy  unix  -       n       n       -       -       spawn
 user=nobody argv=/usr/bin/perl /usr/sbin/postfix-policyd-spf-perl
#--------------------------END SPF------------------------------------------------------------
#----------------------------VACATION---------------------------------------------------------
vacation    unix  -       n       n       -       -       pipe
  flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}
#----------------------------END VACATION-----------------------------------------------------
vim /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
auxprop_plugin: sql
allow_plaintext: true
sql_verbose: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: mail
sql_passwd: 123
sql_database: mail
sql_select: select password from mailbox where username = '%u'

Vamos acertar a localização do arquivo com um link

ln -sf /usr/lib/sasl2/smtpd.conf /etc/postfix/sasl/smtpd.conf

Vamos colocar o sasl no grupo do postfix

usermod -G sasl postfix

Agora vamos acertar o sasauthd mais primeiro vamos fazer o backup do arquivo

cp /etc/default/saslauthd{,.bkp}

Agora vamos acertar a configuração do arquivo

vim /etc/default/saslauthd
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Vamos acertar os arquivos do saslauthd para o postfix

mkdir -p /var/spool/postfix/var/run/saslauthd
chown postfix /var/spool/postfix/var/run/saslauthd/
cd /var/run
mv saslauthd saslauthd.bkp
ln -sf /var/spool/postfix/var/run/saslauthd

Agora vamos preparar o mysql para trabalhar com o Postfix

mkdir -p /var/spool/postfix/var/run/mysqld

Agora vamos acertar o arquivo de inicialização do MySQL

vim /etc/init.d/mysql
[...]
        fi
#insira a linha abaixo antes do ;; por quando o mysql for iniciar ele cria o socket e linka
/bin/ln -f /var/run/mysqld/mysqld.sock /var/spool/postfix/var/run/mysqld/mysqld.sock
        ;;
 
  'stop')

Agora vamos acertar a permissão do diretório /var/run/mysqld

chown -R vmail:mysql /var/run/mysqld && chmod -R 775 /var/run/mysqld
/etc/init.d/mysql restart
/etc/init.d/saslauthd restart

Galera aqui vou demostrar a instalação do Courier e do Dovecot na minha opinião o Dovecot é um pouco mais chato, e o Courier mais simples de manipular.

Instalação do Courier

aptitude install courier-imap courier-imap-ssl courier-pop courier-pop-ssl courier-authlib-mysql courier-authdaemon -y
#Resposta
1) No
2) Ok

Agora vamos fazer backup dos arquivos de configuração do courier

cp /etc/courier/authdaemonrc{,.bkp}
cp /etc/courier/authmysqlrc{,.bkp}

Agora vamos acertar o arquivo de conexão do Courier com o Mysql

vim /etc/courier/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD 123
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD '107'
MYSQL_GID_FIELD '107'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/home/vmail'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD CONCAT("/home/vmail/",maildir)
MYSQL_QUOTA_FIELD concat(quota,'S')

Agora vamos acertar a configuração do serviço do Courier

vim /etc/courier/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/courier/authdaemon
subsystem=mail
DEFAULTOPTIONS=""
LOGGEROPTS=""

Agora vamos acertar a configuração dos arquivos que vão gerar os nosso certificados para ssl.

Primeiro vamos editar o arquivo do imap

vim /etc/courier/imapd.cnf

RANDFILE = /usr/lib/courier/imapd.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=BR
ST=PR
L=Curitiba
O=Douglas Imap Server
OU=Douglas IMAP SSL key
CN=mail.douglasqsantos.com.br
emailAddress=postmaster@douglasqsantos.com.br


[ cert_type ]
nsCertType = server

Agora vamos editar o arquivo do pop

vim /etc/courier/pop3d.cnf
RANDFILE = /usr/lib/courier/pop3d.rand

[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=BR
ST=PR
L=Curitiba
O=Douglas Pop Server
OU=Douglas POP3 SSL key
CN=mail.douglasqsantos.com.br
emailAddress=postmaster@douglasqsantos.com.br


[ cert_type ]
nsCertType = server

Agora vamos fazer backup dos certificados antigos.

mv /etc/courier/pop3d.pem /etc/courier/pop3d.pem.bkp
mv /etc/courier/imapd.pem /etc/courier/imapd.pem.bkp
unlink /usr/lib/courier/pop3d.pem
unlink /usr/lib/courier/imapd.pem

Agora vamos gerar o novo certificado para o Imap-ssl

mkimapdcert

Agora vamos gerar o novo certificado para o Pop-ssl

mkpop3dcert

Agora vamos acertar os links dos certificados do courier

ln -sf /usr/lib/courier/imapd.pem /etc/courier/imapd.pem
ln -sf /usr/lib/courier/pop3d.pem /etc/courier/pop3d.pem

Agora é só reiniciar os serviços

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Ajustando a forma de autenticação do POP3, IMAP e SMTP

vim /etc/pam.d/pop3
auth required pam_mysql.so user=mail passwd=123 host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 sqllog=0 debug
account sufficient pam_mysql.so user=mail passwd=123 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
cp -Rfa /etc/pam.d/pop3 /etc/pam.d/imap
cp -Rfa /etc/pam.d/pop3 /etc/pam.d/smtp

Anti-Virus

Instalação dos pacotes para do antivirus e do antispam.

aptitude install bzip2 unrar unzip zip arj pax arc ripole cabextract lzop p7zip-full libgamin-dev gamin -y
aptitude install clamav clamav-freshclam clamav-daemon spamassassin postgrey libpathtools-perl mailscanner -y

Instalando suporte a razor e pyzor

apt-get install libnet-dns-perl razor pyzor -y

Acertando as configurações do razor e do pyzor

razor-admin -d --create
razor-admin -register
razor-admin -discover
pyzor discover

Configurando o SpamAssassin

Vamos fazer backup do arquivo de configuração

cp /etc/default/spamassassin{,.bkp}

Agora vamos configurar o spamassassin

vim /etc/default/spamassassin
ENABLED=1
OPTIONS="--create-prefs --max-children 5 --helper-home-dir"
PIDFILE="/var/run/spamd.pid"
CRON=0

Fazendo um backup do arquivo de configuração

cp /etc/spamassassin/local.cf{,.bkp}

Acertando o SpamAssassin

vim /etc/spamassassin/local.cf
#-------------------------GLOBAL----------------------------------------
rewrite_header Subject *****SPAM*****
report_safe 0
trusted_networks 10.0.0. 172.31.0.
required_score 2.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
shortcircuit USER_IN_WHITELIST       on
shortcircuit USER_IN_DEF_WHITELIST   on
shortcircuit USER_IN_ALL_SPAM_TO     on
shortcircuit SUBJECT_IN_WHITELIST    on
shortcircuit USER_IN_BLACKLIST       on
shortcircuit USER_IN_BLACKLIST_TO    on
shortcircuit SUBJECT_IN_BLACKLIST    on
shortcircuit ALL_TRUSTED             on
shortcircuit BAYES_99                spam
shortcircuit BAYES_00                ham
endif 
#-------------------------END GLOBAL------------------------------------
#-------------------------MARKUP----------------------------------------
header DSPAM_SPAM X-DSPAM-Result =~ /^Spam$/
score DSPAM_SPAM 0.5
header DSPAM_HAM X-DSPAM-Result =~ /^Innocent$/
score DSPAM_HAM -0.1
#------------------------END MARKUP-------------------------------------
#----------------------DKIM---------------------------------------------
score DKIM_VERIFIED -0.1
score DKIM_SIGNED    0
score DKIM_POLICY_SIGNALL  0
score DKIM_POLICY_SIGNSOME 0
score DKIM_POLICY_TESTING  0
score USER_IN_DKIM_WHITELIST -8.0
score USER_IN_DEF_DKIM_WL -1.5
def_whitelist_from_dkim   *@google.com
def_whitelist_from_dkim   *@googlemail.com
def_whitelist_from_dkim   *@*googlegroups.com
score ENV_AND_HDR_DKIM_MATCH -0.1
score ENV_AND_HDR_SPF_MATCH  -0.5
#---------------------END DKIM------------------------------------------
#---------------------BLACK LIST AND WHITELIST--------------------------
blacklist_from  chakerv@att.net
whitelist_from_dkim  *@ebay.com
whitelist_from_dkim  *@*.ebay.com
whitelist_from_dkim  *@ebay.co.uk
whitelist_from_dkim  *@*.ebay.co.uk
whitelist_from_dkim  *@ebay.at
whitelist_from_dkim  *@ebay.ca
whitelist_from_dkim  *@ebay.de
whitelist_from_dkim  *@ebay.fr
whitelist_from_dkim  *@*.paypal.com
whitelist_from_dkim  *@paypal.com
whitelist_from_dkim  *@*paypal.com
whitelist_from_dkim  *@*.paypal.be
whitelist_from_dkim  *@cern.ch
whitelist_from_dkim  *@amazon.com
whitelist_from_dkim  *@cisco.com
whitelist_from_dkim  *@cnn.com
whitelist_from_dkim  *@*.cnn.com
whitelist_from_dkim  service@youtube.com
whitelist_from_dkim  googlealerts-noreply@google.com
#-------------------END BLACK LIST AND WHITE LIST-----------------------

Agora vamos reiniciar o SpamAssassin

/etc/init.d/spamassassin restart

Configurando o Postgrey

Vamos fazer backup do arquivo de configuração

cp /etc/default/postgrey{,.bkp}

Agora vamos acertar a configuração do postgrey

vim /etc/default/postgrey
POSTGREY_OPTS="--inet=60000 --delay=60"
POSTGREY_TEXT="Seu email sera entregue em aproximadamente 60 segundos."

Vamos acertar a configuração do MailScanner

vim /etc/MailScanner/MailScanner.conf 
[...]
%org-name% = Douglas
[...]
%org-long-name% = Douglas Quintiliano dos Santos
[...]
%web-site% = wiki.douglasqsantos.com.br
[...]
%report-dir% = /usr/local/share/MailScanner/reports/pt_br
[...]
Run As User = postfix
[...]
Run As Group = postfix
[...]
Incoming Queue Dir = /var/spool/postfix/hold
[...]
Outgoing Queue Dir = /var/spool/postfix/incoming
[...]
MTA = postfix
[...]
Virus Scanners = clamav
[...]
Virus Subject Text = ***VIRUS***
[...]
Filename Subject Text = ***ARQUIVO BLOQUEADO***
[...]
Content Subject Text = ***CONTEUDO PERIGOSO***
[...]
Size Subject Text = ***TAMANHO ALTERADO***
[...]
Disarmed Modify Subject = no
[...]
Phishing Modify Subject = start
[...]
Phishing Subject Text = ***FRAUDE***
[...]
Spam Subject Text = ***SPAM***
[...]
High Scoring Spam Subject Text = ***SPAM***
[...]
Rebuild Bayes Every = 86400
[...]
Wait During Bayes Rebuild = yes
[...]
Log Spam = yes
[...]
Is Definitely Not Spam = &SQLWhitelist
[...]
Is Definitely Spam = &SQLBlacklist
[...]
Always Looked Up Last = &MailWatchLogging
[...]
Detailed Spam Report = yes
[...]
Quarantine Whole Message = yes
[...]
Quarantine Whole Message As Queue Files = no
[...]
Include Scores In SpamAssassin Report = yes
[...]
Quarantine User = postfix
[...]
Quarantine Group = www-data
[...]
Quarantine Permissions = 0660
[...]
Scan Messages = %rules-dir%/scan.messages.rules
[...]
Required SpamAssassin Score = 6.03
[...]
Spam Score Number Format = %5.2f
[...]
#include /etc/MailScanner/conf.d/*

Agora vamos criar o arquivo que controla os domínios que vão ser verificados pelo MailScanner.

vim /etc/MailScanner/rules/scan.messages.rules
To:             douglasqsantos.com.br         no
From:           douglasqsantos.com.br         no
FromOrTo:       default                 yes

Aqui estamos definindo que não vão ser verificadas as mensagens de destino ou origem douglasqsantos.com.br, qualquer outro domínio vai ser checado por padrão.

Agora vamos habilitar ele para inicializar no boot.

sed -i "s/#run_mailscanner=1/run_mailscanner=1/g" /etc/default/mailscanner

Vamos acertar mais um arquivo do MailScanner

sed -i "s|#!/usr/bin/perl -I/usr/share/MailScanner/|#!/usr/bin/perl -U -I/usr/share/MailScanner/|g" /usr/sbin/MailScanner

Acertar a configuração do SpamAssasin com MailScanner

vim /etc/MailScanner/spam.assassin.prefs.conf
[...]
bayes_path /etc/MailScanner/bayes/bayes
bayes_file_mode 0660

Agora temos que acertar os diretórios

mkdir /etc/MailScanner/bayes
chown postfix:www-data /etc/MailScanner/bayes
chmod g+rws /etc/MailScanner/bayes

Agora vamos acertar a permissão da Quarentena

chown -R postfix:www-data /var/spool/MailScanner/quarantine
chmod -R 770 /var/spool/MailScanner/quarantine

Agora vamos instalar o MailWatch que é uma interface Web para monitorarmos os nossos Emails Scaneados pelo MailScanner.

Vamos instalar os pacotes necessários.

aptitude install apache2 php5-cli php5 mysql-server libdbd-mysql-perl php5-gd php5-mysql libapache2-mod-php5 -y

Agora vamos obter o nosso MailWatch

cd /usr/src/
wget -c http://wiki.douglasqsantos.com.br/pacotes/mailwatch-1.0.5.tar.gz

Agora vamos desempacotar e acessar ele.

tar zxvf mailwatch-1.0.5.tar.gz && cd mailwatch-1.0.5

Agora vamos importar o banco de dados.

mysql -u root -p < create.sql

Agora Vamos acertar as permissões do banco de dados do mailscanner.

mysql -u root -p
GRANT ALL ON mailscanner.* TO mailwatch@localhost IDENTIFIED BY '123';
GRANT file ON *.* TO mailwatch@localhost IDENTIFIED BY '123';
FLUSH PRIVILEGES;

Agora vamos acertar a configuração do MailWatch.

cd /usr/src/mailwatch-1.0.5
sed -i "s/my(\$db_user) = 'root';/my(\$db_user) = 'mailwatch';/g" MailWatch.pm
sed -i "s/my(\$db_pass) = '';/my(\$db_pass) = '123';/g" MailWatch.pm
sed -i "s/my(\$db_user) = 'root';/my(\$db_user) = 'mailwatch';/g" SQLBlackWhiteList.pm
sed -i "s/my(\$db_pass) = '';/my(\$db_pass) = '123';/g" SQLBlackWhiteList.pm
sed -i "s/INTERVAL 60 DAY/INTERVAL 30 DAY/g" tools/db_clean.php
sed -i "s|require_once('/var/www/html/mailscanner/functions.php')|require_once('/var/www/mailwatch/functions.php')|g" tools/quarantine_report.php
sed -i "s|require('/var/www/html/mailscanner/functions.php')|require('/var/www/mailwatch/functions.php')|g" tools/db_clean.php
sed -i "s|require('/var/www/html/mailscanner/functions.php')|require('/var/www/mailwatch/functions.php')|g" tools/quarantine_maint.php

Agora temos que acertar a localização do arquivo que insere as estatísticas do Mailscanner no Banco.

cd /usr/src/mailwatch-1.0.5
cp -Rf MailWatch.pm /usr/share/MailScanner/MailScanner/CustomFunctions/
cp -Rf SQLBlackWhiteList.pm /usr/share/MailScanner/MailScanner/CustomFunctions/
cp -Rf tools/db_clean.php /etc/cron.daily/
cp -Rf tools/quarantine_maint.php /etc/cron.daily/
cp -Rf tools/quarantine_report.php /etc/cron.daily/

Agora vamos acertar a permissão dos arquivo do cron

chmod 755 /etc/cron.daily/{db_clean.php,quarantine_maint.php,quarantine_report.php}

Agora vamos inserir o nosso usuário admin do MailWatch no banco de dados, vou inserir o usuário admin com a senha 123.

mysql -u root -p mailscanner -e "INSERT INTO users VALUES ('mailwatch',md5('123'),'Administrator name','A','0','0','0','0','0');"

Agora vamos copiar o mailscanner para o /var/www/mailwatch

cp -Rf mailscanner/ /var/www/mailwatch

Agora vamos acertar as permissões do mailwatch

cd /var/www/mailwatch
find . -type f -exec chmod 664 {} \;
find . -type d -exec chmod 775 {} \;
chown -R www-data:www-data /var/www/mailwatch
chmod -R 777 temp images/cache

Agora vamos fazer mais uns ajuste na configuração do mailwatch

cd /var/www/mailwatch/
mv conf.php.example conf.php

Agora vamos acertar a configuração da conexão do mailwatch com o banco

cd /var/www/mailwatch
sed -i "s/define('DB_USER', 'root');/define('DB_USER', 'mailwatch');/g" conf.php
sed -i "s/define('DB_PASS', '');/define('DB_PASS', '123');/g" conf.php
sed -i "s|define('MAILWATCH_HOME', '/var/www/html/mailscanner');|define('MAILWATCH_HOME', '/var/www/mailwatch');|g" conf.php
sed -i "s|define('QUARANTINE_USE_FLAG', false)|define('QUARANTINE_USE_FLAG', true)|g" conf.php
sed -i "s|ini_set('include_path','.:'.MAILWATCH_HOME.'/pear:'.MAILWATCH_HOME.'/fpdf:'.MAILWATCH_HOME.'/xmlrpc');|ini_set('include_path','.:'.MAILWATCH_HOME.'/pear:'.MAILWATCH_HOME.'/fpdf:'.MAILWATCH_HOME.'/xmlrpc:/usr/share/php');|g" functions.php 

Agora vamos instalar alguns módulos pear necessários.

pear install DB
pear install DB_Pager
pear install Mail_mimeDecode

Configurando o fetchmail para o postfixadmin

apt-get install fetchmail liblockfile-simple-perl -y 
mkdir /var/run/fetchmail
touch /var/run/fetchmail/fetchmail-all.lock 

Vamos instalar as dependências

perl -MCPAN -e shell 
cpan[1]> force install DBI
cpan[2]> force install MIME::Base64
cpan[3]> force install File::Temp
cpan[4]> force install Sys::Syslog
cpan[5]> force install LockFile::Simple
cpan[6]> force install YAML
cpan[7]> q

Acertando o fetchmail

vim /var/www/postfixadmin/ADDITIONS/fetchmail.pl
[...]
#our $db_type = ‘Pg’;
my $db_type = 'mysql';

# host name
our $db_host="127.0.0.1";
# database name
our $db_name="mail";
# database username
our $db_username="mail";
# database password
our $db_password="123";

# instead of changing this script, you can put your settings to /etc/mail/postfixadmin/fetchmail.conf
# just use perl syntax there to fill the variables listed above (without the "our" keyword). Example:
#Deixar as linhas abaixo comentadas por padrão elas vem descomentadas
# $db_username = 'mail';
#if (-f "/etc/mail/postfixadmin/fetchmail.conf") {
#       require "/etc/mail/postfixadmin/fetchmail.conf";
#}

Acertando as permissões do fetchmail

chmod 755 /var/www/postfixadmin/ADDITIONS/fetchmail.pl 

Ajuste o Crontab para efetuar sincronismo das contas aqui estou agendando para ser efetuado a cada 10 minutos acerte de acordo com a necessidade.

crontab -e
* */10      *       *       *       /usr/bin/perl /var/www/postfixadmin/ADDITIONS/fetchmail.pl

Sincronismo de contas de e-mail entre servidores

Para que o servidor já inicie o sincronismo das contas de e-mail do servidor atual, configuraremos as contas da seguinte forma:

  1. Acesse o frontend do postfixadmin:
    1. Clique no menu Recuperar Mensagem
    2. Clique no Sub-menu Criar novo registro
    3. Selecione a conta
    4. Informar o servidor:
    5. Autenticação : password
    6. Usuario: email@dominio.com.br
    7. Senha: senha
    8. Diretorio: INBOX
    9. Checar: 10
    10. Recuperar todas: Marcar
    11. Manter: Marcar
    12. Protocolo: IMAP
    13. Agora GRAVAR.

Agora vamos fazer uns acertos na configuração do MySQL.

vim /etc/mysql/my.cnf
[...]
key_buffer              = 32M
max_allowed_packet      = 32M
[...]
query_cache_limit       = 4M
query_cache_size        = 32M
[...]

Reiniciando os serviços

/etc/init.d/clamav-daemon restart
/etc/init.d/clamav-freshclam restart
/etc/init.d/spamassassin restart
/etc/init.d/postgrey restart
/etc/init.d/postfix restart
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart
/etc/init.d/mailscanner restart
/etc/init.d/apache2 restart
/etc/init.d/mysql restart

Verificando se os serviços estão sendo executados:

nmap -sS -T4 localhost

Starting Nmap 5.00 ( http://nmap.org ) at 2012-05-31 16:26 BRT
Interesting ports on localhost (127.0.0.1):
Not shown: 988 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
111/tcp  open  rpcbind
143/tcp  open  imap
587/tcp  open  submission
783/tcp  open  spamassassin
993/tcp  open  imaps
995/tcp  open  pop3s
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.30 seconds

Agora em http://ip_servidor/postfixadmin crie um usuário para teste e continue com a configuração do maia pois sem um usuário cadastrado no sistema não vamos poder continuar os testes.

Na tela web informe o usuário e a senha, agora selecione o dominio douglasqsantos.com.br e selecione criar conta, agora informe o nome dela uma senha e confirme e selecione criar conta.

Nos logs vai ter que aparecer algo como abaixo.

tail -f /var/log/mail.log
May 31 16:33:51 mail postfix/smtpd[26360]: connect from localhost[127.0.0.1]
May 31 16:33:51 mail postfix/smtpd[26360]: 510F82CA62: client=localhost[127.0.0.1]
May 31 16:33:51 mail postfix/cleanup[26362]: 510F82CA62: hold: header Received: from 10.101.0.20 (localhost [127.0.0.1])??by mail.douglas.lan (Postfix) with ESMTP id 510F82CA62??for <maria@douglas.lan>; Thu, 31 May 2012 16:33:51 -0300 (BRT) from localhost[127.0.0.1]; from=<admin@douglas.lan> to=<maria@douglas.lan> proto=ESMTP helo=<10.101.0.20>
May 31 16:33:51 mail postfix/cleanup[26362]: 510F82CA62: message-id=<20120531193351.510F82CA62@mail.douglas.lan>
May 31 16:33:51 mail postfix/smtpd[26360]: disconnect from localhost[127.0.0.1]
May 31 16:33:55 mail MailScanner[26321]: New Batch: Scanning 1 messages, 1106 bytes
May 31 16:33:55 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:34:00 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:34:00 mail MailScanner[26321]: SpamAssassin cache hit for message 510F82CA62.AEB0C
May 31 16:34:01 mail MailScanner[26321]: Requeue: 510F82CA62.AEB0C to 82C2A2CA63
May 31 16:34:01 mail MailScanner[26321]: Uninfected: Delivered 1 messages
May 31 16:34:01 mail postfix/qmgr[26296]: 82C2A2CA63: from=<admin@douglas.lan>, size=480, nrcpt=1 (queue active)
May 31 16:34:01 mail postfix/virtual[26358]: 82C2A2CA63: to=<maria@douglas.lan>, relay=virtual, delay=9.9, delays=9.8/0.04/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)
May 31 16:34:01 mail postfix/qmgr[26296]: 82C2A2CA63: removed
May 31 16:34:01 mail MailScanner[26321]: Deleted 1 messages from processing-database

Agora vamos verificar se o nosso mailscanner está sabendo identificar virus e Spam, vamos testar primeiro o SPAM.

Vamos enviar uma mensagem de Spam para o usuário maria.

mail -s "Teste" maria@douglas.lan < /usr/share/doc/spamc/sample-spam.txt

Agora vamos verificar os logs.

tail -f /var/log/mail.log
May 31 16:42:07 mail postfix/pickup[26295]: 959462CA63: uid=0 from=<root>
May 31 16:42:07 mail postfix/cleanup[26460]: 959462CA63: hold: header Received: by mail.douglas.lan (Postfix, from userid 0)??id 959462CA63; Thu, 31 May 2012 16:42:07 -0300 (BRT) from local; from=<root@mail.douglas.lan> to=<maria@douglas.lan>
May 31 16:42:07 mail postfix/cleanup[26460]: 959462CA63: message-id=<20120531194207.959462CA63@mail.douglas.lan>
May 31 16:42:08 mail MailScanner[26321]: New Batch: Scanning 1 messages, 1336 bytes
May 31 16:42:08 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:42:12 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:42:12 mail MailScanner[26321]: SpamAssassin cache hit for message 959462CA63.A9757
May 31 16:42:12 mail MailScanner[26321]: Message 959462CA63.A9757 from 127.0.0.1 (root@mail.douglas.lan) to douglas.lan is spam, SpamAssassin (cached, escore=999.999, requerido 6, GTUBE 1000.00, NO_RELAYS -0.00)
May 31 16:42:12 mail MailScanner[26321]: Spam Checks: Found 1 spam messages
May 31 16:42:12 mail MailScanner[26321]: Spam Actions: message 959462CA63.A9757 actions are store
May 31 16:42:12 mail MailScanner[26321]: Deleted 1 messages from processing-database

Agora vamos mandar uma mensagem que não pode ser identificada como Spam.

gunzip /usr/share/doc/spamc/sample-nonspam.txt.gz
mail -s "Teste" maria@douglas.lan < /usr/share/doc/spamc/sample-nonspam.txt

Agora vamos verificar os logs.

tail -f /var/log/mail.log
May 31 16:45:30 mail postfix/pickup[26295]: 3B5072CA63: uid=0 from=<root>
May 31 16:45:30 mail postfix/cleanup[26574]: 3B5072CA63: hold: header Received: by mail.douglas.lan (Postfix, from userid 0)??id 3B5072CA63; Thu, 31 May 2012 16:45:30 -0300 (BRT) from local; from=<root@mail.douglas.lan> to=<maria@douglas.lan>
May 31 16:45:30 mail postfix/cleanup[26574]: 3B5072CA63: message-id=<20120531194530.3B5072CA63@mail.douglas.lan>
May 31 16:45:36 mail MailScanner[26321]: New Batch: Scanning 1 messages, 7151 bytes
May 31 16:45:36 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:45:39 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:45:44 mail MailScanner[26321]: Requeue: 3B5072CA63.AA6EA to EFD8A2CA62
May 31 16:45:44 mail MailScanner[26321]: Uninfected: Delivered 1 messages
May 31 16:45:44 mail postfix/qmgr[26296]: EFD8A2CA62: from=<root@mail.douglas.lan>, size=6932, nrcpt=1 (queue active)
May 31 16:45:44 mail MailScanner[26321]: Deleted 1 messages from processing-database
May 31 16:45:44 mail postfix/virtual[26587]: EFD8A2CA62: to=<maria@douglas.lan>, relay=virtual, delay=15, delays=14/0.15/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)
May 31 16:45:44 mail postfix/qmgr[26296]: EFD8A2CA62: removed

Como pode ser notado a mensagem passou normalmente, agora vamos testar a verificação de Virus.

Vamos criar o nosso arquivo

echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > /tmp/arquivo.doc

Agora vamos enviar ele para a usuário maria.

mail -s "Arquivo Doc" maria@douglas.lan < /tmp/arquivo.doc

Agora vamos ver os logs de Email

tail -f /var/log/mail.log
May 31 16:48:48 mail postfix/pickup[26295]: BB6842CA63: uid=0 from=<root>
May 31 16:48:48 mail postfix/cleanup[26604]: BB6842CA63: hold: header Received: by mail.douglas.lan (Postfix, from userid 0)??id BB6842CA63; Thu, 31 May 2012 16:48:48 -0300 (BRT) from local; from=<root@mail.douglas.lan> to=<maria@douglas.lan>
May 31 16:48:48 mail postfix/cleanup[26604]: BB6842CA63: message-id=<20120531194848.BB6842CA63@mail.douglas.lan>
May 31 16:48:50 mail MailScanner[26321]: New Batch: Scanning 1 messages, 587 bytes
May 31 16:48:50 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:48:53 mail MailScanner[26321]: ./BB6842CA63.A9E9B/msg-26321-8.txt: Eicar-Test-Signature FOUND
May 31 16:48:53 mail MailScanner[26321]: Virus Scanning: ClamAV found 1 infections
May 31 16:48:53 mail MailScanner[26321]: Infected message BB6842CA63.A9E9B came from 127.0.0.1
May 31 16:48:53 mail MailScanner[26321]: Virus Scanning: Found 1 viruses
May 31 16:48:53 mail MailScanner[26321]: Saved infected "msg-26321-8.txt" to /var/spool/MailScanner/quarantine/20120531/BB6842CA63.A9E9B
May 31 16:48:53 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:48:55 mail MailScanner[26321]: Requeue: BB6842CA63.A9E9B to 9114A2CA62
May 31 16:48:55 mail postfix/qmgr[26296]: 9114A2CA62: from=<root@mail.douglas.lan>, size=367, nrcpt=1 (queue active)
May 31 16:48:55 mail MailScanner[26321]: Cleaned: Delivered 1 cleaned messages
May 31 16:48:55 mail postfix/pickup[26295]: A8D542CA64: uid=104 from=<postmaster>
May 31 16:48:55 mail postfix/cleanup[26604]: A8D542CA64: hold: header Received: by mail.douglas.lan (Postfix, from userid 104)??id A8D542CA64; Thu, 31 May 2012 16:48:55 -0300 (BRT) from local; from=<postmaster@mail.douglas.lan>
May 31 16:48:55 mail postfix/cleanup[26604]: A8D542CA64: message-id=<20120531194855.A8D542CA64@mail.douglas.lan>
May 31 16:48:55 mail postfix/virtual[26617]: 9114A2CA62: to=<maria@douglas.lan>, relay=virtual, delay=7.2, delays=6.9/0.04/0/0.22, dsn=2.0.0, status=sent (delivered to maildir)
May 31 16:48:55 mail postfix/qmgr[26296]: 9114A2CA62: removed
May 31 16:48:55 mail MailScanner[26321]: Notices: Warned about 1 messages
May 31 16:48:55 mail MailScanner[26321]: Deleted 1 messages from processing-database
May 31 16:48:55 mail MailScanner[26321]: New Batch: Scanning 1 messages, 1362 bytes
May 31 16:48:56 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:48:59 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:49:01 mail MailScanner[26321]: Requeue: A8D542CA64.A1BB0 to 2B6ED2CA62
May 31 16:49:01 mail postfix/qmgr[26296]: 2B6ED2CA62: from=<postmaster@mail.douglas.lan>, size=1126, nrcpt=1 (queue active)
May 31 16:49:01 mail MailScanner[26321]: Uninfected: Delivered 1 messages
May 31 16:49:01 mail MailScanner[26321]: Deleted 1 messages from processing-database
May 31 16:49:01 mail postfix/cleanup[26604]: 6C10A2CA63: message-id=<20120531194855.A8D542CA64@mail.douglas.lan>
May 31 16:49:01 mail postfix/qmgr[26296]: 6C10A2CA63: from=<postmaster@mail.douglas.lan>, size=1562, nrcpt=1 (queue active)
May 31 16:49:01 mail postfix/local[26630]: 2B6ED2CA62: to=<postmaster@mail.douglas.lan>, orig_to=<postmaster>, relay=local, delay=5.8, delays=5.6/0.14/0/0.04, dsn=2.0.0, status=sent (forwarded as 6C10A2CA63)
May 31 16:49:01 mail postfix/qmgr[26296]: 2B6ED2CA62: removed
May 31 16:49:01 mail postfix/virtual[26617]: 6C10A2CA63: to=<douglas@douglas.lan>, orig_to=<postmaster>, relay=virtual, delay=0.13, delays=0.04/0/0/0.09, dsn=2.0.0, status=sent (delivered to maildir)
May 31 16:49:01 mail postfix/qmgr[26296]: 6C10A2CA63: removed

Como pode ser verificado o Email foi reconhecido como um Vírus.

Vamos fazer teste de autenticação

testsaslauthd -u douglas@douglasqsantos.com.br -p doug123
0: OK "Success."

Agora vamos fazer um teste com o pop3

telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user maria@douglas.lan
+OK Password required.
pass doug123
+OK logged in.
quit
+OK Bye-bye.
Connection closed by foreign host.

Vamos fazer um teste de imap

telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2010 Double Precision, Inc.  See COPYING for distribution information.
a login maria@douglas.lan doug123
a OK LOGIN Ok.
a logout
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.

Agora vamos a um teste de envio de email

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.douglasqsantos.com.br ESMTP
EHLO mail.douglasqsantos.com.br
250-mail.douglasqsantos.com.br
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: <maria@douglasqsantos.com.br>
250 2.1.0 Ok
rcpt to: <maria@douglasqsantos.com.br>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Teste De envio de Email por Telnet
.
250 2.0.0 Ok: queued as A134C2CA65
quit
221 2.0.0 Bye
Connection closed by foreign host.

Vamos ver os logs

tail -f /var/log/mail.log 
May 31 16:55:24 mail postfix/smtpd[26809]: A134C2CA65: client=localhost[127.0.0.1]
May 31 16:55:43 mail postfix/cleanup[26812]: A134C2CA65: hold: header Received: from mail.douglas.lan (localhost [127.0.0.1])??by mail.douglas.lan (Postfix) with ESMTP id A134C2CA65??for <maria@douglas.lan>; Thu, 31 May 2012 16:55:13 -0300 (BRT) from localhost[127.0.0.1]; from=<maria@douglas.lan> to=<maria@douglas.lan> proto=ESMTP helo=<mail.douglas.lan>
May 31 16:55:43 mail postfix/cleanup[26812]: A134C2CA65: message-id=<20120531195524.A134C2CA65@mail.douglas.lan>
May 31 16:55:45 mail postfix/smtpd[26809]: disconnect from localhost[127.0.0.1]
May 31 16:55:49 mail MailScanner[26321]: New Batch: Scanning 1 messages, 966 bytes
May 31 16:55:49 mail MailScanner[26321]: Virus and Content Scanning: Starting
May 31 16:55:52 mail MailScanner[26321]: Spam Checks: Starting
May 31 16:55:59 mail MailScanner[26321]: Requeue: A134C2CA65.AE38F to 048F82CA66
May 31 16:55:59 mail MailScanner[26321]: Uninfected: Delivered 1 messages
May 31 16:55:59 mail postfix/qmgr[26296]: 048F82CA66: from=<maria@douglas.lan>, size=345, nrcpt=1 (queue active)
May 31 16:55:59 mail MailScanner[26321]: Deleted 1 messages from processing-database
May 31 16:55:59 mail postfix/virtual[26822]: 048F82CA66: to=<maria@douglas.lan>, relay=virtual, delay=46, delays=46/0.29/0/0.11, dsn=2.0.0, status=sent (delivered to maildir)
May 31 16:55:59 mail postfix/qmgr[26296]: 048F82CA66: removed

Vamos acessar o nosso MailWatch Em http://ip_servidor/mailwatch usuário: mailwatch senha: 123

  1. Na página inícial do MailWatch selecione Tools/Links
  2. Agora selecione Update GeoIP Database
  3. Agora selecione Run Now, com isso vamos atualizar a base dos endereços ips por localização.

Agora é so acompanhar os logs e bloquear o que for necessário.

Configurando o Webmail

Vamos obter ele e desempacotar

mkdir /var/www/webmail
cd /var/www/webmail
wget -c http://wiki.douglasqsantos.com.br/pacotes/afterlogicwebmail.zip 
unzip afterlogicwebmail.zip
rm -rf changelog.txt readme.txt afterlogicwebmail.zip
mv webmail/* .
rm -rf webmail

Agora vamos acertar as permissões do nosso webmail.

cd /var/www/webmail
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
chown -R www-data:www-data /var/www/webmail

Agora vamos preparar o banco de dados para o webmail

mysql -u root -p
CREATE DATABASE webmail;
GRANT ALL PRIVILEGES ON webmail.* TO webmail@localhost IDENTIFIED BY 'senha';
flush privileges;
quit;

Agora vamos acessar pelo navegador a tela de configuração do webmail http://ip_servidor/webmail/install/

  1. Nesta página inicial de instalação os requisitos devem estar todos em Verde, no final da página selecione Next.
  2. Agora leia o termo de licença e selecione I Agree para continuar.
  3. Agora aqui nesta tela temos que informar:
    1. SQL login: webmail
    2. SQL password: senha
    3. Database name: webmail
    4. Host: localhost
  4. Agora selecione Test database, o resultado deve ser Connected successfully se os dados estiverem corretos.
  5. Deixe selecionado Create Database Tables.
  6. Agora selecione Next.
  7. Agora precisamos informar a senha e confirmar para o nosso mailadm que vai poder gerenciar a configuração global do nosso webmail.
  8. Agora selecione Next.
  9. Agora vamos selecionar os protocolos que o nosso webmail vai utilizar, vou selecionar SMTP e IMAP4.
  10. Agora selecione Test connection, caso tenha sucesso vai aparecer: SMTP connection to port 25 successful, sending outgoing e-mail over SMTP should work, IMAP connection to port 143 successful, checking and downloading incoming e-mail over IMAP should work.
  11. Agora selecione Next.
  12. Agora nós fomos redirecionados para uma página sobre a conclusão da nossa instalação. Volte a instalação do nosso webmail.
  13. Agora selecione Exit

Agora precisamos excluir a pasta install do nosso webmail.

rm -rf /var/www/webmail/install/

Vamos acertar o arquivo /etc/php5/apache2/php.ini

vim /etc/php5/apache2/php.ini
[...]
suhosin.session.encrypt=0
[...]
date.timezone = America/Sao_Paulo

Agora precisamos reiniciar o apache

/etc/init.d/apache2 restart

Agora vamos acertar a configuração global do nosso webmail em http://ip_servidor/webmail/adminpanel/ informe o usuário mailadm e a senha que você definiu para ele.

  1. Selecione a Parte seperior da tela Domains
  2. Agora selecione Default domain settings
  3. Agora do lado direito da tela temos a configuração geral do webmail
  4. Em site name informe o nome para o seu Webmail
  5. Agora em skin selecione o Skin padrão para os seus usuários.
  6. Agora fica a sua escolha a opção allow users to access interface settings, que habilita o usuário a efetuar alterações na configuração do webmail.
  7. Agora em Language selecione Portuguese-Brazil
  8. Agora em Timezone selecione (GMT -03:00) Brasilia
  9. Agora em time format selecione 13:00
  10. Agora selecione Save no final da tela do lado direito.
  11. Agora na guia Webmail vamos mudar MEssages per page para 50.
  12. Agora em Autocheck mail every selecione 1 minute.
  13. Agora selecione Save
  14. Selecione agora na parte superior da tela System.
  15. Aqui temos a configuração do nosso banco de dados caso necessite efetuar alguma alteração.
  16. Do lado esquerdo da tela temos o link Security aonde temos o nome do usuário que pode efetuar login no painel de controle e temos a opção de alterar a senha para ele.

O Webmail é bem simples de utilizar não vou entrar em detalhes, basta acessar http://ip_servidor/webmail e informar o usuário e senha que foi criado no postfixadmin.

Instalando o Fail2ban

O Fail2Ban é uma aplicação que analisa continuamente os ficheiros log e bloqueia os endereços Internet de onde originaram várias tentativas falhadas de acesso com senha inválida.

O Fail2Ban é extremamente eficaz na prevenção de ataques de força bruta e de negação de serviço (DoS).

Vamos instalar o fail2ban

aptitude install fail2ban -y

Vamos fazer backup do arquivo de configuração

cp /etc/fail2ban/jail.conf{,.bkp}

Vamos acertar o arquivo de configuração do fail2ban

vim /etc/fail2ban/jail.conf
#---------------------------MAIN--------------------------------------------------------
[DEFAULT]
ignoreip = 127.0.0.1, 10.0.0.0/24
bantime  = 600
maxretry = 3
backend = polling
destemail = douglas@douglasqsantos.com.br
banaction = iptables-multiport
mta = sendmail
protocol = tcp
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]
action = %(action_mwl)s
#--------------------------------END MAIN----------------------------------------------
#-----------------------------SERVICES-------------------------------------------------
[ssh]
enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 3

[pam-generic]
enabled = true
filter  = pam-generic
port = all
banaction = iptables-allports
port     = anyport
logpath  = /var/log/auth.log
maxretry = 3

[ssh-ddos]
enabled = true
port    = ssh
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 3

[apache]
enabled = true
port    = http,https
filter  = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 3

[apache-overflows]
enabled = true
port    = http,https
filter  = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 3

[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix
logpath  = /var/log/mail.log
maxtretry = 3

[sasl]
enabled  = true
port     = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter   = sasl
logpath  = /var/log/mail.log
maxretry = 3
#-----------------------------END SERVICES------------------------------------------------

Agora é so reiniciar o serviço

/etc/init.d/fail2ban restart

Instação e configuração do Knock

Agora vamos instalar o knockd para fazer o controle da porta do ssh

  • “O knockd é uma implementação de port-knocking. Resumidamente falando, com ele podemos deixar todas as portas do servidor fechadas e tê-lo configurado para ouvir “batidas” em algumas portas específicas, sendo que as batidas (corretas) podem gerar a execução de uma regra de firewall para abrir uma porta ou executar qualquer outro comando.”

Vamos fazer a instalação do knock

aptitude install knockd -y

Agora vamos fazer backup do arquivo

cp /etc/default/knockd{,.bkp}
vim /etc/default/knockd
Vamos editar o arquivo e liberar para qual interface ele vai ficar escutando
START_KNOCKD=1
KNOCKD_OPTS="-i eth0"

Vamos fazer backup do arquivo de configuração

cp /etc/knockd.conf{,.bkp}

Vamos ao arquivo de configuração

vim /etc/knockd.conf
[options]
        UseSyslog
        LogFile = /var/log/knockd.log
[openSSH]
        sequence    = 1234:udp,4321:tcp,6789:udp
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 6789:tcp,4321:udp,1234:tcp
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Vamos restartar o serviço:

/etc/init.d/knockd restart

Agora no cliente é so intalar o pacote do knockd

apt-get install knockd -y

Agora para abrir a porta do servidor para o nosso cliente fazemos como abaixo

knock ip_servidor     1234:udp 4321:tcp 6789:udp

Agora vamos ver o log no servidor

tail -f /var/log/knockd.log
[2011-08-31 17:41] starting up, listening on eth0
[2011-08-31 17:43] 10.0.0.20: openSSH: Stage 1
[2011-08-31 17:43] 10.0.0.20: openSSH: Stage 2
[2011-08-31 17:43] 10.0.0.20: openSSH: Stage 3
[2011-08-31 17:43] 10.0.0.20: openSSH: OPEN SESAME
[2011-08-31 17:43] openSSH: running command: /sbin/iptables -A INPUT -s 10.0.0.20 -p tcp --dport 22 -j ACCEPT

A porta foi aberta vamos analizar no firewall

iptables -L -n -v | egrep 22
59  4508 ACCEPT     tcp  --  *      *       10.0.0.20            0.0.0.0/0           tcp dpt:22 
  • Como pode ser notado foi aberta a porta 22 somente para o cliente 10.0.0.20

Para fechar a porta é a sequencia do closeSSH

knock 10.0.0.23 6789:tcp 4321:udp 1234:tcp

Agora vamos ver nos logs para ver se fechou a porta

tail -f /var/log/knockd.log
[2011-08-31 17:50] 10.0.0.20: closeSSH: Stage 1
[2011-08-31 17:50] 10.0.0.20: closeSSH: Stage 2
[2011-08-31 17:50] 10.0.0.20: closeSSH: Stage 3
[2011-08-31 17:50] 10.0.0.20: closeSSH: OPEN SESAME
[2011-08-31 17:50] closeSSH: running command: /sbin/iptables -D INPUT -s 10.0.0.20 -p tcp --dport 22 -j ACCEPT

Agora vamos acertar os Virtuals Host para os nossos serviços trabalharem com https

Vamos gerar a key para o https

Preparando o diretório que vai armazenar os nosso certificados

mkdir -p /etc/ssl/apache
cd /etc/ssl/apache

Gerando a key

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
....................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key: senha
Verifying - Enter pass phrase for server.key: senha

Vamos gerar agora a requisição de assinatura para o certificado

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: senha
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:Douglas
Common Name (eg, YOUR name) []:mail.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos auto assinar o nosso certificado

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=Douglas/CN=mail.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
Getting Private key
Enter pass phrase for server.key: senha

Agora vamos acertar as permissões das chaves

chmod 0400 server.*
 cp server.key server.key.orig

Agora vamos tirar a senha do certificado assinado para que o apache não fique pedindo senha a cada vez que for inicializar

openssl rsa -in server.key.orig -out server.key
 Enter pass phrase for server.key.orig: senha
 writing RSA key

Vamos acertar as permissões de todas as chaves

chmod 0400 /etc/ssl/apache/* 

Vamos agora configurar o host virtual com o acesso via https para o nosso postfixadmin.

OBS:. Não esqueça de inserir uma entrada no servidor DNS para resolver o seu endereço http://postfixadmin.douglasqsantos.com.br para o ip do servidor.

Você também pode testar editando o arquivo /etc/hosts do cliente que vai acessar da seguinte formar

vim /etc/hosts
[...]
ip_servidor  postfixadmin.douglasqsantos.com.br mailadmin
ip_servidor  webmail.douglasqsantos.com.br webmail
ip_servidor  mailwatch.douglasqsantos.com.br mailwatch
ip_servidor  isoqlog.douglasqsantos.com.br isoqlog
ip_servidor  monitor.douglasqsantos.com.br monitor

Quando o cliente for acessar esse endereço vai ser resolvido diretamente para o ip do servidor e o apache vai receber a solicitação do mailadmin.douglasqsantos.com.br

Aqui estamos redirecionando qualquer acesso ao site via http para https para forçar o cliente utilizar criptografia na conexão

vim /etc/apache2/sites-available/postfixadmin
<VirtualHost *:80> 
  ServerName postfixadmin.douglasqsantos.com.br
  Redirect / https://postfixadmin.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br 
        ServerName postfixadmin.douglasqsantos.com.br
  DocumentRoot "/var/www/postfixadmin"
   <Directory "/var/www/postfixadmin">
     Options -Indexes +FollowSymLinks +MultiViews
     AllowOverride All
     Order Allow,deny
     Allow From All
   </Directory>
        
       # ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       # <Directory "/usr/lib/cgi-bin">
       #         AllowOverride None
       #         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       #         Order allow,deny
       #         Allow from all
       # </Directory>

   <IfModule mod_php5.c>
   AddType application/x-httpd-php .php
     php_flag expose_php Off
     php_flag allow_url_fopen Off
     php_flag allow_url_include Off
     php_flag magic_quotes_gpc Off
     php_flag register_globals Off
     php_flag disable_functions show_source
     php_flag disable_functions system
     php_flag disable_functions shell_exec
     php_flag disable_functions passthru
     php_flag disable_functions exec
     php_flag disable_functions popen
     php_flag disable_functions proc_open
     php_flag disable_functions symlink
   </IfModule>
        CustomLog /var/log/apache2/postfixadmin.access.log combined 
        ErrorLog /var/log/apache2/postfixadmin.error.log 
        LogLevel warn 
  SSLEngine on
  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
  ServerSignature Off
</VirtualHost>

Configurando a porta que o nosso host Virtual vai estar escutando.

vim /etc/apache2/ports.conf
[...]
NameVirtualHost *:443

Vamos carregar o módulo ssl para o apache.

a2enmod ssl

Vamos acertar as permissões do diretório

chown -R www-data:www-data /var/www/postfixadmin/

Vamos carregar o nosso host Virtual

a2ensite postfixadmin

Agora vamos criar o virtual host para o webmail

vim /etc/apache2/sites-available/webmail
<VirtualHost *:80> 
  ServerName webmail.douglasqsantos.com.br
  Redirect / https://webmail.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br
        ServerName webmail.douglasqsantos.com.br
  DocumentRoot "/var/www/webmail"
   <Directory "/var/www/webmail">
     Options -Indexes +FollowSymLinks +MultiViews
     AllowOverride All
     Order Allow,deny
     Allow From All
   </Directory>
        
       # ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       # <Directory "/usr/lib/cgi-bin">
       #         AllowOverride None
       #         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       #         Order allow,deny
       #         Allow from all
       # </Directory>

   <IfModule mod_php5.c>
   AddType application/x-httpd-php .php
     php_flag expose_php Off
     php_flag allow_url_fopen Off
     php_flag allow_url_include Off
     php_flag magic_quotes_gpc Off
     php_flag register_globals Off
     php_flag disable_functions show_source
     php_flag disable_functions system
     php_flag disable_functions shell_exec
     php_flag disable_functions passthru
     php_flag disable_functions exec
     php_flag disable_functions popen
     php_flag disable_functions proc_open
     php_flag disable_functions symlink
   </IfModule>
        CustomLog /var/log/apache2/webmail.access.log combined 
        ErrorLog /var/log/apache2/webmail.error.log 
        LogLevel warn 
  SSLEngine on
  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
  ServerSignature Off
</VirtualHost>

Vamos carregar o virtual host do webmail

a2ensite webmail

Agora vamos configurar o virtual host do mailwatch

vim /etc/apache2/sites-available/mailwatch
<VirtualHost *:80> 
  ServerName mailwatch.douglasqsantos.com.br
  Redirect / https://mailwatch.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br
        ServerName mailwatch.douglasqsantos.com.br
  DocumentRoot "/var/www/mailwatch"
   <Directory "/var/www/mailwatch">
     Options -Indexes +FollowSymLinks +MultiViews
     AllowOverride All
     Order Allow,deny
     Allow From All
   </Directory>
        
       # ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       # <Directory "/usr/lib/cgi-bin">
       #         AllowOverride None
       #         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       #         Order allow,deny
       #         Allow from all
       # </Directory>

   <IfModule mod_php5.c>
   AddType application/x-httpd-php .php
     php_flag expose_php Off
     php_flag allow_url_fopen Off
     php_flag allow_url_include Off
     php_flag magic_quotes_gpc Off
     php_flag register_globals Off
     php_flag disable_functions show_source
     php_flag disable_functions system
     php_flag disable_functions shell_exec
     php_flag disable_functions passthru
     php_flag disable_functions exec
     php_flag disable_functions popen
     php_flag disable_functions proc_open
     php_flag disable_functions symlink
   </IfModule>
        CustomLog /var/log/apache2/maia.access.log combined 
        ErrorLog /var/log/apache2/maia.error.log 
        LogLevel warn 
  SSLEngine on
  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
  ServerSignature Off
</VirtualHost>

Agora vamos carregar o nosso virtual host do mailwatch

a2ensite mailwatch

Agora vamos desabilitar os virtuais hosts defaults

a2dissite default
a2dissite default-ssl

Agora é sé reiniciar o apache

/etc/init.d/apache2 restart

Agora você pode acessar da seguinte forma

Geradores de relatórios

Iremos instalar alguns geradores de relatórios para acompanharmos o desenpenho dos serviços do servidor:

aptitude install rrdtool mailgraph queuegraph isoqlog munin munin-plugins-extra munin-node munin-common mailping -y
  • Será perguntado qual o servidor de e-mail utilizado, selecione postfix ;
  • Será perguntado onde será gravado os logs, deixe o padrão;
  • Será perguntado o nome da máquina, deixe o mostrado;
  • Será perguntado a Língua usada para as saídas dos relatórios, seleciona Português
  • Será perguntado os domṕinios que serão gerados relatórios, informe os domínios separados por espaços;

Agora vamos acertar algumas configurações dos geradores de relatórios mailgraph

dpkg-reconfigure mailgraph 
  • Responda da seguinte forma
  1. Sim.
  2. Ok
  3. não

Aqui no caso do isoqlog temos que executar /usr/bin/isoqlog para ele gerar os nossos relátorios ele ta no cron.daily então ele vai ser executado uma vez por dia.

No meu ponto de vista acho interresante executar ele a cada hora então podemos mudar ele.

cp -rfa /etc/cron.daily/isoqlog /etc/cron.hourly/ 

Agora vamos configurar o virtual host do isoqlog

vim /etc/apache2/sites-available/isoqlog
<VirtualHost *:80> 
  ServerName isoqlog.douglasqsantos.com.br
  Redirect / https://isoqlog.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br
        ServerName isoqlog.douglasqsantos.com.br
  DocumentRoot "/var/www/isoqlog"
   <Directory "/var/www/isoqlog">
     Options -Indexes +FollowSymLinks +MultiViews
     AllowOverride All
     Order Allow,deny
     Allow From All
   </Directory>
        
       ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       <Directory "/usr/lib/cgi-bin">
               AllowOverride None
               Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
               Order allow,deny
               Allow from all
       </Directory>

   <IfModule mod_php5.c>
   AddType application/x-httpd-php .php
     php_flag expose_php Off
     php_flag allow_url_fopen Off
     php_flag allow_url_include Off
     php_flag magic_quotes_gpc Off
     php_flag register_globals Off
     php_flag disable_functions show_source
     php_flag disable_functions system
     php_flag disable_functions shell_exec
     php_flag disable_functions passthru
     php_flag disable_functions exec
     php_flag disable_functions popen
     php_flag disable_functions proc_open
     php_flag disable_functions symlink
   </IfModule>
        CustomLog /var/log/apache2/isoqlog.access.log combined 
        ErrorLog /var/log/apache2/isoqlog.error.log 
        LogLevel warn 
  SSLEngine on
  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
  ServerSignature Off
</VirtualHost>

Agora vamos carregar o virtual host do isoqlog

a2ensite isoqlog

Agora temos que reiniciar o apache

/etc/init.d/apache2 restart

Agora vamos executar o isoqlog para gerar os nosso relátorio

/usr/bin/isoqlog 
Year: 2011 Month: 10
outputdir:/var/www/isoqlog
htmldir:/usr/share/isoqlog/htmltemp
logtype:postfix
logstore:/var/log/mail.log
langfile:/usr/share/isoqlog/lang/portuguese
maxsender:100
maxreceiver:100
maxtotal:100
maxbyte:100
hostname: mail.douglasqsantos.com.br
Domains douglasqsantos.com.br
The Created directory : /var/www/isoqlog/douglasqsantos.com.br
The Created directory : /var/www/isoqlog/douglasqsantos.com.br/2011
The Created directory : /var/www/isoqlog/douglasqsantos.com.br/2011/10
The Created directory : /var/www/isoqlog/general
The Created directory : /var/www/isoqlog/general/2011
The Created directory : /var/www/isoqlog/general/2011/10

A configuração do nosso isoqlog se baseia em dois arquivos

Primeiro arquivo que tem a configuração principal do isoqlog

vim /etc/isoqlog/isoqlog.conf
#isoqlog 2.0 Configuration file

logtype     = "postfix"
logstore    = "/var/log/mail.log"
domainsfile = "/etc/isoqlog/isoqlog.domains"
outputdir   = "/var/www/isoqlog"
htmldir     = "/usr/share/isoqlog/htmltemp"
langfile    = "/usr/share/isoqlog/lang/portuguese"
hostname    = "mail.douglasqsantos.com.br"

maxsender   = 100
maxreceiver = 100
maxtotal    = 100

maxbyte     = 100

Arquivo que controla os domínios que vão ser gerados relatórios, informe um domínio por linha caso tenha mais de um domínio.

vim /etc/isoqlog/isoqlog.domains
douglasqsantos.com.br

Agora vamos acessar os relatórios em

Ajustando o munin

vim /etc/munin/munin.conf
[...]
dbdir  /var/lib/munin
htmldir /var/www/monitor
logdir /var/log/munin
rundir  /var/run/munin
[...]
tmpldir /etc/munin/templates

# a simple host tree
[localhost.localdomain]
   address 127.0.0.1
   use_node_name yes

Vamos reiniciar o munin

/etc/init.d/munin-node restart

Vamos acertar o virtual host do munin

vim /etc/apache2/sites-available/monitor
<VirtualHost *:80> 
  ServerName monitor.douglasqsantos.com.br
  Redirect / https://monitor.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br
        ServerName monitor.douglasqsantos.com.br
  DocumentRoot "/var/www/monitor"
   <Directory "/var/www/monitor">
     Options -Indexes +FollowSymLinks +MultiViews
     AllowOverride All
     Order Allow,deny
     Allow From All
   </Directory>
        
       #ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       #<Directory "/usr/lib/cgi-bin">
       #        AllowOverride None
       #        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       #        Order allow,deny
       #        Allow from all
       #</Directory>

   <IfModule mod_php5.c>
   AddType application/x-httpd-php .php
     php_flag expose_php Off
     php_flag allow_url_fopen Off
     php_flag allow_url_include Off
     php_flag magic_quotes_gpc Off
     php_flag register_globals Off
     php_flag disable_functions show_source
     php_flag disable_functions system
     php_flag disable_functions shell_exec
     php_flag disable_functions passthru
     php_flag disable_functions exec
     php_flag disable_functions popen
     php_flag disable_functions proc_open
     php_flag disable_functions symlink
   </IfModule>
        CustomLog /var/log/apache2/monitor.access.log combined 
        ErrorLog /var/log/apache2/monitor.error.log 
        LogLevel warn 
  SSLEngine on
  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
  ServerSignature Off
</VirtualHost>

Vamos carregar o virtual host do munin

a2ensite monitor

Agora vamos fazer um acerto

ln -sf /var/cache/munin/www monitor

Agora só reiniciar o apache

/etc/init.d/apache2 restart

Agora para acessar o nosso monitor é só acessar

Aqui vamos ter as estatísticas do nosso servidor de vários fatores.

Agora vamos criar um script para gerenciar os nossos serviços de Email o primeiro vamos levar em consideração que instalamos o Courier.

vim /etc/init.d/servmail.sh
#!/bin/bash
### CORES UTILIZADAS NO SCRIPT ###
GREY="\033[01;30m"
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
BLUE="\033[01;34m"
PURPLE="\033[01;35m"
CYAN="\033[01;36m"
WHITE="\033[01;37m"
CLOSE="\033[m"

#VALIDA RETORNO DE COMANDO
_CHECAR () {
if [ $? -eq 0 ]; then
  echo -e "${GREEN}[  OK  ]${CLOSE}"
else
  echo -e " ${RED}[ FALHOU ]${CLOSE}"
fi
}


STOP="apache2 saslauthd amavis spamassassin postgrey clamav-daemon clamav-freshclam courier-authdaemon courier-imap courier-imap-ssl courier-pop courier-pop-ssl postfix"
START="saslauthd amavis spamassassin postgrey clamav-daemon clamav-freshclam courier-authdaemon courier-imap courier-imap-ssl courier-pop courier-pop-ssl postfix apache2"


case $1 in
stop)
echo -e "${RED} PARANDO OS SERVICOS ${CLOSE}"
for END in ${STOP}
do
/etc/init.d/${END} stop 
echo -e "${RED} SERVICO ${END} PARADO COM SUCESSO ${CLOSE} $(_CHECAR)";
done
echo -e "${RED} SERVICOS PARADOS ${CLOSE}"
;;

start)
echo -e "${BLUE} INICIANDO OS SERVICOS ${CLOSE}"
for END in ${START}
do
/etc/init.d/${END} start
echo -e "${BLUE} SERVICO ${END} INICIADO COM SUCESSO ${CLOSE} $(_CHECAR)";
done
echo -e "${BLUE} SERVICOS INICIADOS ${CLOSE}"
;;

restart)
  $0 stop
  $0 start
;;

  *)
   echo  "${RED}Opcoes Validas:(start|stop|restart)${CLOSE}"
  ;;

esac

Agora vamos acertar as permissões do script.

chmod 755 /etc/init.d/servmail.sh

Agora para parar os serviços de email.

/etc/init.d/servmail.sh stop

Agora para iniciar os serviços de email.

/etc/init.d/servmail.sh start

Agora para reiniciar os serviços de email.

/etc/init.d/servmail.sh restart

Agora é só ir ajustando de acordo com o seu ambiente.

Referências