Postfix基于虚拟用户虚拟域的邮件架构

上图是一个几乎完整的邮件系统架构图,这里基于Mysql数据库进行用户认证,不管是Postfix、Dovecot、webmail都需要去Mysql数据库中进行用户认证。

1、用户可以基于outlook连接postfix然后通过Courier-authlib连接到Mysql进行认证,认证成功就可以发送邮件。前面我们也是用Cyrus-sasl进行shadow用户认证,其实Cyrus-sasl也同样支持Mysql认证。但是由于驱动比较底层配置起来比较繁琐,所以选用Courier-authlib进行认证,但是从上图可以看出我们是postfix还是借用Cyrus-sasl函数库与Courier-authlib进行连接。同样的道理Postfix也可以直接连接到Courier-authlib但是比较麻烦。

2、用户可以基于outlook连接Dovecot然后直接到mysql进行认证,认证成功就可以接收Mailbox中的邮件。这里比较简单,因为Dovecot自身支持到Mysql的认证。

3、用户可以基于webmail进行收发邮件,同样通过Extmail/Extman到Mysql中认证,认证成功。就可以基于postfix发邮件,基于Dovecot收邮件。但是Extmail/Extman自身就可以到Mailbox中收取邮件。

Courier-authlib

Courier 是一个优秀的电子信件系统,拥有一个完整的邮件系统:其提供MTA(Courier-MTA),MDA(Maildrop),MUA,MRA(Courier-IMAP),SASL(Courier-authlib)WebMail(sqwebmail)等这些组件。

Courier-authlib是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为Courier的其它组件提供认证服务。其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等。因此,courier-authlib也常用来与courier之外的其它邮件组件(如postfix)整合为其提供认证服务。

虚拟用户虚拟域配置

安装ltdl动态模块加载器
[root@localhost ~]# yum install libtool-ltdl libtool-ltdl-devel
安装expect主机间通信
[root@localhost ~]# yum install expect
创建用户
[root@localhost ~]# groupadd -g 1001 vmail
[root@localhost ~]# useradd vmail -u 1001 -g 1001
安装Courier-authlib
[root@localhost ~]# tar xvf courier-authlib-0.66.1.tar.bz2 -C /usr/src/
[root@localhost ~]# cd /usr/src/courier-authlib-0.66.1
[root@localhost courier-authlib-0.66.1]# ./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
#以上without是不支持此类认证免得需要安装依赖的数据包
--with-authmysql \
#基于mysql认证
--with-mysql-libs=/usr/lib64/mysql \
--with-mysql-includes=/usr/include/mysql \
#需要mysql的头文件和库文件路径一定要正确
--with-redhat \
#如果是redhat系统会实现自我优化;如果不是就不要加了
--with-authmysqlrc=/etc/authmysqlrc \
#提供给mysql的配置文件,记录认证怎样跟数据进行交互
--with-authdaemonrc=/etc/authdaemonrc \
#courier-authlib自身是一个服务进程所以也需要一个配置文件
--with-mailuser=vmail \
--with-mailgroup=vmail \
#用户邮件收发管理的用户和组
[root@smtp ~]# make && make install
调整配置文件
[root@localhost ~]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
#调整一下authdaemon的权限(存放进程套接字) [root@localhost ~]# cp -p /etc/authdaemonrc.dist /etc/authdaemonrc
#调整courier文件名,因--with-authdaemonrc=/etc/authdaemonrc指定了文件名 [root@localhost ~]# cp -p /etc/authmysqlrc.dist /etc/authmysqlrc
#调整跟mysql交互文件名,因--with-authmysqlrc=/etc/authmysqlrc指定了文件名
调整courier-authlib配置文件
[root@localhost ~]# vim /etc/authdaemonrc
authmodulelist="authmysql"
#指定认证模块为authmysql
authmodulelistorig="authmysql"
#认证的原始模块只保留authmysql
daemons=10
#修改默认开启进程
#DEBUT-LOGIN=2
#如果使用虚拟用户登录有问题就打开调试功能看看日志;不然不要打开
调整通过MYSQL进行邮件账号认证文件
[root@localhost ~]# vim /etc/authmysqlrc
MYSQL_SERVER localhost
#指定Mysql服务器地址
MYSQL_USERNAME extmail
#连接数据库的用户名(如果不使用extmail,那么在extman中需要重新指定账号)
MYSQL_PASSWORD extmail
#用户密码
MYSQL_PORT 3306
#指定你的mysql的端口(使用socket通信就不用端口)
MYSQL_SOCKET /var/lib/mysql/mysql.sock
#Mysql的套接字文件
MYSQL_DATABASE extmail
#存储用户的库(如果不使用extmail,那么在extman中都要更改)
MYSQL_USER_TABLE mailbox
#存储用户的表(mailbox是extman帮我们自动生成的不能改)
MYSQL_CRYPT_PWFIELD password
#认证密码字段
MYSQL_UID_FIELD '1001'
#vmail用户的UID
MYSQL_GID_FIELD '1001'
#vmail用户的GID
MYSQL_LOGIN_FIELD username
#认证账号字段
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir)
#concat是mysql的一个函数用来把/var/mailbox/跟homedir连接成一个路径(homedir是mysql的一个变量值为每一个用户名)
MYSQL_NAME_FIELD name
#用户全名字段,默认
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir)
#虚拟用户的邮件目录
Courier-authlib提供SysV服务脚本
[root@localhost ~]# cd /usr/src/courier-authlib-0.66.1/
[root@localhost courier-authlib-0.66.1]# cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
[root@localhost ~]# chmod 755 /etc/init.d/courier-authlib
[root@localhost ~]# chkconfig --add courier-authlib
[root@localhost ~]# chkconfig courier-authlib on
[root@localhost ~]# service courier-authlib start
Starting Courier authentication services: authdaemond

