构建Postfix邮件服务器

 

电子邮件系统概述

邮件系统角色

在Internet中,电子邮件系统并不是一个孤立的体系,除了需要DNS服务提供邮件域名的解析,可以使用Web服务提供用户界面以外,邮件系统的内部也是由不同的软件程序组成的。

MTA 邮件传输代理负责接受客户端邮件,并将其传输给其他的MTA。MTA是电子邮件系统的核心部分。例如Sendmail,Postfix和Exchange。MDA 邮件分发代理负责在服务器中将邮件分发到用户邮箱。有些MTA集成MDA功能。例如Exchange。MUA 邮件用户代理负责提供邮件阅读,撰写,发送,接收等管理界面。例如Mutt,Pine等。 

邮件系统协议

RFC822电子邮件报文格式,规定了电子邮件由邮件头和邮件内容两个部分组成。SMTP发送和传输电子邮件。MUA使用SMTP协议将邮件发送给MTA,MTA使用SMTP协议将邮件传输给其他的MTA。SMTP协议使用端口TCP 25,发信认证部分被称为ESMTP。POP3从邮件服务器获取邮件,然后在离线处理邮件。POP3协议使用端口TCP 110。IMAP4以联机的方式处理邮件,可以选择性下载邮件。IMAP4协议使用端口TCP 143。MIME现代邮件传输格式,让电子邮件具备传输二进制文件的能力。

邮件服务器软件

Exchange微软的企业电子邮件方案,多用于企业环境。Notes/Domino由Lotus公司开发的电子邮件产品,后被IBM收购,多用于政府机构,银行等大型机构。Sendmail最早的Unix/Linux电子邮件系统。配置相对复杂,安全性欠佳。Qmail易于二次开发的Unix/Linux电子邮件系统。企业按照自己的需求,修改Qmail的源代码实现特定的功能。PostfixSendmail的替代品。

Postfix基础

Postfix 采用模块化设计,由不同的程序实现不同的功能。Postfix的主进程名为 master ,由主进程根据需求启动其他程序协同处理邮件。

Postfix可以直接使用本地系统用户作为邮件用户,也可以使用虚拟用户。虚拟用户帐号信息通常存储在MySQL数据库中。

wget http://www.postfix.cn/source/official/postfix-2.7.3.tar.gz wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.2.patch

编译安装Postfix

  • 预处理 
    service sendmail stop rpm -qa | grep sendmail | xargs rpm -e --nodeps 

  • 创建服务用户和组 
    groupadd -g 1200 postdrop groupadd -g 1000 postfix useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix

  • 解压源码包 
    tar zxvf postfix-2.7.3.tar.gz cd postfix-2.7.3 patch -Np1 < ../postfix-vda-2.7.2.patch 

  • 配置源码包 
    yum install db4-devel yum install cyrus-sasl-devel

    rpm -ivh /media/cdrom/Server/db4-devel-4.3.29-9.fc6.i386.rpm rpm -ivh /media/cdrom/Server/cyrus-sasl-devel-2.1.22-4.i386.rpm  make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/ -DUSE_CYRUS_SASL -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/ -lmysqlclient -lm -lz -L/usr/lib/sasl2 -lsasl2' 
  • 编译并安装 
    vim /etc/ld.so.conf /usr/local/mysql/lib/ ldconfig -v make && make install

Postfix目录

/etc/postfix/主配置目录,包含主配置文件,各类脚本,查询表等。/etc/postfix/main.cf主配置文件/etc/postfix/master.cfmaster程序配置文件/usr/libexec/postfix/服务器程序目录/var/spool/postfix/邮件队列相关目录/var/spool/postfix/incoming/传入队列/var/spool/postfix/active/活动队列/var/spool/postfix/deferred/推迟队列/var/spool/postfix/hold/约束队列/var/spool/postfix/corrupt/错误队列/usr/sbin/服务管理程序目录/usr/sbin/postalais用于构造,修改和查询别名表/usr/sbin/postconf用于显示和编辑主配置文件/usr/sbin/postfix用于启动和停止postfix服务/usr/sbin/postmap用于构造,修改或查询查询表/usr/sbin/postqueue用于一般用户管理邮件队列/usr/sbin/postsuper用于超级用户管理邮件对列

Postfix配置文件

Postfix系统最主要的配置文件包括: /etc/postfix/main.cf 和 /etc/postfix/master.cf 。

/etc/postfix/main.cf 是Postfix服务的主配置文件。 /etc/postfix/main.cf 是master程序配置文件。

/etc/postfix/main.cf 配置项有300多个,大部分配置都设置了默认值。大多数时候只需要配置少数几个参数,就可以满足一般邮件服务器的要求。

Postfix系统提供了 postconf 工具用来辅助配置,不带任何选项的postconf命令将显示当前Postfix服务所使用的配置参数, -n 选项则显示不同于默认配置的参数。

