构建Postfix邮件服务器的详细过程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

电子邮件系统概述


邮件系统角色

在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的源代码实现特定的功能。

  • Postfix

  • Sendmail的替代品。


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.cf

    • master程序配置文件

  • /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 fatalpanic 等比较重要的事件记录。

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构建简单电子邮件系统

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

http://leiyue.files.wordpress.com/2011/07/wpid-postfix_basic_structure.png

  • IP地址

  • 192.168.1.n

  • 邮件域

  • benet99.com

  • 主机名

  • mail.benet99.com

  • 邮件账号

  • test

  • POP3/IMAP4服务

  • dovecot

  • LAMP平台

  • /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服务器中,支持两种邮箱存储方式。

    postfix reload
    netstat -antpl | grep :25
    • Mailbox

    • 所有邮件存储在同一个文件内,默认是 /var/spool/mail/username ,每个邮件之间以特定的标记分割。

    • Maildir/

    • 使用目录结构来存储,每一封邮件保存成一个文件,每个文件名称一般有一定的规律

      例如会包含时间戳、pid及inode节点号等每一封邮件作为一个独立的文件保存。

  • 添加邮件用户账号 
    使用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等。


http://leiyue.files.wordpress.com/2011/07/wpid-postfix_webmail_structure.png

  • 下载软件包 

    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认证机制。


http://leiyue.files.wordpress.com/2011/07/wpid-smtpd_cyrus_sasl.png

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发信认证就不能作为发信服务器发送邮件。

    • 使用密文测试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.
    • 获得用户名和密码的加密密文 

      printf "leiyue" | openssl base64

      命令结果为:

      bGVpeXVl
      printf "pwd@123" | openssl base64

      命令结果为:

      cHdkQDEyMw==


设置用户别名与邮件群组

邮件别名是邮件系统的重要功能,主要来实现邮件的群发。邮件别名依赖于 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邮件系统中,根据邮件用户的类型,邮件存储的方式不同可采取不同的方法来限制用户邮箱空间大小

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

    • 使用 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
    • 使用 mailboxsizelimit 配置项 
      主要针对使用系统用户的情况,默认限制是50MB。该参数对使用Mailbox邮件存储方式的用户生效。

      postconf | grep mailbox_size_limit
      mailbox_size_limit = 51200000


构建Postfix邮件服务器(二)


配置Postfix支持虚拟用户

当邮件用户达到一定数量时,邮件系统将在用户安全,系统管理以及数据维护等方面遇到巨大的挑战

为了提供更好的性能,效率和安全性,使用虚拟邮件用户将是一个更好的选择。


http://leiyue.files.wordpress.com/2011/07/wpid-postfix_virtual_user.png


建立虚拟用户数据库

ExtMail是由国内开源组织使用Perl语言开发的一套功能强大的中文Webmail平台

主要包括ExtMail和Extman两个部分的程序套件。

  • ExtMail

  • 提供给邮件用户使用邮件系统的Web界面

  • Extman

  • 提供给邮件系统管理员管理邮件系统的Web界面

http://leiyue.files.wordpress.com/2011/07/wpid-extmail.png


访问站点 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发信认证


http://leiyue.files.wordpress.com/2011/07/wpid-authdaemond.png

  • 下载源码包 

    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发信认证配置 

    • 修改SMTP发信认证配置 

      vim /usr/lib/sasl2/smtpd.conf

      内容为:

      pwcheck_method:authdaemond
      authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
    • 启动authdaemond服务 

      service authdaemond start
      chkconfig --add authdaemond
      chkconfig authdaemond on
    • 添加authdaemond为系统服务 

      cp ~/courier-authlib-0.63.0/courier-authlib.sysvinit /etc/init.d/authdaemond
      chmod a+x /etc/init.d/authdaemond
    • 设置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)
    • 设置authdaemon服务目录权限 

      chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
    • 修改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=""
    • 验证库文件路径 

      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
    • 添加库文件路径 

      echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf


修改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套件 

    • 登录并使用ExtMail邮件系统 
      访问 
      http://mail.benet.com 。

    • 重启httpd服务 

      /usr/local/apache2/bin/apachectl restart
    • 编译安装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服务配置 

      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>
    • 建立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
      ……
    • 调整cgi目录权限 

      chown -R postfix:postfix cgi
    • 解压源码包 

      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


部署ExtMail Web管理界面

部署好ExtMail程序套件后,电子邮件用户可以通过Web界面登录和使用邮件服务