PS:可以使用pstree -a可以看到authdaemond已经生成了11个进程,我们开启了10个,但是有一个主进程负责生成其他进程。

建立虚拟用户邮箱目录
[root@localhost ~]# mkdir -pv /var/mailbox
[root@localhost ~]# chown -R vmail /var/mailbox

PS:邮箱目录属主为vmail

更改SASL认证模式为authdaemond

Postfix的SMTP认证需要透过Cyrus-SASL连接到authdaemon获取认证信息

[root@localhost ~]# vim /usr/lib64/sasl2/smtpd.conf
#pwcheck_method: saslauthd
#mech_list: PLAIN LOGIN
#注释前面实验使用SASL认证的参数
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
让Postfix支持虚拟用户及虚拟域
[root@localhost ~]# vim /etc/postfix/main.cf
#################Virtual Mailbox Settings###################
virtual_mailbox_base = /var/mailbox
#用户邮箱目录(跟这个参数MYSQL_HOME_FIELD定义的要一致)
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
#用来查询用户账号信息(这个配置文件中定义了SQL语句,使用extmail用户)
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
#用来查询虚拟域
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
#用来查询用户别名
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001
#每一个虚拟用户都映射为系统用户vmail
virtual_transport = virtual
#指定MDA专门为虚拟用户投递代理
virtual_mailbox_limit = 20971520
#磁盘配额
安装Httpd
[root@localhost ~]# yum install httpd
安装extman

需要使用源码extman目录下docs目录中的extmail.sql和init.sql建立数据库extmail

[root@localhost ~]# tar zxvf extman-1.1.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/extman-1.1/docs
[root@localhost docs]# service mysqld restart
[root@localhost docs]# mysql -u root < extmail.sql
[root@localhost docs]# mysql -u root < init.sql
[root@localhost docs]# mysql -u root -B -e "show databases;"
Database
information_schema
extmail
mysql
test

#对于MySQL-5.1以后版本,其中的服务脚本extmail.sql执行会有语法错误,因为MySQL-5.1使用的默认存储引擎是MyISAM,而在MySQL-5.1之后使用的是InnoDB存储引擎。可先使用如下命令修改extmail.sql配置文件而后再执行修改方法如下:

sed -i ‘s@TYPE=MyISAM@ENGINE=InnoDB@g’ extmail.sql

#这里我使用的是PRM包,所以MySQL是5.1版本的,不用修改SQL脚本。

这两个SQL脚本会创建extmail数据库和表,以及extmail、webman用户。所以需要授予用户extmail访问extmail数据库的权限(生产环境中extmail给select权限,因为它只需要检索用户即可)。同时这里的密码设置为extmail同上面的配置文件一样,不然都要改。

mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
mysql> flush privileges;
从Extman中复制Postfix支持虚拟用户和虚拟域及连接mysql的文件
[root@localhost ~]# cd /usr/src/extman-1.1/docs
[root@localhost docs]# cp mysql_virtual_mailbox_maps.cf /etc/postfix/
[root@localhost docs]# cp mysql_virtual_domains_maps.cf /etc/postfix/
[root@localhost docs]# cp mysql_virtual_alias_maps.cf /etc/postfix/
[root@localhost docs]# cp mysql_virtual_limit_maps.cf /etc/postfix/

打开一个文件看看

[root@localhost ~]# cat /etc/postfix/mysql_virtual_domains_maps.cf
user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = domain
select_field = domain
where_field = domain
additional_conditions = AND active = ‘1’

PS:所以在通过mysql认证配置文件/etc/authmysqlrc中的账号密码很多地方都要用到,生产环境中全部都要统一修改。

取消前面配置的中心域

使用虚拟域的时候,就需要取消中心域的使用,myhostname、mydomain、myorigin、mydestination,所以现在main.cf配置文件需要添加的参数如下所示:

[root@localhost ~]# vim /etc/postfix/main.cf
#################Center Domain Settings###########
mynetworks = 127.0.0.0/8
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#myhostname = smtp.ywnds.com
#mydomain = ywnds.com
#myorigin = $mydomain
#home_mailbox = Maildir/
配置Dovecot基于MySQL认证
[root@localhost ~]# vim /etc/dovecot/dovecot.conf
#Ssl = no
#disable_plaintext_auth = no
#mail_location = maildir:~/Maildir #把dovecot主配置文件/etc/dovecot/dovecot.conf中刚开始添加的几行数据注释掉 [root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mailbox/%d/%n/Maildir #添加此行指定邮件的提取位置
[root@localhost ~]# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
#开启明文验证(可以选择把dovecot.conf配置文件中的此参数关闭)
auth_mechanisms = plain login
#支持验证方法
#!include auth-system.conf.ext
#取消默认系统验证
!include auth-sql.conf.ext
#开启mysql验证
#auth_verbose = yes
#认证详细日志,调试可以打开
[root@localhost ~]# vim /etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-sql.conf
}
userdb {
driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-sql.conf
}

PS:在这个MySQL验证文件中指定了用户的账号和密码需要通过/etc/dovecot/dovecot-sql.conf这个文件去数据库中取。

[root@localhost ~]# vim /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir,uidnumber AS uid,gidnumber AS gid FROM mailbox WHERE username = '%u' 解释: Driver
#Dovecot使用自带的驱动连接MySQL Connect
#连接本地mysql;数据库extmail;用户extmail;密码extmail。
#说明:如果mysql服务器是本地主机,即host=localhost时,如果mysql.sock文件不是默认的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路径”来指定新位置;
#例如,使用通用二进制格式安装的MySQL,其sock文件位置为/tmp/mysql.sock,相应地,connect应按如下方式定义connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail。 Default_pass_scheme
#表明我们的密码为加密存放 Password_query
#找密码查询哪个字段 User_query
#找账号查询哪个字段
PS:dovecot其实也提供了这么一个配置文件模板,在/usr/share/doc/dovecot-2.0.9/example-config/dovecot-sql.conf.ext
启动所有服务
[root@localhost ~]# service dovecot restart
[root@localhost ~]# service postfix restart
[root@localhost ~]# service courier-authlib restart
[root@localhost ~]# service mysqld restart
测试虚拟用户
[root@localhost ~]# /usr/local/courier-authlib/sbin/authtest -s login postmaster@extmail.org extmail
Authentication succeeded.