postconf postconf -n 

邮件管理员经常使用postconf命令简化 /etc/postfix/main.cf 文件,只保留与默认配置不同的参数,提高主配置文件的易读性。

cd /etc/postfix/ postconf -n > new.cf cp main.cf main.cf.bak mv new.cf main.cf cat main.cf

Postfix日志文件

Postfix系统的日志文件位于 /var/log/maillog 文件中,该文件记录了Postfix服务器运行状态信息。在安装调试Postfix邮件系统及日常维护过程中,经常会使用 tail 命令带 -f 选项实时观察日志内容变化。

tail -f /var/log/maillog 

如果日志内容较多,还可以使用 egrep 命令进行过滤,只关注包含 reject warning error fatal panic 等比较重要的事件记录。

egrep '(reject|warning|error|fatal|panic):' /var/log/maillog 

Postfix启动控制

Postfix服务的启动控制主要通过 /usr/sbin/postfix 命令来完成。

postfix (start|stop|check|reload) postfix start netstat -antpl | grep :25 

基于Postfix构建简单电子邮件系统

构建基本发信,收信服务器的配置和测试。

IP地址192.168.1.n邮件域benet99.com主机名mail.benet99.com邮件账号testPOP3/IMAP4服务dovecotLAMP平台/usr/local/apache2/ /usr/local/mysql/ /usr/local/php5域名服务器192.168.1.100

配置并测试Postfix服务器

Postfix主要提供基于SMTP协议的发信服务,其最基本的功能就是存储和发送邮件。

  • 修改主配置文件 
    Postfix主配置文件内不能使用 单引号 或 双引号 。vim /etc/postfix/main.cf 

    内容为:

    command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 home_mailbox = Maildir/                 //指定邮件存储目录 html_directory = no mail_owner = postfix mailq_path = /usr/bin/mailq manpage_directory = /usr/local/man mydestination = $mydomain, $myhostname  //指定接收邮件域名 mydomain = benet.com                    //指定邮件域名 myhostname = mail.benet.com             //指定邮件主机名 myorigin = $mydomain                    //指定发送邮件域名 newaliases_path = /usr/bin/newaliases queue_directory = /var/spool/postfix readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop unknown_local_recipient_reject_code = 550

    用户的邮箱空间用于保存各自的电子邮件内容。在Postfix服务器中,支持两种邮箱存储方式。

    Mailbox所有邮件存储在同一个文件内,默认是 /var/spool/mail/username ,每个邮件之间以特定的标记分割。Maildir/使用目录结构来存储,每一封邮件保存成一个文件,每个文件名称一般有一定的规律,例如会包含时间戳、pid及inode节点号等每一封邮件作为一个独立的文件保存。postfix reload netstat -antpl | grep :25 
  • 添加邮件用户账号 
    使用Linux系统账号发送邮件。

  • 发送邮件测试 
    telnet localhost 25 helo localhost mail from: hacker@linux.com rcpt to: leiyue@benet.com data subject: Test Mail from: hacker@linux.com to: leiyue@benet.com hello! this is a test mail! . quit

构建Dovecot服务器

Dovecot是一个安全性较好的POP3/IMAP服务器软件,响应速度快且扩展性好。Dovecot默认使用Linux系统用户,通过PAM方式进行身份验证。

  • 下载软件 
    wget http://www.dovecot.org/releases/2.0/dovecot-2.0.11.tar.gz

  • 预处理 
    useradd -M -s /sbin/nologin dovecot useradd -M -s /sbin/nologin dovenull

  • 解压源码包 
    tar zxvf dovecot-2.0.11.tar.gz cd dovecot-2.0.11

  • 安装PAM开发包 
    yum install pam-devel

    rpm -ivh /media/cdrom/Server/pam-devel-0.99.6.2-3.27.el5.i386.rpm 
  • 配置编译安装 
    ./configure --sysconfdir=/etc --with-mysql --with-pam make && make install

  • 修改配置文件 
    vim /etc/dovecot/dovecot.conf 

    内容为:

    ssl = no protocols = pop3 imap disable_plaintext_auth = no mail_location = maildir:~/Maildir passdb {   driver = pam } userdb {   driver = passwd } 
  • 检查配置文件 
    doveconf -n 

  • 编辑PAM文件 
    cp ~/dovecot.pam /etc/pam.d/dovecot 

    vim /etc/pam.d/dovecot 

    内容为:

    #%PAM-1.0 auth       include      system-auth account    include      system-auth password   include      system-auth session    include      system-auth
  • 添加为系统服务 
    cp ~/dovecot.server /etc/init.d/dovecot chmod a+x /etc/init.d/dovecot chkconfig --add dovecot chkconfig dovecot on

  • 启动服务 
    service dovecot start netstat -antpl | grep dovecot

  • POP3接收邮件测试 
    telnet localhost 110 user leiyue pass pwd@123 list retr 1 quit