但邮件域名为extmail.org,还需要安装Extman程序套件,通过Web界面对ExtMail邮件系统进行管理


  • 安装gd-devel软件包 

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

      yum install gd-devel -y
    • 配置YUM支持DVD源 

      cp ~/cdrom.repo /etc/yum.repos.d/
      yum update
  • 安装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套件 

    • 调整临时会话目录的权限 

      chown -R postfix:postfix /tmp/extman
    • 创建临时会话目录 

      mkdir /tmp/extman
    • 修改配置文件 

      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
      ……
    • 调整cgi目录权限 

      chown -R postfix:postfix cgi
    • 解压源码包 

      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
  • 调整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

  • 检查收件人地址

http://leiyue.files.wordpress.com/2011/07/wpid-smtpd_restrictions.png

  • 根据客户端主机名/地址过滤 
    通过设置限制条件 
    check_client_access 检查邮件客户端是否满足访问策略要求。

    vim /etc/postfix/main.cf
    smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

    建立 /etc/postfix/access 文本文件,根据需要设置访问策略

    客户端地址可以使用ip地址,网络地址,主机名或域名等形式。常见的过滤工作有:

    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
    • REJECT

    • 拒绝

    • OK

    • 允许

    • DISCARD

    • 丢弃

  • 根据客户端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

  • 提供病毒邮件查杀功能

http://leiyue.files.wordpress.com/2011/07/wpid-mailscanner.png

其主要工作流程:

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

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

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

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

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

  • 安装并配置MailScanner 

    • 启动MailScanner服务 

      service MailScanner start
      chkconfig MailScanner on
    • 调整邮件过滤队列的目录的属主,属组 

      chown -R postfix:postfix /var/spool/MailScanner/incoming
      chown -R postfix:postfix /var/spool/MailScanner/quarantine
    • 配置Postfix支持Mailscanner 

      vim /etc/postfix/main.cf

      添加以下内容:

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

      添加以下内容:

      /^Received:/    HOLD
    • 配置软件包 

      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/*
    • 安装软件包 

      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.
    • 下载软件包 

      wget http://www.mailscanner.info/files/4/rpm/MailScanner-4.83.4-1.rpm.tar.gz
  • 安装并配置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


本文转自 2012hjtwyf 51CTO博客,原文链接:xxxhttp://blog.51cto.com/hujiangtao/1931627 xxxx,如需转载请自行联系原作者
相关文章
|
2月前
|
弹性计算 人工智能 安全
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(3)
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(3)
433 0
|
2月前
|
弹性计算 安全 网络安全
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(2)
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(2)
479 0
|
4月前
|
存储 设计模式
用反应器模式和epoll构建百万并发服务器
用反应器模式和epoll构建百万并发服务器
39 0
|
5月前
|
存储 缓存 安全
高并发内存池实战:用C++构建高性能服务器(下)
高并发内存池实战:用C++构建高性能服务器
高并发内存池实战:用C++构建高性能服务器(下)
|
1月前
|
机器学习/深度学习 Python
Python基础:构建一个简单的Web服务器
Python基础:构建一个简单的Web服务器
57 1
|
2月前
|
存储 缓存 网络协议
Go语言并发编程实战:构建高性能Web服务器
【2月更文挑战第6天】本文将通过构建一个高性能的Web服务器实战案例,深入探讨如何在Go语言中运用并发编程技术。我们将利用goroutine和channel实现高效的请求处理、资源管理和并发控制,以提升Web服务器的性能和稳定性。通过这一实战,你将更好地理解和掌握Go语言在并发编程方面的优势和应用。
|
2月前
|
弹性计算 安全 网络安全
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(1)
带你读《从基础到应用云上安全航行指南》——阿里云产品专家教你如何全方位构建ECS安全体系(1)
427 0
|
2月前
|
弹性计算
电子书阅读分享《基于ECS倚天实例的应用构建最佳实践》
电子书阅读分享《基于ECS倚天实例的应用构建最佳实践》
259 1
|
2月前
|
前端开发 Java API
构建异步高并发服务器:Netty与Spring Boot的完美结合
构建异步高并发服务器:Netty与Spring Boot的完美结合
|
2月前
|
SQL 弹性计算 安全
一文教你如何从零构建机密计算平台解决方案-ECS安全季
本文整理自【弹性计算技术公开课——ECS安全季】中,阿里云弹性计算产品专家唐湘华和阿里云弹性计算高级技术专家聂百川带来的收官课程《从零构建机密计算平台的解决方案》一节。