Linux中Postfix虚拟用户及虚拟域(六)的更多相关文章

  1. 在linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  2. linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  3. 在Linux 中进入单用户模式的技巧

    在这篇简短的文章中,我们将向你介绍在 SUSE 12 Linux 中进入单用户模式的步骤.在排除系统主要问题时,单用户模式始终是首选.单用户模式禁用网络并且没有其他用户登录,你可以排除许多多用户系统的 ...

  4. linux中用户组和用户

    linux中用户组和用户 1.介绍 在我们的linux系统,有很多用户组,也可以手动创建用户组,不同的用户组下面有很多的用户. 2.创建用户组及有关的命令 groupadd phpzu:创建一个php ...

  5. Linux中Postfix邮件WebMail配置(七)

    Extmail Extmail 是一个以perl语言编写,面向大容量/ISP级应用,免费的高性能Webmail软件,主要包括ExtMail.Extman两个部分的程序套件.ExtMail套件用于提供从 ...

  6. Linux中Postfix邮件安装配置(二)

    本套邮件系统的搭建,从如何发邮件到收邮件到认证到虚拟用户虚拟域以及反病毒和反垃圾邮件等都有详细的介绍.在搭建过程中必须的参数解释以及原理都有告诉,这样才能更好地理解邮件系统. 卸载自带postfix ...

  7. Linux中组 与 用户的管理

    在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 一个用户可以在多个组里面,用这个命令可以将用户添加到组: add ...

  8. Linux中Postfix邮件原理介绍(一)

    邮件相关协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 工作在TCP的25端口.它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式 ...

  9. Linux中Postfix邮件发送配置(三)

    部署DNS服务器 postfix根据域名和地址做一个MX记录,A记录,PTR记录(一般在互联网上邮件服务器都要反解,没有PTR记录会认为是垃圾邮件) $ service iptables stop $ ...

随机推荐

  1. 浅谈SharePoint 2013 站点模板开发

    一直以来所接触的SharePoint开发,都是Designer配合Visual Studio,前者设计页面,后者开发功能,相互合作,完成SharePoint网站开发.直到SharePoint 2013 ...

  2. CodeForce 832A Sasha and Sticks

    A. Sasha and Sticks time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  3. hdu1540 Tunnel Warfare【线段树】

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  4. 0000python中文乱码解决方案

    #!/usr/bin/env python # coding=utf-8

  5. ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解

    感谢一路走来默默陪伴和支持的你~~~ ----------------欢迎来访,拒绝转载---------------- 关于GP模型的制作请点我! 一.GP发布 ArcGIS Desktop可以作为 ...

  6. Python日期格式化知识

    Python中日期格式化是非常常见的操作,Python 中能用很多方式处理日期和时间,转换日期格式是一个常见的功能.Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时 ...

  7. UITableView左右滑动cell无法显示“删除”按钮的原因分析

    http://www.cocoachina.com/bbs/read.php?tid-145693.html - (void)tableView:(UITableView *)tableView co ...

  8. 如果要写php扩展啥的, 要看什么?

    1.写PHP扩展并不难 有一定C语言基础即可.切记一定要在Linux平台下开发,不要用Windows 这里有一篇博文,可以看下http://rango.swoole.com/archives/152 ...

  9. PyQt5标准对话框

    很全的Qt的标准对话框,包含QInputDialog.QColorDialog.QFontDialog.QMessageBox.QOpenFileDialog... 全部是由官网的C++版本,转换成P ...

  10. usb设备运行不正常的解决方法(转)

    add by zhj:上午鼠标还用的好好的,下午就不能用了,插上之后提示“跟这台计算机连接的一个usb设备运行不正常”,尼玛,什么情况?我今天没安装软件啊,换了个USB接口也不行,在另一台电脑上试还是 ...