使用Outlook Express邮件客户端

此处省略xxxx字。

扩展Postfix邮件系统的功能

WEBMAIL邮件界面

Webmail是指提供给邮件用户发信收信的Web界面。通过访问邮件系统提供的Web界面,可以和邮件客户端软件实现相同的邮件管理功能。使用Webmail简单,便捷,在Internet邮件服务中得到了广泛的应用。

Postfix邮件系统支持多种Webmail,例如:OpenWebmail,Extmail,SquirreMail等。

  • 下载软件包 
    wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.21/squirrelmail-1.4.21.tar.bz2 wget http://downloads.sourceforge.net/project/squirrelmail/locales/1.4.18-20090526/zh_CN-1.4.18-20090526.tar.gz

  • 解压软件包 
    tar jxvf squirrelmail-1.4.21.tar.bz2 -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/squirrelmail-1.4.21 /usr/local/apache2/htdocs/webmail cd /usr/local/apache2/htdocs/webmail tar zxvf ~/zh_CN-1.4.18-20090526.tar.gz 

  • 调整权限设置 
    mkdir -p attach data chown -R daemon:daemon attach/ data/ chmod 730 attach/ 

  • 修改配置文件 
    cp config/config_default.php config/config.php vim config/config.php

    修改以下内容:

    $domain = 'benet.com'; $smtpServerAddress = 'localhost'; $smtpPort = 25; ……     $imapServerAddress = 'localhost'; $imapPort = 143; $imap_server_type = 'dovecot'; …… $data_dir = '/usr/local/apache2/htdocs/webmail/data/'; $attachment_dir = '/usr/local/apache2/htdocs/webmail/attach/'; …… $squirrelmail_default_language = 'zh_CN'; $default_charset = 'zh_CN.UTF-8'; 

设置SMTP的用户认证

SMTP发信认证是避免被人当作垃圾发送邮件服务器的必要措施。当用户通过SMTP协议向外部邮件域发送邮件时,服务器要求用户提供用户名和密码进行身份烟长。只有通过身份验证的用户才被允许发送外部邮件,否则将拒绝发信。

在Postfix邮件系统中,可以使用Cyrus SASL软件来实现基本的SMTP认证机制。

rpm -qa | grep cyrus cyrus-sasl-2.1.22-4 cyrus-sasl-lib-2.1.22-4 cyrus-sasl-devel-2.1.22-4 cyrus-sasl-plain-2.1.22-4

  • 设置Cyrus SASL函数库 
    vim /usr/lib/sasl2/smtpd.conf 

    内容为:

    pwcheck_method:saslauthd 
  • 启动saslauthd服务 
    service saslauthd start chkconfig saslauthd on

  • 修改主配置文件 
    vim /etc/postfix/main.cf 

    内容为:

    command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 home_mailbox = Maildir/ html_directory = no mail_owner = postfix mailq_path = /usr/bin/mailq manpage_directory = /usr/local/man mydestination = $mydomain, $myhostname mydomain = benet.com myhostname = mail.benet.com myorigin = $mydomain newaliases_path = /usr/bin/newaliases queue_directory = /var/spool/postfix readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination //指定smtpd允许和拒绝条件 smtpd_sasl_auth_enable = yes               //指定smtpd认证方式 smtpd_sasl_security_options = noanonymous  //拒绝匿名用户访问 unknown_local_recipient_reject_code = 550
  • 测试SMTP发信认证 
    添加了SMTP发信认证就不能作为发信服务器发送邮件。

    • 获得用户名和密码的加密密文 
      printf "leiyue" | openssl base64

      命令结果为:

      bGVpeXVl printf "pwd@123" | openssl base64

      命令结果为:

      cHdkQDEyMw== 
    • 使用密文测试SMTP发信认证 
      telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix helo localhost 250 mail.benet.com mail from: leiyue@benet.com 250 2.1.0 Ok rcpt to: d0nny@163.com 554 5.7.1 <d0nny@163.com>: Relay access denied quit 221 2.0.0 Bye Connection closed by foreign host. telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix helo localhost 250 mail.benet.com       auth login 334 VXNlcm5hbWU6 bGVpeXVl 334 UGFzc3dvcmQ6 cHdkQDEyMw== 235 2.7.0 Authentication successful mail from: leiyue@benet.com 250 2.1.0 Ok rcpt to: d0nny@163.com 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> subject: test mail from: leiyue@benet.com to: d0nny@163.com this is a test mail for d0nny@163.com . 250 2.0.0 Ok: queued as 869682F408 quit 221 2.0.0 Bye Connection closed by foreign host. 

