Solução completa de serviço de correio baseado em software livre (Debian GNU/Linux)
Recompilação do artigo "Postfix-2 + domínios virtuais + MySQL + SASL + PostfixAdmin", de autoria do Sr. Marco A. S. Máximo. Nesse novo artigo os passos foram tomados levando em consideração os recursos do Debian e usando (sempre que possível) os pacotes dos repositórios oficiais.
Parte 3: Instalando o MySQL
Estou utilizando o MySQL disponível nos repositórios oficiais, instalados com o comando:
# apt-get install mysql-client-4.1 mysql-common-4.1 mysql-server-4.1 php4-mysql libmysqlclient10-dev
Foram instalados os seguintes pacotes:
# mysql_install_db
Depois da tabela MySQL criada, inicie o serviço:
# /etc/init.d/mysql start
Por default a senha do ROOT para acesso ao MySQL fica em branco. Vamos alterá-la para uma nova e desabilitar alguns itens para aumentar a segurança do banco de dados.
OBS: Tecle ENTER quando for perguntado sobre o password do ROOT, pois está em branco. Depois responda as perguntas conforme a sua preferência (normalmente YES para todas).
# mysql_secure_installation
All done! If you've completed all of the above steps, your MySQL installation should now be secure.
Thanks for using MySQL!
DICA: Por padrão no Debian, o log do MySQL está desabilitado. Esse recurso é muito útil para identificar alguns erros durante a instalação de aplicativos que fazem acesso ao banco.
Para resolver esse problema, edite o arquivo /etc/mysql/my.cnf e localize a seguinte linha:
#log = /var/log/mysql/mysql.log
troque-a para:
# apt-get install mysql-client-4.1 mysql-common-4.1 mysql-server-4.1 php4-mysql libmysqlclient10-dev
Foram instalados os seguintes pacotes:
- mysql-client-4.1 - mysql database client binaries
- mysql-common-4.1 - mysql database common files (e.g. /etc/mysql
- mysql-server-4.1 - mysql database server binaries
- php4-mysql - MySQL module for php4
- libmysqlclient10-dev - LGPL-licensed client development files for MySQL databases
# mysql_install_db
Depois da tabela MySQL criada, inicie o serviço:
# /etc/init.d/mysql start
Por default a senha do ROOT para acesso ao MySQL fica em branco. Vamos alterá-la para uma nova e desabilitar alguns itens para aumentar a segurança do banco de dados.
OBS: Tecle ENTER quando for perguntado sobre o password do ROOT, pois está em branco. Depois responda as perguntas conforme a sua preferência (normalmente YES para todas).
# mysql_secure_installation
All done! If you've completed all of the above steps, your MySQL installation should now be secure.
Thanks for using MySQL!
DICA: Por padrão no Debian, o log do MySQL está desabilitado. Esse recurso é muito útil para identificar alguns erros durante a instalação de aplicativos que fazem acesso ao banco.
Para resolver esse problema, edite o arquivo /etc/mysql/my.cnf e localize a seguinte linha:
#log = /var/log/mysql/mysql.log
troque-a para:
log = /var/log/mysql/mysql.log
Reinicie o MySQL:
# /etc/init.d/mysql restart
e teste:
# tail -f /var/log/mysql/mysql.log
/usr/sbin/mysqld, Version: 4.1.11-Debian_4-log. started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
050809 11:39:53 1 Connect debian-sys-maint@localhost on
1 Quit
No Debian o logrotate já vem com configuração para tratar os logs do MySQL, apenas verifique se o arquivo /etc/logrotate.d/mysql-server existe.
Vamos agora criar as tabelas para o Postfix. Crie um arquivo com o nome "postfix_mysql.db" com o seguinte conteúdo:
ATENÇÃO:
- Substitua, no primeiro bloco, o valor "senha_do_postfix" pela senha do usuário do Postfix;
- Substitua, caso queira, o diretório onde ficaram as caixas postais dos usuários, no último bloco no campo home. No meu caso estou usando o diretório "/var/spool/correio/".
# INICIO DO postfix_mysql.db
#
# Postfix / MySQL
#
# Cria o usuário e senha do Postfix e Maildrop para
# acesso ao banco
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('xxxxx'));
INSERT INTO user (Host, User, Password) VALUES ('localhost','maildrop',password('xxxxx'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','maildrop','Y');
FLUSH PRIVILEGES;
#
# Cria o banco postfix
#
CREATE DATABASE postfix;
#
# Cria a estrutura da tabela alias
#
USE postfix;
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address)
) TYPE=MyISAM COMMENT='Virtual Aliases - mysql_virtual_alias_maps';
#
# Cria a estrutura da tabela domain
#
USE postfix;
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) NOT NULL default 'maildrop',
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain)
) TYPE=MyISAM COMMENT='Virtual Domains - mysql_virtual_domains_maps';
#
# Cria a estrutura da tabela mailbox
#
USE postfix;
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
home char(255) default '/var/spool/correio/',
maildir varchar(255) NOT NULL default '',
quota varchar(255) NOT NULL default '10000000S',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
passwd_expire enum('N','Y') default 'Y',
uid int(10) unsigned default '120',
gid int(10) unsigned default '120',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Mailboxes - mysql_virtual_mailbox_maps';
#
# Table structure for table vacation
#
CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
#
# Table structure for table domain_admins
#
CREATE TABLE domain_admins (
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
#
# Table structure for table log
#
CREATE TABLE log (
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
action varchar(255) NOT NULL default '',
data varchar(255) NOT NULL default '',
KEY timestamp (timestamp)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';
#
# Cria o usuário de administração do PostfixAdmin
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('xxxxx'));
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
FLUSH PRIVILEGES;
#
# Cria a tabela de administração do PostfixAdmin
#
USE postfix;
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Admins - Store Virtual Domain Admins';
# FIM DO postfix_mysql.db
#
# Postfix / MySQL
#
# Cria o usuário e senha do Postfix e Maildrop para
# acesso ao banco
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('xxxxx'));
INSERT INTO user (Host, User, Password) VALUES ('localhost','maildrop',password('xxxxx'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','maildrop','Y');
FLUSH PRIVILEGES;
#
# Cria o banco postfix
#
CREATE DATABASE postfix;
#
# Cria a estrutura da tabela alias
#
USE postfix;
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address)
) TYPE=MyISAM COMMENT='Virtual Aliases - mysql_virtual_alias_maps';
#
# Cria a estrutura da tabela domain
#
USE postfix;
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) NOT NULL default 'maildrop',
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain)
) TYPE=MyISAM COMMENT='Virtual Domains - mysql_virtual_domains_maps';
#
# Cria a estrutura da tabela mailbox
#
USE postfix;
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
home char(255) default '/var/spool/correio/',
maildir varchar(255) NOT NULL default '',
quota varchar(255) NOT NULL default '10000000S',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
passwd_expire enum('N','Y') default 'Y',
uid int(10) unsigned default '120',
gid int(10) unsigned default '120',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Mailboxes - mysql_virtual_mailbox_maps';
#
# Table structure for table vacation
#
CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
#
# Table structure for table domain_admins
#
CREATE TABLE domain_admins (
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
#
# Table structure for table log
#
CREATE TABLE log (
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
action varchar(255) NOT NULL default '',
data varchar(255) NOT NULL default '',
KEY timestamp (timestamp)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';
#
# Cria o usuário de administração do PostfixAdmin
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('xxxxx'));
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
FLUSH PRIVILEGES;
#
# Cria a tabela de administração do PostfixAdmin
#
USE postfix;
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Admins - Store Virtual Domain Admins';
# FIM DO postfix_mysql.db
Depois do arquivo criado, execute o comando:
# mysql -psenha_do_root < postfix_mysql.db
O banco e as tabelas, bem como o usuário do Postfix serão criados. Vamos testar o acesso do usuário postfix:
# mysql -D postfix -u postfix -psenha_do_postfix
mysql> show tables;
+-------------------+ | Tables_in_postfix | +-------------------+ | admin | | alias | | domain | | mailbox | +-------------------+ 4 rows in set (0.00 sec)mysql> desc alias;
+-------------+--------------+------+-----+---------------------+ | Field | Type | Null | Key | Default | +-------------+--------------+------+-----+---------------------+ | address | varchar(255) | | PRI | | | goto | text | | | | | domain | varchar(255) | | | | | create_date | datetime | | | 0000-00-00 00:00:00 | | change_date | datetime | | | 0000-00-00 00:00:00 | | active | tinyint(4) | | | 1 | +-------------+--------------+------+-----+---------------------+Descrição: Essa tabela é onde serão criados os redirecionamentos (ALIAS).
- address: É o endereço do novo redirecionamento (ALIAS)
- goto: É o destinatário(os) do redirecionamento.
+--------------------------+----------------------------+
| address | goto |
+--------------------------+----------------------------+
|postmaster@dominio.com.br | fulano@dominio.com.br |
+--------------------------+----------------------------+
|postmaster@dominio2.com.br| fulano@dominio2.com.br, |
| sicrano@dominio1.com.br |
+--------------------------+----------------------------+
mysql> desc domain;
+-------------+--------------+------+-----+ | Field | Type | Null | Key | Default | +-------------+--------------+------+-----+---------------------+ | domain | varchar(255) | | PRI | | | description | varchar(255) | | | | | transport | varchar(128) | | | maildrop | | create_date | datetime | | | 0000-00-00 00:00:00 | | change_date | datetime | | | 0000-00-00 00:00:00 | | active | tinyint(4) | | | 1 | +-------------+--------------+------+-----+---------------------+Descrição: Essa tabela é onde você cria e indica o domínio.
- transport: Nesse campo você indica se o transporte será "local", para usuários do sistema ou "maildrop", para usuários virtuais. O padrão é "maildrop".
+---------------+------------------+------+-----+---------------------+
| Field | Type | Null | Key | Default |
+---------------+------------------+------+-----+---------------------+
| username | varchar(255) | | PRI | |
| password | varchar(255) | | | |
| name | varchar(255) | | | |
| home | varchar(255) | YES | | /var/spool/correio |
| maildir | varchar(255) | | | |
| quota | varchar(255) | | |10000000S |
| domain | varchar(255) | | | |
| create_date | datetime | | | 0000-00-00 00:00:00 |
| change_date | datetime | | | 0000-00-00 00:00:00 |
| active | tinyint(4) | | | 1 |
| uid | int(10) unsigned | YES | | 120 |
| gid | int(10) unsigned | YES | | 120 |
| passwd_expire | enum('N','Y') | YES | | Y |
+---------------+------------------+------+-----+---------------------+
Descrição: É a principal tabela, onde serão criados os usuários e suas configurações, como senha, diretório, cota de disco, etc.
- username: É o login do usuário. Ex: fulano@dominio.com.br;
- password: É a senha do usuário, você pode usar dois tipos de senhas: crypt() ou clear text. Esse último é interesante caso você vá usar alguma autenticação que use Cram-MD5. Eu uso o crypt, acho mais ético;
- name: O nome completo do usuário;
- home: É o diretório aonde será criado as caixas postais dos usuários. Normalmente e usado o /home, mas no meu caso usarei o diretório /var/spool/correio/. Usar um outro diretório no lugar do "/home/" é recomendável, pois o dono desse diretório deve ser o usuário maildrop. Isso pode causar um problema caso você já tenha usuários criados nesse diretório.
Um outro motivo é o programa MSEC que vem no Mandrake. Ele constantemente faz uma checagem nas permissões dos diretórios contido seu banco de dados, conforme o nível de segurança escolhido e muitas vezes, tive a permissão do diretório /home alterada para o original pelo programa. Uma opção para resolver esse problema é desabilitar o MSEC, mas segurança nunca é demais :-)
- maildir: É o Maildir do usuário, onde os emails serão armazenados;
- quota: É a cota de disco do usuário, o default é 10MB. Note o "S" no final do valor, ele é necessário para o maildrop criar o arquivo "maildirsize" no diretório do usuário. Esse arquivo contém um cálculo da cota atual do usuário;
- domain: Domínio de qual faz parte o usuário;
- active: Esse campo serve para habilitar(1) ou desabilitar(0) a conta do usuário, é usado pelo courier-imap para permitir o login do usuário. Serve também para maltratar um pouco dos seus desafetos dentro da empresa :-)
- uid: virtual uid (use o do usuário maildrop);
- gid: virtual gid (use o do usuário maildrop);
- passwd_expire: Esse campo é utilizado por alguns programas para forçar a mudança de senha por parte do usuário.
+-------------+--------------+------+-----+---------------------+ | Field | Type | Null | Key | Default | +-------------+--------------+------+-----+---------------------+ | username | varchar(255) | | PRI | | | password | varchar(255) | | | | | domain | varchar(255) | | | | | create_date | datetime | | | 0000-00-00 00:00:00 | | change_date | datetime | | | 0000-00-00 00:00:00 | | active | tinyint(4) | | | 1 | +-------------+--------------+------+-----+---------------------+Descrição: Essa tabela é usada pelo PostfixAdmin para criar os administradores que serão responsáveis pela administração das contas dos respectivos domínios.
O banco de email está criado. O que temos que fazer é "ensinar" ao Postfix a conectar-se no MySQL e pegar os dados que ele precisa sobre o usuário. Mas antes vamos configurar o Courier-IMAP.
Configurações bem detalhadas... Com certeza vai facilitar a vida de muita gente.
Fica a sugestão para implementar um webmail...