Linux中Postfix虚拟用户及虚拟域的示例分析

75次阅读
没有评论

共计 9335 个字符,预计需要花费 24 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要为大家展示了“Linux 中 Postfix 虚拟用户及虚拟域的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Linux 中 Postfix 虚拟用户及虚拟域的示例分析”这篇文章吧。

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 虚拟用户及虚拟域的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2024-02-04发表,共计9335字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)