设置用户别名与邮件群组

邮件别名是邮件系统的重要功能,主要来实现邮件的群发。邮件别名依赖于 aliases 机制,需要用到查询表。

  • Postfix查询表 
    Postfix服务器在处理邮件的过程中经常需要做各种转换和查询,需要使用查询表 /etc/aliases 来完成。postconf | grep aliases alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases, nis:mail.aliases

  • 设置邮件别名实现群发 
    修改别名表。vim /etc/aliases 

    添加以下内容:

    root:    leiyue hr:      leiyue

    使用 newaliases 命令生成 /etc/aliases.db 数据库文件。Postfix系统将识别并使用/etc/aliases.db 文件中的设置。

    newaliases 

设置邮件大小,邮箱空间限制

  • 限制用户发送邮件大小 
    Postfix系统默认支持10MB大小的邮件,需要注意的是这里的大小是经过Base64函数编码后的邮件大小。postconf | grep message_size_limit message_size_limit = 10240000

    修改发送邮件的默认大小为20MB。

    vim /etc/postfix/main.cf 

    添加以下内容:

    message_size_limit = 20480000 postfix reload
  • 限制用户邮箱空间大小 
    在Postfix邮件系统中,根据邮件用户的类型,邮件存储的方式不同,可以采取不同的方法来限制用户邮箱空间大小。

    • 使用 mailboxsizelimit 配置项 
      主要针对使用系统用户的情况,默认限制是50MB。该参数对使用Mailbox邮件存储方式的用户生效。postconf | grep mailbox_size_limit mailbox_size_limit = 51200000

    • 使用 virtualmailboxlimit 配置项 
      主要针对使用虚拟用户的情况,默认限制50MB。安装VDA补丁后,该参数对使用Mailbox或Maildir存储方式的用户都生效。postconf | grep virtual_mailbox_limit virtual_mailbox_limit = 51200000 virtual_mailbox_limit_inbox = no virtual_mailbox_limit_maps =  virtual_mailbox_limit_override = no

  • 使用 quota 磁盘配额 
    主要针对使用系统用户的情况,可以直接使用Linux的磁盘配额功能。对使用Mailbox和Maildir存储方式的用户都生效。

配置Postfix支持虚拟用户

当邮件用户达到一定数量时,邮件系统将在用户安全,系统管理以及数据维护等方面遇到巨大的挑战。为了提供更好的性能,效率和安全性,使用虚拟邮件用户将是一个更好的选择。

建立虚拟用户数据库

ExtMail是由国内开源组织使用Perl语言开发的一套功能强大的中文Webmail平台,主要包括ExtMail和Extman两个部分的程序套件。

ExtMail提供给邮件用户使用邮件系统的Web界面Extman提供给邮件系统管理员管理邮件系统的Web界面 

访问站点  http://www.extmail.org/cgi-bin/download.cgi 下载软件包ExtMail和Extman最新版。 

使用 Extman 虚拟邮件管理系统在MySQL数据库中建立初始化数据库和表,用于保存虚拟邮件域,虚拟邮件用户相关信息。

service mysqld restart tar zxvf extman-1.1.tar.gz cd extman-1.1/docs mysql -u root -p < extmail.sql

由于数据库版本不同,导入 extmail.sql 数据库时报错:

ERROR 1064 (42000) at line 50: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM COMMENT='Ext/Webman - Admin Accounts'' at line 15

用文本编辑器打开extmail.sql,将数据库文件内的所有 TYPE=MyISAM 替换为 ENGINE=MyISAM ,保存退出。

丢弃导入到一半出错的数据库 extmail 。

mysql -u root -p mysql> drop database extmail; 

重新导入数据库。

mysql -u root -p < extmail.sql mysql -u root -p < init.sql

脚本 extmail.sql 完成的主要数据库操作:

  1. 创建名为 extmail 的数据库,初始化一些表。

  2. 创建数据库用户 extmail@localhost ,密码为 extmail ,对数据库extmail的表有select,update权限。

  3. 创建数据库用户 webman@localhost ,密码为 extman ,对数据库extmail表有select,insert,delete,update权限。

脚本 init.sql 完成的主要数据库操作:

  1. 初始化数据库 extmail

  2. 建立名为 extmail.org 的虚拟邮件域

  3. 建立数据库用户 root@extmail.org ,密码为 extman*123* ,作为邮件域的管理账号。

  4. 建立数据库用户 postmaster@extmail.org ,密码为 extmail ,作为基本邮件用户。

修改Postfix配置

使用虚拟邮件域时,其中邮件域名,邮件用户名,密码及邮件别名等信息都存储在MySQL数据库中。当Postfix接收到一封新邮件时,首先检查是不是发往本地域的邮件,如果不是则转向数据库查询是不是发往虚拟域的邮件,确认收件人是否存在、用户邮箱路径等信息。

