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

    配置文件:
        /etc/authmysqlrc
            提供通过mysql进行邮件账号认证的相关配置

        /etc/ahutdaemonrc


    0.安装相关依赖包:
        #yum -y install libtool-ltdl libtool-ltdl-devel expect perl-DBD-MySQL tcl tcl-devel libart_lgpl libart_lgpl-devel libtool-ltdl libtool-ltdl-devel

        libtool-ltdl包是一个动态模块加载器,有些程序依赖其加载某些模块,提供运行时环境。

        expect包提供主机间通讯

    1.编译安装:
        #tar xf courier-authlib-xxx.tar.bz2
        #cd coutier-authlib-xxx
        #./configure \
            --prefix=/usr/local/courier-authlib \
            --sysconfdir=/etc \
            --without-authpam \
            --without-authshadow \
            --without-authvchkpw \
            --without-authpgsql \
            --without-authsqlite \
            --with-authmysql \
            --with-mysql-libs=/usr/lib/mysql \
            --with-mysql-includes=/usr/include/mysql \
            --with-redhat \
            --with-authmysqlrc=/etc/authmysqlrc \
            --with-authdaemonrc=/etc/authdaemonrc \
            --with-mailuser=postfix \
            --with-mailgroup=postfix \
            --with-ltdl-lib=/usr/lib \
            --with-ltdl-include=/usr/includee
        #make
        #make install


        编译相关选项:根据具体情况选择。
            --prefix=/usr/local/courier-authlib
            --sysconfdir=/etc
            --without-authpam 不支持基于pam认证
            --without-authshadow 不支持基于shadow认证
            --without-authvchkpw 不支持基于vchkpw认证
            --without-authpgsql 不支持基于pgsql认证
            --without-authsqlite 不支持基于sqlitle认证
            --with-authmysql 基于mysql认证
            --with-mysql-libs=/usr/lib/mysql 指定mysql库文件路径
            --with-mysql-includes=/usr/include/mysql 指定mysql头文件路径
            --with-redhat 对redhat系统进行自动优化,其他系统不要使用此选项。
            --with-authmysqlrc=/etc/authmysqlrc 指定mysqlrc配置文件位置
            --with-authdaemonrc=/etc/authdaemonrc 指定守护进程配置文件位置
            --with-mailuser=postfix 指定邮件收发管理用户
            --with-mailgroup=postfix  指定用户组
            --with-ltdl-lib=/usr/lib 指定ltdl库位置,需要libtool-ltdl和libtool-ltdl-devel包
            --with-ltdl-include=/usr/include 指定ltdl头文件位置。需要libtool-ltdl和libtool-ltdl-devel包
            --with-authdaemonvar=/var/spool/authdaemon 指定套接字socket文件位置。不指定默认在/usr/local/courier-authlib/var/spool/authdaemon下

    2.复制sysv脚本:
        #cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
        #chmod 755 /etc/init.d/courier-authlib

    3.编译smtpd.conf文件
        #vim /usr/lib/sasl2/smtpd.conf
            pwchech_menthod: authdaemond 密码验证方式改为通过cuorier-authlib的服务,不在使用cryus-sasl服务。
            mech_list: PLAIN LOGIN
            authdaemond_path= /usr/local/courier-authlib/var/spool/authdaemon/socket 指定服务进程位置,使用socket(套接字)方式。

    4.设定socket文件夹权限及复制配置文件:
        #chmod 755 /usr/usr/local/courier-authlib/var/spool/authdaemon/
        #cp /etc/authdaemonrc.dist /etc/authdaemonrc
        #cp /etc/authmysqlrc.dist /etc/authmysqlrc

    5.配置authmysqlrc文件和authdaemonrc
        #vim /etc/authdaemonrc
            authmodulelist="authmysql" 指定认证模块
            ahtumodulelistorig="authmysql" 指定认证原始模块模块
            daemons=10 默认启动进程个数
            authdaemonvar=/usr/local/courier-authlib/var/spool/atuhdaemon 指定socket文件位置。若编译是没指定可以在此修改,注意文件夹要提前创建好。
            DEBUG_LOGIN=0 是否启用调试。0表示不启用,1表示启用,2表示启用同时记录密码。

        #vim /etc/authmysqlrc
            MYSQL_SERVER localhost mysql服务器的地址。localhost表示本机
            MYSQL_PORT 3306 mysql的监听地址
            MYSQL_USERNAME  extmail 指定连接mysql的账号。因为后边要用extman进行管理,extmail安装后默认用户为extmail。
            MYSQL_PASSWORD extmail 指定账号的密码      
            MYSQL_SOCKET  /var/lib/mysql/mysql.sock 指定mysql套接字位置。
            MYSQL_DATABASE  extmail 指定要使用的数据库
            MYSQL_USER_TABLE  mailbox 指定存放用户数据所在的表
            MYSQL_CRYPT_PWFIELD  password 指定用户密码字段
            MYSQL_UID_FIELD  '2525' 指定访问进程的uid,postfix的uid为2525。
            MYSQL_GID_FIELD  '2525' 指定访问进程的gid。
            MYSQL_LOGIN_FIELD  username 指定用户账号字段
            MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir) 指定用户家目录的位置。虚拟用户是没有家目录,所以和邮箱目录保持一致。contcat()是mysql的函数,作用是将括号内的内容连接起来。
            MYSQL_NAME_FIELD  name 指定用户名称的字段
            MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir) 指定用户邮箱目录的位置。

    6.配置main.cf让postfix支持虚拟域和虚拟用户:
        #vim /etc/postfix/main.cf
            ########################Virtual Mailbox Settings########################
            virtual_mailbox_base = /var/mailbox 指定用户邮件存放目录的路径
            virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf 用户邮箱的映射表,通过mysql方式访问指定文件行查找。该文件是查询语句的集合。
            virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf 虚拟域映射表,该文件由extman提供。
            virtual_alias_domains = 别名域
            virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf 别名映射表
            virtual_uid_maps = static:2525
            virtual_gid_maps = static:2525
            virtual_transport = virtual 指定另一个投递代理MDA

            ##########################QUOTA Settings######################## 配额相关
            message_size_limit = 14336000 邮件大小显示
            virtual_mailbox_limit = 20971520 邮箱大小限制


    7.创建邮箱目录及修改SMTP验证
        #mkdir -p /var/mailbox
        #chmod -R postfix /var/mailbox
        #vim /usr/lib/sasl2/smtpd.conf
            pwcheck_method: authdaemond
            log_level: 3
            mech_list: PLAIN LOGIN
            authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket


    8.使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库:
        # tar xf extman-xxx.tar.gz
        # cd extman-xxx/docs
        # mysql -u root -p < extmail.sql sql脚本(xxx.sql)可以使用 mysql < xxx.sql 输入重定向的方式执行。
        # mysql -u root -p < init.sql

        #mysql -uroot -p
        mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail'; 创建extmail用户并授权,密码为extmail,生产环境中最好只给SELECT权限。
        mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
        mysql> FLUSH PRIVILEGES;

        # cp mysql*  /etc/postfix/ 将指定的文件复制过去,若修改了账号、密码、库、表等信息,则要将这些文件中的密码的定义一并修改,保持一致。


        注意:若导入sql脚本报错,是因为脚本内对引擎的定义由TYPE变为ENGINE,所使用的引擎也不一样,所以需要对脚本进行修改。
            #sed -i 's@TYPE=MyISAM@ENGINE=InnoDB@g' extmail.sql

    9.修改main.cf文件,注释相关条目以启用虚拟域
        #vim /etc/postfix/main.cf
            #myhostname = MAILSERVERNAME.DOMAIN
            #myorigin = $mydomain
            #mydomain = DOMAIN
            #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, ns.$mydomain 或者你可以改为自己所需的。
            mynetworks = 127.0.0.0/8 只允许为本地中继。


    10.查看虚拟域,
        #mysql -uroot -p
        mysql> SHOW DATABASES;
        mysql> USE extmail; extmal数据库是通过sql脚本创建的。
        mysql> SHOW TABLES;
        mysql> SELECT * FROM domain\G 纵向显示domain表相关内容。此表中存放虚拟域相关的信息。
        
        后续可以通过extman添加虚拟域,比直接操作mysql方便。


    11.配置dovecot支持虚拟域和虚拟用户
        #vim /etc/dovecot.conf
            mail_location = maildir:/var/mailbox/%d/%n/Maildir 设定邮件的位置,%d表示域名,%n表示用户名。均为dovecot的自定义宏。
            auth default {
                mechanisms = plain 认证机制使用plain
                passdb sql { 使用sql方式认证
                    args = /etc/dovecot-mysql.conf 指定查询文件
                }
                userdb sql { 使用sql方式认证
                    args = /etc/dovecot-mysql.conf 指定查询文件
                }

        # vim /etc/dovecot-mysql.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'

            说明:如果mysql服务器是本地主机,即host=localhost时,如果mysql.sock文件不是默认的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路径”来指定新位置。
            例如编译安装mysql,mysql的socket默认在/tmp下,则host=/tmp/mysql.sock


        #systemctl restart dovecot