了解当前的Postfix系统是否支持MySQL数据库。

postconf -m | grep mysql

修改Postfix的主配置文件,添加虚拟邮件用户配置项。

vim /etc/postfix/main.cf 

修改以下内容:

…… # mydestination = $mydomain, $myhostname …… virtual_mailbox_base = /var/mailbox virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_uid_maps = static:1000 virtual_gid_maps = static:1000

各配置项具体作用如下:

virtual_mailbox_base指定虚拟邮箱存储目录virtual_alias_maps指定虚拟邮件用户对应别名virtual_mailbox_maps指定记录虚拟邮箱和存储位置的对应关系virtual_mailbox_domains设置Postfix服务器可以接收的虚拟邮件域域名virtual_uid_maps设置所有虚拟邮件用户映射用户的UID号virtual_gid_maps设置所有虚拟邮件用户映射组的GID号 

将extman提供的虚拟用户映射表文件复制到Postfix的配置目录中。

cp *.cf /etc/postfix/ 

为虚拟用户设置SMTP发信认证

由于虚拟邮件用户的账号信息保存在MySQL数据库中,仅仅使用Cyrus SASL已经无法完成SMTP发信认证,这时需要结合Courier-authlib的 authdaemond 服务才能提供基于MySQL数据库虚拟用户的SMTP发信认证。

  • 下载源码包 
    wget http://downloads.sourceforge.net/project/courier/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2

  • 解压源码包 
    tar jxvf courier-authlib-0.63.0.tar.bz2 cd courier-authlib-0.63.0

  • 安装expat软件包 
    yum install expect

    rpm -ivh /media/cdrom/Server/expat-1.95.8-8.2.1.i386.rpm 
  • 卸载MySQL的rpm包 
    rpm -e mysql

  • 配置软件包 
    ./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-stdheaderdir --with-authmysql --with-redhat --with-mysql-libs=/usr/local/mysql/lib --with-mysql-includes=/usr/local/mysql/include 

  • 编译安装 
    make && make install

  • 生成配置文件 
    make install-configure

  • 修改SMTP发信认证配置 

    • 添加库文件路径 
      echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf 

    • 验证库文件路径 
      ldconfig -v | grep -A 9 courier-authlib

      命令结果为:

      /usr/local/courier-authlib/lib/courier-authlib:     libcourierauthsasl.so -> libcourierauthsasl.so.0     libauthuserdb.so -> libauthuserdb.so.0     libcourierauth.so -> libcourierauth.so.0     libauthcustom.so -> libauthcustom.so.0     libauthmysql.so -> libauthmysql.so.0     libauthpipe.so -> libauthpipe.so.0     libcourierauthcommon.so -> libcourierauthcommon.so.0     libauthpam.so -> libauthpam.so.0     libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0
    • 修改authdaemond主配置文件 
      cd /etc/authlib/ cp authdaemonrc authdaemonrc.bak grep -v "^#" authdaemonrc | grep -v "^$" > newauthdaemonrc mv newauthdaemonrc authdaemonrc vim authdaemonrc

      内容为:

      authmodulelist="authmysql" authmodulelistorig="authmysql" daemons=5 authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon DEBUG_LOGIN=0 DEFAULTOPTIONS="" LOGGEROPTS="" 
    • 设置authdaemon服务目录权限 
      chmod 755 /usr/local/courier-authlib/var/spool/authdaemon 

    • 设置authdaemond数据库配置 
      cp authmysqlrc authmysqlrc.bak grep -v "^#" authmysqlrc | grep -v "^$" > newauthmysqlrc mv newauthmysqlrc authmysqlrc vim authmysqlrc

      内容为:

      MYSQL_SERVER        localhost MYSQL_USERNAME      extmail MYSQL_PASSWORD      extmail MYSQL_SOCKET        /tmp/mysql.sock MYSQL_PORT          0 MYSQL_OPT           0 MYSQL_DATABASE      extmail MYSQL_USER_TABLE    mailbox MYSQL_CRYPT_PWFIELD password MYSQL_UID_FIELD     uidnumber MYSQL_GID_FIELD     gidnumber MYSQL_LOGIN_FIELD   username MYSQL_HOME_FIELD    concat('/var/mailbox/', homedir) MYSQL_NAME_FIELD    name MYSQL_MAILDIR_FIELD concat('/var/mailbox/', maildir) 
    • 添加authdaemond为系统服务 
      cp ~/courier-authlib-0.63.0/courier-authlib.sysvinit /etc/init.d/authdaemond chmod a+x /etc/init.d/authdaemond 

    • 启动authdaemond服务 
      service authdaemond start chkconfig --add authdaemond chkconfig authdaemond on

    • 修改SMTP发信认证配置 
      vim /usr/lib/sasl2/smtpd.conf 

      内容为:

      pwcheck_method:authdaemond authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket

修改Dovecot的配置

  • 启用Dovecot的数据库认证 
    vim /etc/dovecot/dovecot.conf 

    内容为:

    ssl = no protocols = pop3 imap disable_plaintext_auth = no mail_location = maildir:~/Maildir passdb {   args = /etc/dovecot/dovecot-mysql.conf.ext   driver = sql } userdb {   args = /etc/dovecot/dovecot-mysql.conf.ext   driver = sql } 
  • 建立数据库查询配置文件 
    vim /etc/dovecot/dovecot-mysql.conf.ext 

    内容为:

    driver = mysql connect = host=localhost dbname=extmail user=extmail password=extmail default_pass_scheme = CPYPT password_query = select username as user, password from mailbox where username = '%u' user_query = select maildir, uidnumber as uid, gidnumber as gid from mailbox where username = '%u' 
  • 调整默认邮件存储目录权限 
    mkdir -p /var/mailbox/extmail.org/postmaster/Maildir/ chown -R postfix:postfix /var/mailbox 

测试虚拟用户

  • 测试authdaemond服务 
    /usr/local/courier-authlib/sbin/authtest -s login postmaster@extmail.org extmail

    命令结果为:

    Authentication succeeded.      Authenticated: postmaster@extmail.org  (uid 1000, gid 1000)     Home Directory: /var/mailbox/extmail.org/postmaster            Maildir: /var/mailbox/extmail.org/postmaster/Maildir/              Quota: (none) Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0 Cleartext Password: extmail            Options: (none) 
  • 测试虚拟用户的发信认证 
    printf "postmaster@extmail.org" | openssl base64

    命令结果为:

    cG9zdG1hc3RlckBleHRtYWlsLm9yZw== printf "extmail" | openssl base64

    命令结果为:

    ZXh0bWFpbA== telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix auth login 334 VXNlcm5hbWU6 cG9zdG1hc3RlckBleHRtYWlsLm9yZw== 334 UGFzc3dvcmQ6 ZXh0bWFpbA== 235 2.7.0 Authentication successful

ExMail邮件使用及管理平台

部署ExtMail邮件使用界面

  • 安装Perl支持包 
    cpan cpan> install Unix::Syslog cpan> install DBI cpan> install DBD::mysql

  • 安装并配置ExtMail套件 

    • 解压源码包 
      tar zxvf extmail-1.2.tar.gz -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/extmail-1.2 /usr/local/apache2/htdocs/extmail cd /usr/local/apache2/htdocs/extmail 

    • 调整cgi目录权限 
      chown -R postfix:postfix cgi

    • 建立ExtMail配置文件 
      cp webmail.cf.default webmail.cf vim /usr/local/apache2/htdocs/extmail/webmail.cf 

      修改以下内容:

      SYS_CONFIG = /usr/local/apache2/htdocs/extmail/ SYS_LANGDIR = /usr/local/apache2/htdocs/extmail/lang SYS_TEMPLDIR = /usr/local/apache2/htdocs/extmail/html …… SYS_MAILDIR_BASE = /var/mailbox SYS_AUTH_SCHEMA = virtual SYS_CRYPT_TYPE = md5crypt SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /tmp/mysql.sock …… SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket …… 
    • 调整httpd服务配置 
      vim /usr/local/apache2/conf/httpd.conf 

      修改以下内容:

      …… LoadModule suexec_module    modules/mod_suexec.so NameVirtualHost     192.168.1.103 <VirtualHost 192.168.1.103>     ServerName  mail.benet.com     DocumentRoot    /usr/local/apache2/htdocs/extmail/html     ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi     Alias       /extmail /usr/local/apache2/htdocs/extmail/html     SuexecUserGroup postfix postfix </VirtualHost> 
    • 编译安装httpd服务的 mod_suexec 模块 
      cd /usr/src/httpd-2.2.17/ ./configure --enable-suexec -with-suexec-caller=daemon make suexec make install-suexec cd modules/generators/ /usr/local/apache2/bin/apxs -c mod_suexec.c /usr/local/apache2/bin/apxs -i -a -n suexec ./.libs/mod_suexec.so 

    • 重启httpd服务 
      /usr/local/apache2/bin/apachectl restart

部署ExtMail Web管理界面

部署好ExtMail程序套件后,电子邮件用户可以通过Web界面登录和使用邮件服务。但邮件域名为extmail.org,还需要安装Extman程序套件,通过Web界面对ExtMail邮件系统进行管理。

  • 安装gd-devel软件包 

    • 配置YUM支持DVD源 
      cp ~/cdrom.repo /etc/yum.repos.d/ yum update

    • 使用YUM安装gd-devel软件包 
      yum install gd-devel -y 

  • 安装Perl支持包 
    如果不安装 gd-devel 软件包,安装Perl支持包的过程中会出现找不到 gdlib-config 命令的错误。cpan cpan> install GD cpan> install File::Tail cpan> exit

  • 安装rrdtool绘图引擎 
    wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/rrdtool-1.4.5-1.el5.pp.i386.rpm wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/perl-rrdtool-1.4.5-1.el5.pp.i386.rpm yum install libdbi rpm -ivh rrdtool-1.4.5-1.el5.pp.i386.rpm rpm -ivh perl-rrdtool-1.4.5-1.el5.pp.i386.rpm

  • 安装并配置Extman套件 

    • 解压源码包 
      tar zxvf extman-1.1.tar.gz -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/extman-1.1 /usr/local/apache2/htdocs/extman cd /usr/local/apache2/htdocs/extman 

    • 调整cgi目录权限 
      chown -R postfix:postfix cgi

    • 修改配置文件 
      cp webman.cf.default webman.cf vim webman.cf

      修改以下内容:

      SYS_CONFIG = /usr/local/apache2/htdocs/extman/ SYS_LANGDIR = /usr/local/apache2/htdocs/extman/lang SYS_TEMPLDIR = /usr/local/apache2/htdocs/extman/html SYS_MAILDIR_BASE = /var/mailbox …… SYS_SESS_DIR = /tmp/extman/ …… SYS_BACKEND_TYPE = mysql SYS_CRYPT_TYPE = md5crypt SYS_MYSQL_USER = webman SYS_MYSQL_PASS = webman SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /tmp/mysql.sock …… 
    • 创建临时会话目录 
      mkdir /tmp/extman 

    • 调整临时会话目录的权限 
      chown -R postfix:postfix /tmp/extman 

  • 调整httpd服务配置 
    vim /usr/local/apache2/conf/httpd.conf 

    修改以下内容:

    …… LoadModule suexec_module        modules/mod_suexec.so NameVirtualHost         192.168.1.103 <VirtualHost 192.168.1.103>         ServerName      mail.benet.com         DocumentRoot    /usr/local/apache2/htdocs/extmail/html         ScriptAlias     /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi         Alias           /extmail /usr/local/apache2/htdocs/extmail/html         ScriptAlias     /extman/cgi /usr/local/apache2/htdocs/extman/cgi         Alias           /extman /usr/local/apache2/htdocs/extman/html         SuexecUserGroup postfix postfix </VirtualHost> 
  • 重启httpd服务 
    /usr/local/apache2/bin/apachectl restart

    service httpd restart
  • 登录并管理ExtMail邮件系统 
    访问 http://mail.benet.com/extman/ 。

    • 添加虚拟邮件域,设置虚拟域用户容量,邮箱大小等

    • 添加虚拟邮件用户,设置用户密码,可使用的邮件服务等

    • 添加邮件域的管理用户

    • 设置邮件别名或群组

  • 查看邮件系统的图形化信息 
    cp -r /usr/local/apache2/htdocs/extman/addon/mailgraph_ext /usr/local/ cd /usr/local/mailgraph_ext/ ./mailgraph-init start echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local

邮件邮件过滤和防病毒

对于运行在Internet环境中的企业电子邮件系统来说,如何有效的防范垃圾邮件和病毒邮件是一个必须解决的问题。

基于邮件地址的过滤

在SMTP会话过程中,客户端程序在每个阶段分别向服务器提供不同的地址信息,Postfix系统可以针对这些信息进行检查,并通过主配置文件的配置项决定如何处理邮件。

检查配置参数和检查对象如下:

smtpd_client_restrictions检查客户端的主机名/地址smtpd_helo_restrictions检查客户端HELO信息中的主机名smtpd_sender_restrictions检查发件人地址smtpd_recipient_restrictions检查收件人地址 

 

  •   

  • 根据客户端主机名/地址过滤 
    通过设置限制条件 check_client_access 检查邮件客户端是否满足访问策略要求。vim /etc/postfix/main.cf smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

    建立 /etc/postfix/access 文本文件,根据需要设置访问策略。客户端地址可以使用ip地址,网络地址,主机名或域名等形式。常见的过滤工作有:

    REJECT拒绝OK允许DISCARD丢弃vim /etc/postfix/access 

    添加以下内容:

    127.0.0.1     OK 192.168.1     OK 192.168.1.100 REJECT

    设置完毕后,使用 postmap 命令将 /etc/postfix/access 文件转换为hash数据库/etc/postfix/access.db 。

    postmap /etc/postfix/access 
  • 根据客户端HELO主机名过滤 
    vim /etc/postfix/main.cf 

    添加以下内容:

    smtpd_helo_required = yes smtpd_helo_restrictions = reject_invalid_hostname
  • 根据发件人地址过滤 
    vim /etc/postfix/main.cf 

    添加以下内容:

    smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf smtpd_sender_restrictions = reject_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access vim /etc/postfix/sender_access 

    添加以下内容:

    hacker@linux.com REJECT cracker@         REJECT 163.com          REJECT portmap /etc/postfix/sender_accessF 
  • 根据收件人地址过滤 
    vim /etc/postfix/main.cf 

    添加以下内容:

    smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain

基于邮件内容的过滤

在Postfix邮件系统中,针对邮件内容的过滤及反病毒邮件功能,可以由 MailScanner 调度SpamAssassin 和 F-Prot 软件来实现。

MailScanner协调调度邮件过滤软件俺SpamAssassin根据邮件内容过滤垃圾邮件F-Prot提供病毒邮件查杀功能 

 

其主要工作流程:

  • 由Postfix将接收的邮件全部放到 hold 队列中

  • MailScanner对 hold 队列的邮件进行处理

    • 调用SpamAssassin对邮件内容进行检查

    • 调用F-Prot对邮件内容进行扫描

  • 检查完毕的邮件转入 incoming 队列中交给Postfix投递

  • 安装并配置MailScanner

    • 下载软件包 
      wget http://www.mailscanner.info/files/4/rpm/MailScanner-4.83.4-1.rpm.tar.gz

    • 安装软件包 
      tar zxvf MailScanner-4.83.4-1.rpm.tar.gz cd MailScanner-4.83.4-1 yum install rpm-build ./install.sh nodeps The important ones are HTML-Parser and MIME-tools. 

    • 配置软件包 
      vim /etc/MailScanner/MailScanner.conf 

      修改以下内容:

      …… Run As User = postfix Run As Group = postfix Queue Scan Interval = 6 Incoming Queue Dir = /var/spool/postfix/hold Outgoing Queue Dir = /var/spool/postfix/incoming Incoming Work Dir = /var/spool/MailScanner/incoming Quarantine Dir = /var/spool/MailScanner/quarantine PID file = /var/run/MailScanner.pid Restart Every = 7200 MTA = postfix Sendmail = /usr/sbin/sendmail Sendmail2 = /usr/sbin/sendmail …… Use SpamAssassin = yes Max SpamAssassin Size = 200k Required SpamAssassin Score = 6 High SpamAssassin Score = 10 SpamAssassin Auto Whitelist = yes SpamAssassin Timeout = 75 Max SpamAssassin Timeouts = 10 SpamAssassin Timeouts History = 30 Check SpamAssassin If On Spam List = yes Include Binary Attachments In SpamAssassin = no Spam Score = yes Cache SpamAssassin Results = yes SpamAssassin Cache Database File = /var/spool/MailScanner/incoming/SpamAssassin.cache.db Rebuild Bayes Every = 0 Wait During Bayes Rebuild = no Use Custom Spam Scanner = no Max Custom Spam Scanner Size = 20k Custom Spam Scanner Timeout = 20 Max Custom Spam Scanner Timeouts = 10 Custom Spam Scanner Timeout History = 20 Spam Actions = deliver header "X-Spam-Status: Yes" High Scoring Spam Actions = delete forward spam@benet.com Non Spam Actions = deliver header "X-Spam-Status: No" …… Debug = no Debug SpamAssassin = no …… include /etc/MailScanner/conf.d/* 
    • 配置Postfix支持Mailscanner 
      vim /etc/postfix/main.cf 

      添加以下内容:

      header_checks = regexp:/etc/postfix/header_checks vim /etc/postfix/header_checks 

      添加以下内容:

      /^Received:/    HOLD
    • 调整邮件过滤队列的目录的属主,属组 
      chown -R postfix:postfix /var/spool/MailScanner/incoming chown -R postfix:postfix /var/spool/MailScanner/quarantine 

    • 启动MailScanner服务 
      service MailScanner start chkconfig MailScanner on

  • 安装并配置SpamAssassin 
    yum install spamassassin service spamassassin start chkconfig spamassassin on

  • 安装并配置F-Prot 
    wget http://files.f-prot.com/files/unix-trial/fp-Linux-i686-ws.tar.gz tar zxvf fp-Linux-i686-ws.tar.gz -C /opt/ cd /opt/f-prot/ ./install-f-prot.pl /opt/f-prot/fpupdate crontab -e 

    添加以下内容:

    38 * * * * root /opt/f-prot/fpupdate > /dev/null crontab -l service crond start chkconfig crond on

邮件内容过滤与防病毒测试

  • 测试邮件内容过滤 
    发送测试邮件的文本内容如下:XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X tail /var/log/maillog 

  • 测试反病毒邮件 
    发送测试邮件的文本内容如下:X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* tail /var/log/maillog